您好我试图修复我的脚本错误。问题是我的获取查询仍然可以使用额外的字母。
所以,edit.php?id=1
有效,edit.php?id=1hello
也有效(显然它不应该)。发生了什么事?
$idtoedit = mysql_real_escape_string($_GET["id"]);
//Check if ID exists
$doesidexist = mysql_query("SELECT `id` FROM Data WHERE `id` = \"$idtoedit\"");
if (mysql_num_rows($doesidexist) == 0) {
die("<div class=\"alert alert-error\"><h4 class=\"alert-heading\">Error</h4><p>ID does not exist.</p><p><a class=\"btn btn-danger\" href=\"javascript:history.go(-1)\">Go Back</a></p></div></div></body></html>");
}
答案 0 :(得分:1)
这是因为在将字符串转换为数字时,MySQL对输入进行了“随时随地”的处理。
您构建的SQL查询将输入作为字符串传递(围绕它的"
)因此mysql将尝试将其转换为数字,如果{{1的左侧的列数字类型(示例中为=
列)。
查看this section of the manual以获取更多信息。
答案 1 :(得分:0)
mysql_real_escape_string
仅“清理”变量,因此在查询中使用它是安全的,但是它不会将其转换为整数,而且它不应该。您可以使用PDO和参数化查询来执行此操作,否则您必须自己手动编译,即
$idtoedit = (int) mysql_real_escape_string($_GET["id"]);
PDO示例:
$sth = $pdoObject->prepare('SELECT `id` FROM Data WHERE `id` = ?');
$sth->bindParam(1, $_GET["id"], PDO::PARAM_INT);
$sth->execute();
编辑:
没有真正回答你的问题,所以要澄清:
就像complex857所说的那样,MySQL会尝试根据列类型进行转换,因此转换1hello
会产生整数值1。