PHP / MySQL - 转义字符串的最佳用法和实践

时间:2012-07-13 21:32:05

标签: mysql string escaping

  

可能重复:
  Best way to prevent SQL Injection in PHP

进行查询时转义字符串的最佳方法是什么? mysql_real_escape_string()似乎不错,但我不知道如何正确使用它。

此代码是否能正常完成工作?

<?php
   /* Let's say that the user types "'#""#''"\{(})#&/\€ in a textfield */
   $newStr = mysql_real_escape_string($str);
   $query = "INSERT INTO table username VALUES ($str)";
   mysql_query($query);
?>

编辑:

现在我有了这段代码:

      $email = $_POST['email'];
    $displayName = $_POST['displayName'];
    $pass = $_POST['pass1'];

    $email = mysqli_real_escape_string($link, $email);
    $displayName = mysqli_real_escape_string($link, $displayName);
    $pass = mysqli_real_escape_string($link, $pass);

    $insert = "INSERT INTO profiles (email, displayName, password)
    VALUES ('$email', '$displayName', md5('$pass'))";
    mysqli_query($link, $insert)
    or die(mysqli_error($link));

但是我收到了这个错误: 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在“”附近使用正确的语法!#!#^!“#!”#!“#^''''''在第1行

如果用户输入: '**! “##!^!” #! “*#!” #^' '''

2 个答案:

答案 0 :(得分:7)

最好的方法是不要转义字符串,而是使用参数化查询,它会在幕后为你完成。

答案 1 :(得分:6)

使用mysql_real_escape_string就可以了,但您需要:

  • 在值周围添加引号。
  • 使用结果$newStr,而不是原始值$str
  • 将表名更改为非保留关键字的名称。
  • 在列列表周围添加括号。

试试这个:

$query = "INSERT INTO yourtable (username) VALUES ('$newStr')";

我还建议您检查mysql_query($query)的结果,如果有错误,您可以检查错误消息:

if (!mysql_query($query))
{
    trigger_error(mysql_error());
}

您还应该考虑使用MySQL的一个较新的接口。旧mysql_*函数为deprecated,不应在新代码中使用。