Mysql + php带有特殊字符,如'(撇号)和“(引号)

时间:2011-01-11 16:23:59

标签: php mysql sql apostrophe

我一直在努力解决一个小问题。它已存在多年,但这只是一个令人恼火的问题,而不是一个严重的问题,我刚刚解决它。但现在我想知道是否有人可以帮助我。我做了一些谷歌但没有成功。

如果我在这样的php文件中用html textarea做一个表单帖子:

<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>

当然还有提交按钮等等。

值是问题:<a href="http://google.com">google's site</a> textarea的值都有“(引号)和'(撇号)。

要将其保存在mysql_database中,我这样做:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());

现在我收到了mysql错误:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“站点”附近使用正确的语法

8 个答案:

答案 0 :(得分:19)

你的sql字符串是:

INSERT INTO `table` (`row1`) VALUES ('google's site')

这不是有效的陈述。正如Nanne写的那样,至少使用mysql_real_escape_string转义字符串:http://php.net/manual/en/function.mysql-real-escape-string.php

阅读有关sql注入的内容 http://en.wikipedia.org/wiki/SQL_injection

想一想:如果有人发布了这个帖子:$_POST['text'],其价值为:');delete from table;....

你可以对你的数据说再见:)。

始终过滤/转义输入!

编辑:从PHP 5.5.0开始,不推荐使用mysql_real_escape_string和mysql扩展。请使用mysqli扩展名和mysqli :: escape_string函数

答案 1 :(得分:9)

在将用户提供的值添加到数据库中时,始终至少使用mysql_real_escape_string。您应该查看绑定参数或mysqli,以便您的查询变为:

INSERT INTO `table` (`row1`) VALUES (?)

而且?在清理输入后,将被实际值替换。

在您的情况下使用:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());

阅读SQL注入。值得尽快做好准备!

答案 2 :(得分:3)

答案 3 :(得分:2)

你可以使用addslashes()函数。它用斜杠引用字符串。所以,当你在你的领域添加任何撇号时,它对你非常有用。

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());

答案 4 :(得分:1)

而不是使用旧的mysql *函数,使用PDO并编写参数化查询 - http://php.net/pdo

答案 5 :(得分:0)

当我在mysql中更新数据时,我也在苦苦思索角色。

但我终于找到了一个更好的答案,这是:

$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm

当您要更新数据库时,除非您使用MySQL REAL转义字符串,否则系统不会更新它。 这里:

$lastname = mysql_real_escape_string($_POST["lastname"]);  // This Works Always.

然后你的查询肯定会更新。

Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.

如需了解更多信息,请查看MYSQL_REAL_ESCAPE_STRING

希望这有助于

答案 6 :(得分:0)

只需使用准备好的语句,您就不必担心转义或sql注入。

$con = <"Your database connection">;
$input = "What's up?";
$stmt = $con->prepare("insert into `tablename` (`field`)values(?)");
$stmt->bind_param("s",$input);
$stmt->execute();

答案 7 :(得分:0)

如果你使用的是 php 版本 > 5.5.0 那么你必须像这样使用

data %>% 
ifelse (Q1 == 0) {
  mutate(Q2 = coalesce(Q2,0))
  }