在SQL调用中转义变量的引用

时间:2012-11-21 20:51:00

标签: php sql

如何在SQL语句中向变量添加单引号?如果我用'jeremy'代替'\ $ user'\ variable它就能完美运行。我无法弄清楚如何在SQL语句中转义变量的引用。谢谢你的帮助。

  $resultArticles = mysql_query("SELECT COUNT(id) FROM articleList WHERE user = '\$user'\ ");
  $totalArticlesLeaderboard = mysql_result($resultArticles, 0);
  echo "<strong>Total Articles: </strong>" . $totalArticlesLeaderboard;

4 个答案:

答案 0 :(得分:2)

我试图找到一个合适的问题副本,但我只发现了基于古代mysql_*函数的真实欺骗。 PHP社区(现在已经有一段时间)不再维护mysql_*函数(就像您正在使用的函数一样)并且已经开始deprecation process。请参阅red box

您应该尝试选择更好的PDOMySQLi。这两个选项都应该没问题。 Imho PDO有一个更好的API,但mysqli更倾向于mysql(在大多数情况下,PDO会做任何你想用它做的事情。)

使用两个“新”API,还有可能使用prepared statements。使用预处理语句,您不必担心在将值插入查询之前手动转义值。

使用PDO API的一个例子是:

$db = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $db->prepare('SELECT COUNT(id) FROM articleList WHERE user = :user');
$stmt->execute(array('user' => $user));

正如您所看到的,值未直接插入查询中,而是使用占位符。此代码将使人们无法在查询中注入任意SQL。此外,您不再需要进行任何转义。

如果您需要更多帮助来决定PDO或mysql,请查看the docs以及有关它的更多信息。如果您选择PDO,您可以找到关于here主题的好教程。

答案 1 :(得分:1)

测试此

$resultArticles = sprintf("SELECT COUNT(id) FROM articleList WHERE user='%s", 
mysql_real_escape_string($user));

答案 2 :(得分:0)

您应该可以删除转义字符:

$user = mysql_real_escape_string($user);
$resultArticles = mysql_query("SELECT COUNT(id) FROM articleList WHERE user = '$user'");

如果您遇到变量问题,您可以随时结束字符串并连接。我这样做经常是为了避免混淆:

$user = mysql_real_escape_string($user);
$resultArticles = mysql_query("SELECT COUNT(id) FROM articleList WHERE user = '".$user."'");

正如PeeHaa所说,请确保您尝试使用PDOMySQLi

不要忘记转义所有用户输入,否则它们可能会破坏您的数据库。如果您使用的是MySQLi,则可以使用mysqli::real_escape_string。清理所有用户数据绝对必要。不要跳过这个!

答案 3 :(得分:0)

如果变量$ user包含任何特殊字符,则必须转义这些字符,如第一个答案所示。如果您没有mysql_real_escape_string()函数,请使用addslashes()。