简单的PHP / MySQL语法错误,告诉“检查手册?”

时间:2011-08-19 05:21:36

标签: php mysql

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以获得在网站附近使用的正确语法。

mysql_query("UPDATE Scholarships2 SET Requirements2 = '$requirements2'
    WHERE scholarshipID = '$sID'")
        or die("Insert Error1: ".mysql_error());

我在这个主题上阅读了其他Stackoverflow问题/答案,但找不到我正在使用的保留字。

$ sID只是一个int,而$ requirements2是

$regex = '/<h4>Requirements<\/h4>([\n\n\n]|.)*?<\/table>/';
preg_match_all($regex,$data,$match);
$requirements2 = $match[0][0];

5 个答案:

答案 0 :(得分:1)

  

在网站附近使用正确的语法

这意味着它正在抱怨您的查询位's website。 “你的查询中的那个位置在哪里?”,我听到你问。

嗯,其中一个变量包含Bob's website之类的内容,以及你盲目地将其注入查询的事实会给你类似的东西:

UPDATE Scholarships2 SET Requirements2 = 'Bob's website' ...

这个特定的查询将与SQL解析器完美结合: - )

little Bobby Tables窃取或删除您的信用卡数据库时,不会立即阻止解析器的其他可能性也不会与您的客户群相关。

有关更全面的解释和避免策略,请参阅this link。在您的情况下,这可能涉及mysql-real-escape-string

换句话说,你需要这样的东西:

mysql_query(
    "UPDATE Scholarships2 SET Requirements2 = '" .
    mysql_real_escape_string($requirements2) .
    "' WHERE scholarshipID = '" .
    mysql_real_escape_string($sID) .
    "'"
) or die("Insert Error1: ".mysql_error());

顺便说一句,如果$sID只是一个整数(不受注入攻击),你可以删除它周围的引号。我不认为它与MySQL有关(因为它的“一切都是字符串”性质)但你的查询将无法移植到其他DBMS'。

答案 1 :(得分:0)

这取决于变量中的值 根据数据类型,您可以执行以下操作

$requirements2 = mysql_real_escape_string($requirements2); // escape string

$sID = (int)$sID; // force integer

问题是如果你的$ demand中有一个字符串,并且它包含一个引号',它将破坏你的sql语句。

以下是我经常组织代码的事情。

$sql = "UPDATE Scholarships2 SET Requirements2 = '%s'
        WHERE scholarshipID =%d";
$sql = sprintf($sql,
   mysql_real_escape_string($requirements2),
   (int)$sID
   );

答案 2 :(得分:0)

您是刚从POST或AJAX查询中获取表单字段吗?听起来你有一个包含's website的字符串。

确保通过mysqli_escape_string运行代码。

答案 3 :(得分:0)

问题是,您的$requirements2变量包含单引号(错误消息显示在's website附近时 - 可能是您插入的内容类似welcome to Sal's website)。当MySQL遇到这个字符时,它会把它解释为整个字符串的终止。

例如,如果您将短语Welcome to Sal's website替换为当前$requirements2所在的查询,则您的查询将如下所示:

UPDATE Scholarships2 SET Requirements2 = 'Welcome to Sal's website'

正如您所看到的,这会产生一个带引号的字符串Welcome to Sal,其余的字符串从末尾悬挂而不是任何东西的一部分。这就是错误抱怨的部分。

你真的需要切换到PDO和prepared statements,否则你会对这些类型的错误敞开大门,包括SQL注入,这是非常糟糕的事情

预备语句允许您使用可放置动态数据的占位符指定查询。然后,这个额外的数据在一个单独的函数中传递给PDO,PDO /数据库可以确定清理它的最佳方法,这样它就不会被误解为查询结构本身的一部分。

答案 4 :(得分:0)

你需要逃避$requirements2中的任何输入 你可以通过

来做到这一点
$req2=mysql_real_escape_string($requirements2);
mysql_query("UPDATE Scholarships2 SET Requirements2 = '$req2'
WHERE scholarshipID = '$sID'")
    or die("Insert Error1: ".mysql_error());

这将转义任何特殊字符,例如$requirements2

中的撇号