2011-08-19 69 views
0

您的SQL语法错误;请查看与您的MySQL服务器版本相对应的手册,以获取在网站附近使用的正确语法。简单的PHP/MySQL语法错误,告诉“检查手册?”

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

我读其他问题#1 /回答关于这个问题,但无法找到我使用的保留字。

$ SID只是一个int同时,$ requirements2是

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

你好SQL注入发现撇号的故事吗? '$ requirements2'从哪里来,它包含了什么?另外,我可以推荐你阅读[The Great Escapism](http://kunststube.net/escapism/)。 – deceze

+0

在你之前的问题中接受一些答案。而这个是微不足道的,你应该花一些时间在你问自己之前自己去搜索。 –

+0

'$ requirements2'和'$ sID'的值是什么? – sberry

回答

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中。

+0

啊。我陷入困境,非常感谢你,这很有道理。所以查询是逃避声明。感谢您的帮助。 – Eric

0

这取决于你在你的变量 根据此数据类型的值分别是你可以做什么

的问题是,如果你在你的$要求的字符串,它包含一个单报价'它会打破你的SQL语句。

这是我经常做的事来组织我的代码。

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

你只是从POST或AJAX查询中获取表单域?这听起来像你有一个字符串包含's website

确保你通过mysqli_escape_string运行你的代码。

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 /数据库可以确定清理它的最佳方式,以便它不会被误解为查询结构本身的一部分。

+0

你绝对正确。正如你所提到的那样,我一定会仔细研究与PDO的消毒联系。谢谢你指出我朝着正确的方向。 – Eric

+0

@Eric不客气。不幸的是,这种类型的错误非常常见,因此不要太在意。只需查看一下准备好的语句,然后阅读SQL注入以了解潜在的问题,这样您就不会将这些风险暴露给自己。快乐的编码。 – AgentConundrum

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

+0

完美。正是我在找什么。谢谢你,先生。 – Eric

+0

@Eric,很高兴知道,并且很高兴能够帮到:) –

+0

@Eric,你应该接受一个答案,以便其他看到这个问题的人知道你有一个解决方案,以及该解决方案是什么:) –