如何在MySQL数据库中存储包含引号的字符串?

时间:2010-04-19 07:18:46

标签: php sql mysql

我有下表:

$sql = "CREATE TABLE received_queries
    (
     sender_screen_name varchar(50),
     text varchar(150)
    )";

我使用以下SQL语句在表中存储值

$sql = "INSERT INTO received_queries VALUES ('$sender_screen_name', '$text')";

现在我尝试将以下字符串存储为“text”。

  

另一个#haiku:考虑棉毛;感觉就像睡觉一样无法治愈;   我需要一些咖啡。

我收到以下错误消息:

  

错误:您的SQL语法出错;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   接近'治愈;我需要一些咖啡。')'在第1行

我认为这一定是一个非常普遍的问题。我该如何解决?

5 个答案:

答案 0 :(得分:4)

我建议使用预处理语句(使用mysqli或pdo)而不是转义。

答案 1 :(得分:4)

请注意,将这样的SQL查询放在一起会带来潜在的安全风险。

更好的方法是使用预备语句。这基本上意味着将某些占位符放入您的SQL中,其中实际值(例如您的$sender_screen_name$text)将会出现。

我搜索了'net并想出了以下代码片段,显示了如何在PHP中完成预处理语句(对不起,如果这可能不是最好的PHP,我通常不用这种语言编写任何东西 - - 但我想它可以作为一个合理的起点):

$dbSelect = $objDb->prepare("INSERT INTO received_queries VALUES (:ssn, :text");

$dbSelect->bindParam('ssn', $sender_screen_name);
$dbSelect->bindParam('text', $text);

通过将查询作为预准备语句执行,您无需担心自己转义字符串。 PHP和RDBMS将自动为您处理。

答案 2 :(得分:3)

您可以使用mysql_real_escape_string

答案 3 :(得分:2)

您转义单引号\'。请参阅manual

One more #haiku: Cotton wool in mind; feeling like a sleep won\'t cure; I need some coffee.

答案 4 :(得分:2)

您永远不应该通过将字符串与用户输入连接来构建SQL。这会打开您的SQL注入攻击应用程序(想象一下当某人以'); delete from received_queries;的身份输入$text时会发生什么。)

因此,您应该始终使用DB框架(如PHP的DB),它允许您传递带占位符的字符串,然后传递带有值的数组。然后,框架将确保值不会造成任何伤害。