URL中的PHP/MySQL变量-文本被剥离,数字部分仅用于选择数据库记录

URL中的PHP/MySQL变量-文本被剥离,数字部分仅用于选择数据库记录,php,mysql,sql,Php,Mysql,Sql,我有一个SQL select语句,当它与URL中输入的变量值匹配时,它打算从MySQL数据库中选择数据,因此如果将?id=12附加到URL,它应该返回数据库行,其中id等于12 当我试图通过在URL中输入奇数值来打破脚本时,我遇到了一个奇怪的问题:如果用户在URL中输入一个数字,后跟一些文本,它将匹配URL中输入的字符串的数字部分,例如: ...index.php?id=12agsgs 将与id=12的记录相匹配,这不是预期的 如果文本出现在数字之前,则返回错误或空结果,如预期: ...ind

我有一个SQL select语句,当它与URL中输入的变量值匹配时,它打算从MySQL数据库中选择数据,因此如果将
?id=12
附加到URL,它应该返回数据库行,其中
id
等于12

当我试图通过在URL中输入奇数值来打破脚本时,我遇到了一个奇怪的问题:如果用户在URL中输入一个数字,后跟一些文本,它将匹配URL中输入的字符串的数字部分,例如:

...index.php?id=12agsgs
将与id=12的记录相匹配,这不是预期的

如果文本出现在数字之前,则返回错误或空结果,如预期:

...index.php?id=agsgs12
给空的或错误的

一切都很简单;获取变量的代码是:

if (isset($_GET['id'])) {
    $id = $dbConnect->real_escape_string($_GET['id']);
}
SQL选择代码为:

$sql = "SELECT * FROM `tablename` WHERE `id` = '$id'" ;
tablename
中的字段
id
是一个自动递增的整数索引字段。因此,输入
../index.php?id=12agsgs
将返回一个空结果

我是否错过了一些非常明显的东西?这看起来很奇怪,我无法理解发生了什么。我们将一如既往地感谢您的帮助

这是MySQL将
12agsgs
转换为一个数字(并得出12),因为它知道
id
列是数字。您可以通过执行
二进制
比较使其停止:

SELECT * FROM `tablename` WHERE BINARY `id` = '$id'

当其中一个操作数是数字时,MySQL将字符串转换为数字。它被称为并包含在手册中


你可以在这个简单的

很好的例子中看到这一点——问题一秒钟就解决了。如果不是很明显的话,至少是我的错,而且很简单。谢谢你,安德烈亚斯-两个答案都很好,但当埃德给出代码时,我已经将他的标记为接受。