我刚刚注意到,如果我像这样做一个MySQL请求:
SELECT 1 FROM myTable WHERE id = 'asdf'
然后将字符串'asdf'转换为0
。
这意味着我有一个标识为0
的记录,这将匹配。
id
字段的格式为int(8).
最佳方式是:
0
的记录吗? (坏)答案 0 :(得分:4)
只需编写您的查询,以便他们不会使用数字字段,就好像它们是文本字段一样。
如果id
是数字字段,那么您的where
子句永远不会有用。是的,如果MySQL主动抱怨它会很好 - 但从根本上说,你不应该编写运行错误查询的代码。
该查询是如何进入您的系统的? 'asdf'
部分是直接用户输入吗?你可以使用参数化的SQL吗?
如果您真的打算查询数字字段,则应确保输入首先是数字。将文本转换为调用代码中的整数,数据库中不。
答案 1 :(得分:2)
您必须首先通过PHP清理输入。
$id = 'asdf';
if(is_numeric($id)){
$query("SELECT 1 FROM myTable WHERE id = $id");
}else{
die("ID is not numeric");
}
或者你可以这样做:
SELECT 1 FROM myTable WHERE id = 'asdf' AND 'asdf' REGEXP '^-?[0-9]+$'
这会导致正则表达式为= false,导致没有行返回。
答案 2 :(得分:1)
由于pdo预处理语句与正确类型的绑定不会引发任何错误(mysql strict mode is enabled除外),您唯一的选择是确保并控制php中变量的类型以“纠正”这些变量的允许性语言。
[感谢评论员]