Php PDO查询绑定字符串而不是整数返回结果

Php PDO查询绑定字符串而不是整数返回结果,php,mysql,pdo,Php,Mysql,Pdo,我有一个带有和自动递增id的表,在测试一些场景时,我偶然发现了一个问题,即PDO或mysql在数组中似乎将字符串转换为整数。有人知道为什么吗 如果我的问题如下: $check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id"); $check->execute(array(':id'=>1)); $check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id")

我有一个带有和自动递增id的表,在测试一些场景时,我偶然发现了一个问题,即PDO或mysql在数组中似乎将字符串转换为整数。有人知道为什么吗

如果我的问题如下:

$check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id");
$check->execute(array(':id'=>1));
$check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id");
$check->execute(array(':id'=>'1 OR id > 0'));
它检索1条记录-都很好,但是如果查询使用的字符串是设计或错误导致的,如下所示:

$check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id");
$check->execute(array(':id'=>1));
$check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id");
$check->execute(array(':id'=>'1 OR id > 0'));
它仍然检索id为1的记录


肯定什么也找不到?我知道我不应该允许第二种情况发生,但为什么PDO/mysql要将字符串转换为整数,以及它是如何进行的?

这是因为
执行
创建类似这样的东西:
从tbl_测试中选择*,其中id='1或id>0'

$check = $db->prepare("SELECT * FROM tbl_test WHERE id=:id OR id>:id2");
$check->execute(array(':id'=>'1', ':id2' => 0));
或者只是

$check = $db->prepare("SELECT * FROM tbl_test WHERE id>:id");
$check->execute(array(':id'=>'0'));

不管好坏,MySQL都是这样设计的:

mysql> SELECT CASE
    -> WHEN 123='123 pink elephants' THEN 'Equal'
    -> ELSE 'Different' END
    -> AS 'How are they?';
+---------------+
| How are they? |
+---------------+
| Equal         |
+---------------+
1 row in set, 1 warning (0.00 sec)
但是,正如您所看到的,它会触发一个警告:

mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '123 pink elephants' |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

通过准备好的语句和占位符,数据库知道需要适合列类型的值。我希望它看到您的数字id列,并将“1或id>0”强制转换为一个数字-因此您只需得到1。

这是MySQL在字符串到整数转换中的错误/疏忽。当给定不正确的整数文本时,它不会引发错误,而只是发出警告

mysql> select '1'+0;
+-------+
| '1'+0 |
+-------+
|     1 |
+-------+
1 row in set (0,00 sec)

mysql> select '1 hello world'+0;
+-------------------+
| '1 hello world'+0 |
+-------------------+
|                 1 |
+-------------------+
1 row in set, 1 warning (0,00 sec)

mysql> show warnings;
+---------+------+---------------------------------------------------+
| Level   | Code | Message                                           |
+---------+------+---------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '1 hello world' |
+---------+------+---------------------------------------------------+
1 row in set (0,00 sec)

非常感谢。有趣的是,即使我绑定一个参数并使用'PDO::PARAM_INT',也没有什么区别——只是发出了一个警告。我很惊讶地发现当你试图用
PDO::PARAM_INT
绑定字符串时,
bindParam
也没有引发异常。。。似乎它遵循PHPs通用字符串>整数转换规则。。。。实际上,
bindParam
甚至没有像我想的那样:(做了进一步的挖掘,并在被指出时删除了我的错误答案)@user2875878weeell。。。这是PHP。任何希望PHP在类型上做正确的事情的人都在吸毒…@peufeu然而,在这种情况下,它的行为与MySQL()完全相同,并且并不比JavaScript()更疯狂。