即使使用mysql_real_escape_string,php字符串中的单引号也会破坏sql语句

时间:2013-01-12 14:23:31

标签: php html mysql sql

我有一个博客文章的表格,每当我有一个单引号(例如那个)sql插入代码中断。我尝试过使用mysql_real_escape_string

$Description = mysql_real_escape_string($_POST['Description']);

但这不起作用。我也尝试使用htmlspecialchars()但是对于这些帖子我需要能够使用html代码添加链接和图像。 我更新了sql代码,就像一个指导说要做,但我仍然没有工作。我可以更新它,如果没有单引号所以代码确实有效,但单引号导致很多麻烦

        $SQL = "UPDATE Posts SET Title = '$Title',LinkTitle = '$LinkTitle',MainPicture = '$MainPic',Description ='".$Description."',Maintext = '$Main',Type = '$SubCategory',Featured = '$Featured' 
    ,category = '$Category',thumbnail='$thumb'
    WHERE ID = '$id'";

修正 感谢Gaucho的解决方案问题是我使用mysqli连接到数据库。将连接代码更改为正常mysql_connect修复了问题

3 个答案:

答案 0 :(得分:0)

你应该使用准备好的语句,PDO使这很容易。那你就不需要引号了。

答案 1 :(得分:0)

作为旁注,如果值( s )来自外部,则查询容易被SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

答案 2 :(得分:0)

使用此代码,使用您的数据库名称和密码,并报告您获得的错误。 mysql_real_escape_string不是查询中的问题,因为在我的情况下它运行正常。让我们知道你的php和mysql版本。

 <?php
 //connect to your database
 mysql_connect("localhost","yourDBuserName","yourDBpassword");
 //specify database
 mysql_select_db("yourDBname") or die;
 //Build SQL Query
 $Description = mysql_real_escape_string("that's amore");
 $query = "select * from Posts where Description ='" . $Description . "'";
 $queryResult=mysql_query($query);
 if (!$queryResult) {
   $message  = 'Invalid query: ' . mysql_error() . "\n";
   $message .= 'Whole query: ' . $query;
   die($message);
 }  
 die ($queryResult);   
 ?>

我甚至建议您使用PhpEd调试代码。 注意:我的样本中的mysql_real_escape_string的结果是“那个更糟糕的”。 任何不以Invalid开头的回显字符串表示问题正常运行。 注意2:这是连接服务器的正确方法。

编辑:如果你想使用mySqli连接,请使用以下代码进行连接,因为你是以错误的方式进行连接:

 $mysqli = @new mysqli('yourDBaddress', 'yourDBuserName', 'yourDBpassword', 'yourDBname');

 if ($mysqli->connect_errno) {
   die('Connect Error: ' . $mysqli->connect_errno);
 }