在 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 插入中转义单引号不起作用的主要内容,如果未能解决你的问题,请参考以下文章