在 PHP/MySQL 插入中转义单引号不起作用

Posted

技术标签:

【中文标题】在 PHP/MySQL 插入中转义单引号不起作用【英文标题】:Escaping single quotes in PHP/MySQL insert not working 【发布时间】:2012-07-02 16:04:08 【问题描述】:

我正在尝试使用 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);
    
);

编辑:感谢您提供的所有 cmets 和建议。我使用的一个临时解决方案是在将字符串传递给 PHP 脚本之前,在客户端用反斜杠替换单引号的所有实例。然后在 PHP 或 JavaScript 中检索时将其切换回单引号。

【问题讨论】:

$result 声明的对象是什么? 添加die("Error: " . mysql_error());,看看你的查询是否有问题。 绕过很多未来的痛苦,习惯于用单引号而不是双引号来声明字符串。所以在这种情况下你可以做$query = 'insert into Tory (Content) values("'.$tweet.'")'; 进行调试,回显$tweet,以确保您传递的是转义字符串。如果转义正确,那么问题出在你的mysql,可能是你的字符集。 您如何知道表中的数据已被截断?你如何检索数据来检查它?问题可能出现在检索过程中,而不是在插入过程中。 【参考方案1】:

在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】:

如果您将 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

【讨论】:

【参考方案3】:

替换:

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

与:

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

【讨论】:

记得保存$link:$link = mysql_query($query)。反对不鼓励的mysql_* 支持PDO/mysqli 函数的标准免责声明适用。【参考方案4】:

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

解决方案

原来我的字符串中的单引号是智能引号,即花引号而不是直引号。

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

通过此函数传递要存储的每个字段/单元格值/列值,以将弯引号和破折号等智能字符转换为直引号和连字符等 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); 

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

【讨论】:

谢谢 - 这真的很有帮助!我最终做了类似的事情,但这更彻底!

以上是关于在 PHP/MySQL 插入中转义单引号不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL,如何在字符串中转义单引号?

PL/SQL,如何在字符串中转义单引号?

如何在 MySQL 中转义单引号

如何在 Presto 中转义单引号?

如何在 JavaScript 中转义单引号 ( ' )? [复制]

在 SQL Server 中转义单引号