URL 中的 PHP/MySQL 变量 - 文本被删除,数字部分仅用于选择数据库记录
Posted
技术标签:
【中文标题】URL 中的 PHP/MySQL 变量 - 文本被删除,数字部分仅用于选择数据库记录【英文标题】:PHP/MySQL variable in URL - text being stripped out and numerical part only used in selecting database records 【发布时间】:2013-06-13 17:08:42 【问题描述】:我有一个 SQL 选择语句,当它与 URL 中输入的变量值匹配时,它旨在从 mysql 数据库中选择数据,因此如果将 ?id=12
附加到 URL,它应该返回 id
所在的数据库行等于 12。
当我试图通过在 URL 中输入奇数值来破坏脚本时,我遇到了一个奇怪的问题:如果用户在 URL 中输入数字后跟一些文本,它会匹配输入的字符串的数字部分网址,例如:
...index.php?id=12agsgs
将匹配id = 12
所在的记录,这不是预期的。
如果文本出现在数字之前,则返回错误或空结果,如预期的那样:
...index.php?id=agsgs12
给出空或错误。
一切都很简单; GET
变量的代码是:
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
应该返回一个空结果。
我是否遗漏了一些非常明显的东西?这似乎很奇怪,我无法理解正在发生的事情。任何帮助都将一如既往地感激不尽!
【问题讨论】:
【参考方案1】:那是 MySQL “有用”地将 12agsgs
转换为您的数字(并得出 12),因为它知道 id
列是数字。您可以通过进行BINARY
比较来使其停止:
SELECT * FROM `tablename` WHERE BINARY `id` = '$id'
【讨论】:
优秀 - 问题在几秒钟内解决。这是,如果不是很明显,至少是我的错而且非常基本。【参考方案2】:当操作数之一是数字时,MySQL 会将字符串转换为数字。它被称为type conversion,在手册中有介绍。
你可以在这个简单的fiddle实践中看到这一点
【讨论】:
谢谢,安德烈亚斯 - 两个答案都很好,但正如 Ed 给出的代码,我已将他的代码标记为已接受。以上是关于URL 中的 PHP/MySQL 变量 - 文本被删除,数字部分仅用于选择数据库记录的主要内容,如果未能解决你的问题,请参考以下文章
PHP + MySQL,无法在新选项卡中打开数据库 URL [重复]
从 PHP 变量中的 GeoLocation 访问用户 lat/lng