3

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

4 回答 4

3

在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);
于 2014-12-10T12:37:29.937 回答
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
于 2012-07-03T01:36:46.113 回答
0

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

解决方案

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

运行下面的函数后(感谢 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); 
}

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

于 2012-07-24T10:00:47.520 回答
0

Replace:

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

With:

mysql_query($query);
if(mysql_errno() != 0)
  die(mysql_error());
于 2012-07-02T16:15:42.757 回答