0

我得到了这个不起作用的查询,我不知道它是什么。我正在写一封电子邮件活动脚本。这是网址;

http://www.example.com/activate.php?id=1&h=secretkey1

这就是它的activate.php样子;

<?php
require "inc/connect.php";

$id = (int)$_GET['id'];
$hash = mysql_real_escape_string($_GET['h']);

$sql = mysql_query("SELECT id, h, active FROM tablename WHERE id=$id AND key=$hash") or die(mysql_error());  
$row = mysql_fetch_array($sql);

if ($row['active'] == "1") {
    echo "error!";
}
elseif ($row['active'] == "0") {
    mysql_query("UPDATE tablename SET active=1 WHERE id='$id' AND key='$hash'");
}
?>

这是我得到的错误;

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“key=secretkey1”附近使用正确的语法

在我的数据库中,我有一个测试字段tablename

id /    key    / active
------------------
1 / secretkey1 / 0
4

2 回答 2

3

两个原因:

1)因为您需要将secretkey1(内部$hash)括在单引号中,因为它是一个字符串,并且字符串必须是单引号。$id不需要引用,因为您已将其转换为整数。

2)KEYMySQL 保留关键字,必须用反引号括起来才能用作表名或列名:

$sql = mysql_query("SELECT id, h, active FROM tablename WHERE id=$id AND `key`='$hash'") or die(mysql_error()); 

我还注意到您正在id, h, active查询中进行选择,但您的示例表有一个名为 的列key,而不是h(除非我们没有看到该列)。

于 2012-07-27T13:24:15.043 回答
2

你有这个:

 key=$hash

那应该是:

 key='$hash'

顺便说一句,尽可能使用参数化查询来防止sql注入攻击。

使用 PDO:

如何防止 PHP 中的 SQL 注入?

PDO 准备好的语句是否足以防止 SQL 注入?

于 2012-07-27T13:24:10.153 回答