URL中的PHP/MySQL变量-文本被剥离,数字部分仅用于选择数据库记录
我有一个SQL select语句,当它与URL中输入的变量值匹配时,它打算从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
?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将字符串转换为数字。它被称为并包含在手册中
你可以在这个简单的很好的例子中看到这一点——问题一秒钟就解决了。如果不是很明显的话,至少是我的错,而且很简单。谢谢你,安德烈亚斯-两个答案都很好,但当埃德给出代码时,我已经将他的标记为接受。