我刚刚注意到,如果我执行这样的 MySQL 请求:
SELECT 1 FROM myTable WHERE id = 'asdf'
然后字符串 'asdf' 被强制转换为0
. 这意味着我有一条带有 id 的记录,0
这将匹配。该id
字段的格式是int(8).
最好的方法是什么:
- 我需要检查(例如通过 PHP)我的值是否仅为数字?
- 有一种 MySQL 方法可以做到这一点吗?
- 我必须用 id 删除我的记录
0
吗?(坏的)
只需编写您的查询,这样它们就不会像使用文本字段一样使用数字字段。
如果id
是数字字段,那么您的where
子句永远不会有用。是的,如果 MySQL 主动抱怨它会很好——但从根本上说,你不应该编写一开始就运行错误查询的代码。
该查询是如何进入您的系统的?该'asdf'
部分是直接用户输入吗?您可以改用参数化 SQL 吗?
如果您真的打算查询数字字段,则应首先确保您的输入是数字。在调用代码中将文本转换为整数,而不是在数据库中。
您必须首先通过 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,导致没有行返回。
由于与正确类型绑定的 pdo 准备语句不会引发任何错误(除非启用了 mysql 严格模式),因此您唯一的选择是确保和控制 php 中的变量类型以“纠正”这些语言的许可性。
[感谢评论员]