我正在尝试使用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中检索时将其切换回单引号。
答案 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);
}
就像我说的那样,不确定这是否会直接帮助你解决问题,但未来可能会帮助你和其他人!