Php Mysql WHERE或WHERE以整数开头

Php Mysql WHERE或WHERE以整数开头,php,mysql,Php,Mysql,为什么 $query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1"; `id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255) 为什么查询结果如此奇怪,我认为图像是自我解释的,但我也需要一些词,所以在这里,当用户搜索时dcm2@example.com或者不存在任何其他内容,没有结果,但如果字符串以数字开头并搜索主键,则如果我搜索,它会

为什么

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
为什么查询结果如此奇怪,我认为图像是自我解释的,但我也需要一些词,所以在这里,当用户搜索时dcm2@example.com或者不存在任何其他内容,没有结果,但如果字符串以数字开头并搜索主键,则如果我搜索,它会将字符串转换为整数2dcm1@example.com,ID 2返回,有什么好的解释吗?为什么会这样

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)

这是因为每当运算符与不同类型的操作数一起使用时(假设您的
id
是整数列),MySql都会自动转换类型

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
见:

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式进行的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
以及以下示例(从文档中复制):

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
不幸的是,似乎没有防止这种行为的配置(至少对于
SELECT
语句)。可能有效的方法是对
id
列进行显式强制转换:

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
mysql> SELECT CAST(6 AS CHAR) = '6x';
        -> 0
mysql> SELECT CAST(6 AS CHAR) = 6;
        -> 1

但这看起来仍然很奇怪,因为它强制对整型列进行字符串比较。更好的方法可能是在php代码中处理此类情况(如注释中所指出)。

警告:这有一些严重问题,因为查询中使用了
$\u GET
数据。尽可能使用事先准备好的陈述。在任何用户提供的数据都指定有
:name
指示符的情况下,这些操作非常简单,稍后将根据您使用的是哪个指示符,使用
绑定参数或
执行
填充指示符。永远不要把
$\u POST
$\u GET
或任何用户数据直接放在你的查询中。我使用PDO,让用户只搜索结果,不要在本例中插入,但我只是尝试解释一下,所以我写了这篇文章。它分散了你的注意力。只要有可能,就让占位符保持原样。好消息是这些密码看起来被正确地散列了,所以你已经锁定了那个部分。列电子邮件的类型是什么?列电子邮件的varchar(255)知道如何防止吗?告诉mysql不要猜测变量?您可以尝试执行显式的
CAST
,这样mysql就不会在两个参数上隐式地为您执行操作……或者在PHP端,在将其传递给mysql之前对其进行转换:
is_int($search)$搜索:0
(假设0从来都不是有效的ID)谢谢,真的增加了我对php/mysql的了解bit@user259752您正在传递一个字符串变量以与整数进行比较。首先删除引号,然后可以使用CONCAT检查完整整数$query=“从
用户中选择*”,其中(
id
=$search和CONCAT(“”,$search*1)=$search)或
email
='$search'限制1”;
$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)