在PHP / MySQL插入中转义单引号无法正常工作

时间:2012-07-02 16:04:08

标签: php mysql

我正在尝试使用JavaScript / Ajax和PHP的组合将字符串插入MySQL表。在使用Ajax将所需的(JavaScript)字符串传递给PHP脚本之后,我尝试使用PHP将其插入到表中。

PHP脚本正在运行,但只要遇到单引号('),插入就会停止。我已尝试以各种组合使用mysql_real_escape_string(),addslashes(),htmlentities()和str_replace(),尝试使用魔术引号打开和关闭,无论如何,单引号都无法处理。我只想保留它们或让它们正确地转义但是没有任何东西对我有用 - 字符串本身来自推文所以我想知道是否有一些编码冲突导致了这个?如何克服这一点的任何建议将不胜感激。

例如,为了更好地说明,如果我将此字符串传递给PHP脚本:

保证我不会投票

然后在使用上述任何方法清理字符串并插入MySQL表之后,它总是会出现在MySQL表中:

答应我,你赢了

这是我的php代码:

include("dbconnect.php"); //connect to DB
$tweet = mysql_real_escape_string($_POST['tweet']); //escape the string

if($tweet != '') { //check it's not empty

$query = "insert into Tory (Content) values('$tweet')"; //insert statement

$link = mysql_query($query);
if (!$link) {
  echo "3";
  die($result);
}
echo "<p>".$tweet."</p>"; //for Ajax callback
}

这是Javascript / Ajax代码:

$.ajax({  
    type: 'POST',  
    url: 'buildTable.php', //previous php code
    data: "tweet=" + content, //content is the tweet string as javascript var
    success: function(thetweet) {
         $(document.body).append(thetweet);
    }
});
编辑:感谢您提供的所有意见和建议。我使用的临时解决方案是在将字符串传递给PHP脚本之前,在客户端使用反斜杠替换单引号的所有实例。然后在PHP或JavaScript中检索时将其切换回单引号。

4 个答案:

答案 0 :(得分:2)

如果您使用mysqli或PDO准备好的语句,则可以轻松避免整个转义事件。无论如何,mysql_*函数已被弃用,因此这将是切换的绝佳机会。

你的代码就像(PDO,使用你的代码):

$query = "insert into Tory (Content) values (:tweet)";
$stmt = $db->prepare($sql);    // $db being your PDO object
$stmt->execute(array(':tweet' => $_POST['tweet']));    // assuming you are not verifying the tweet somewhere else

答案 1 :(得分:2)

在mysql中插入带单引号(')或双引号(")的字符串

只需在广告插播中使用addslashes();,然后使用stripslashes();获取抓取数据。

$str = "Hello Friend's.. Hows you all"s.";
// Outputs: Hello Friend\'s..Hows you all\"s.
echo addslashes($str);

stripslashes - 使用addslashes()引用的取消引用字符串。返回带有反斜杠的字符串。 (\'变为',依此类推。)双反斜杠(\\)组成一个反斜杠(\)。

$str = "Hello Friend\'s.. Hows you all"s."; // Outputs: Hello Friend's.. Hows you all"s.
echo stripslashes($str);

现在我们来到这一点。如果我们使用单引号或双引号将字符串插入数据库,如下所示:

$str = “Hello Friend's.. Hows you all"s.”;
$query = “INSERT INTO tbl (description) VALUES (‘$str’)”;

这将发生错误,但如果我们使用如下所示的addslashes($str)函数然后插入数据库,则不会发生错误。

$str = “Hello Friend's.. Hows you all"s.”;
$desc_str = addslashes($str);
$query = “INSERT INTO tbl (description) VALUES (‘$desc_str’)”;

类似地,我们可以使用stripslashes($str)打印该表字段值,如下所示:

echo stripslashes($str);

答案 2 :(得分:0)

替换:

$link = mysql_query($query);
if (!$link) {
  echo "3";
  die($result);
}

使用:

mysql_query($query);
if(mysql_errno() != 0)
  die(mysql_error());

答案 3 :(得分:0)

我不确定这是否相关,我知道它有点晚了,但我在尝试创建CSV文件时遇到了类似的问题。我无法理解为什么我的单引号没有被转义。

原来我的sring中的单引号是明智的引号,即引号不是直引号。

运行下面的函数(Thanks to Chris Shiflett)后,我的引号被转换,我的转义问题已解决。

传递要通过此函数存储的每个字段/单元格值/列值,以将诸如引号和emdash之类的智能字符转换为HTML实体,如直引号和连字符

$smart_string = "String containing smart quotes";
$safe_string = convert_smart_quotes($smart_string);

function convert_smart_quotes($string) 
{ 
    $search = array(chr(145), 
                    chr(146), 
                    chr(147), 
                    chr(148), 
                    chr(151)); 

    $replace = array("'", 
                     "'", 
                     '"', 
                     '"', 
                     '-'); 

    //return string with smart characters replaced by html safe characters
    return str_replace($search, $replace, $string); 
}

就像我说的那样,不确定这是否会直接帮助你解决问题,但未来可能会帮助你和其他人!