5

我刚刚注意到,如果我执行这样的 MySQL 请求:

SELECT 1 FROM myTable WHERE id = 'asdf'

然后字符串 'asdf' 被强制转换为0. 这意味着我有一条带有 id 的记录,0这将匹配。该id 字段的格式是int(8).

最好的方法是什么:

  • 我需要检查(例如通过 PHP)我的值是否仅为数字?
  • 有一种 MySQL 方法可以做到这一点吗?
  • 我必须用 id 删除我的记录0吗?(坏的)
4

3 回答 3

4

只需编写您的查询,这样它们就不会像使用文本字段一样使用数字字段。

如果id是数字字段,那么您的where子句永远不会有用。是的,如果 MySQL 主动抱怨它会很好——但从根本上说,你不应该编写一开始就运行错误查询的代码。

该查询是如何进入您的系统的?该'asdf'部分是直接用户输入吗?您可以改用参数化 SQL 吗?

如果您真的打算查询数字字段,则应首先确保您的输入是数字。在调用代码中将文本转换为整数,而不是在数据库中。

于 2012-06-11T15:56:39.400 回答
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,导致没有行返回。

于 2012-06-11T15:58:48.063 回答
1

由于与正确类型绑定的 pdo 准备语句不会引发任何错误(除非启用了 mysql 严格模式),因此您唯一的选择是确保和控制 php 中的变量类型以“纠正”这些语言的许可性。

[感谢评论员]

于 2012-06-11T15:58:11.340 回答