12

可能重复:
mysql_escape_string VS mysql_real_escape_string

我需要将 company_name(由用户通过表单提供)输入到我的 mysql 数据库中。当我使用

$company = mysqli_real_escape_string($_POST['company_name'])

我收到一个错误

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

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

$company = mysql_real_escape_string($_POST['company_name'])

在这种情况下我能做什么?

4

6 回答 6

14

使用哪个取决于您使用的是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) );  
于 2013-01-03T09:23:00.663 回答
10

mysql_real_escape_string()旨在使数据安全地插入数据库而不会出现错误。(例如转义斜杠等 IE 不会破坏您的代码)。

您应该使用mysql_ormysqli_函数来匹配您的连接字符串。“mysqli”是 mysql 函数集的面向对象的实现,因此函数以面向对象的方式调用。“mysql”是程序性的。我建议改用“mysqli”,因为我相信在未来的版本中一直在谈论贬低“mysql”功能。

如果您的连接字符串是:

mysql_connect()

然后使用:

mysql_real_escape_string($_POST[''])

如果是:

$mysqli = new mysqli();

然后使用:

$mysqli->real_escape_string($_POST[''])
于 2013-01-03T09:19:21.457 回答
3

绝对没有

这两个函数都与表单数据无关。它们只能
用于格式化插入到 SQL 查询中的字符串文字。 这个函数属于SQL查询,不属于任何形式。甚至查询的非常有限的部分 - 字符串文字。

因此,每次您要在查询中插入字符串文字(坦率地说,是用引号括起来的一部分数据)时,都应该无条件地使用此函数。
对于任何其他情况,根本不应该使用它。

至于你得到的错误 - 它非常不言自明:这个函数需要 2 个参数,而不是一个。只需按照此功能的手册页中的说明传递正确的参数,就可以了

于 2013-01-03T09:22:01.070 回答
1

如果您使用程序样式,应该是这样的:

$city = mysqli_real_escape_string($link, $city);

其中链接是连接

或者当您使用面向对象的样式时:

$city = $mysqli->real_escape_string($city);

查看 php 手册: http: //php.net/manual/en/mysqli.real-escape-string.php

于 2013-01-03T09:21:30.160 回答
0

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

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

当您使用 a mysqli_connectthen 时,您应该坚持使用mysqli_real_escape_string().

更新

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

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

如果你问我:

  • 使用mysqlior PDO,因为mysql不推荐和不推荐使用。
  • 将连接句柄传递给转义函数或更好
  • 使用准备好的语句PDO-Style
于 2013-01-03T09:18:23.267 回答
0

由于所有MySQL扩展都已被弃用,因此您最好使用这些MySQLi方法,它更具未来性。

于 2013-01-03T09:21:09.610 回答