我应该使用mysqli_real_escape string()或mysql_real_escape_string()来表单数据吗?

use*_*766 11 php mysql mysqli mysql-real-escape-string

可能重复:
mysql_escape_string VS mysql_real_escape_string

我需要在我的mysql数据库中输入company_name(由用户通过表单给出).我用的时候

$company = mysqli_real_escape_string($_POST['company_name'])
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in     /opt/lampp/htdocs/Abacus-Version-2/admin/Company/insert_company.php on line 58
Run Code Online (Sandbox Code Playgroud)

但是使用时一切似乎都很好

$company = mysql_real_escape_string($_POST['company_name'])
Run Code Online (Sandbox Code Playgroud)

在这种情况下我该怎么办?

Ans*_*shu 12

要使用的一个取决于您使用的是MySQLi扩展名还是MySQL扩展名

// procedural mysqli 
$db = new mysqli; 
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')", 
   mysqli_real_escape_string($db,$name), 
   mysqli_real_escape_string($db,$email), 
   mysqli_real_escape_string($db,$comment) ); 

// mysql 
$conn = mysql_connect(); 
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')", 
   mysql_real_escape_string($name,$conn), 
   mysql_real_escape_string($email,$conn), 
   mysql_real_escape_string($comment,$conn) );  
Run Code Online (Sandbox Code Playgroud)

  • "如果你愿意,你可以用脚开车,这不是一个好主意." - 克里斯洛克 (4认同)
  • 再一次,不!`mysql_*`现在不能用. (2认同)
  • @Jeffrey Nope,开发人员如果愿意,可以免费使用mysql_*.如果在5.5+中使用它,它只会生成E_DEPRECIATED警告.你的原始观点"不能使用"是不正确的 - 使用它们是不可取的. (2认同)

Luk*_*uke 9

mysql_real_escape_string()旨在使数据安全,无需错误地插入数据库.(IE,例如转义斜杠,这样它就不会破坏你的代码).

您应该使用mysql_mysqli_函数来匹配您的连接字符串."mysqli"是面向对象实现的mysql函数集,因此函数在面向对象的样式中被调用."mysql"是程序性的.我建议改用"mysqli",因为我相信在未来的版本中有人讨论过"mysql"功能的贬值.

如果连接字符串是:

mysql_connect()
Run Code Online (Sandbox Code Playgroud)

然后使用:

mysql_real_escape_string($_POST[''])
Run Code Online (Sandbox Code Playgroud)

如果是:

$mysqli = new mysqli();
Run Code Online (Sandbox Code Playgroud)

然后使用:

$mysqli->real_escape_string($_POST[''])
Run Code Online (Sandbox Code Playgroud)

  • @YourCommonSense哦,是吗?这是为什么在手册中陈述它??? "在unescaped_string中转义特殊字符,考虑到连接的当前字符集,以便将它放在mysql_query()中是安全的." http://php.net/manual/en/function.mysql-real-escape-string.php快乐阅读! (3认同)

Ste*_*fan 0

两种变体都很好*(请查看我的更新)。

当您使用 thenmysql_connect时,您应该坚持mysql_real_escape_string()并传递连接句柄。

当您使用 amysqli_connect时,您应该坚持使用mysqli_real_escape_string()

更新

正如 Jeffrey 在评论中指出的那样,使用mysql_函数是不行的。我同意这一点。我只是指出,您需要使用您正在使用的 MySQL 扩展所使用的函数。

我发现问题不是使用哪个 MySQL 扩展,而是使用哪个函数来转义数据。

如果你问我:

  • 使用mysqliPDO,因为mysql不推荐且已弃用。
  • 将连接句柄传递给转义函数或更好的函数
  • 使用准备好的语句PDO-Style