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

Javascript PHP/MySQL - 将数据库中的行值插入文本字段

从 PHP 中的文本中提取 URL

斜体字符在文本框中的底部被切断

来自 Wordpress 中文本文件的 jQuery iFrame 变量