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

时间:2013-01-03 09:16:22

标签: 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'])

我收到错误

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'])

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

6 个答案:

答案 0 :(得分: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) );  

答案 1 :(得分:8)

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

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

如果连接字符串是:

mysql_connect()

然后使用:

mysql_real_escape_string($_POST[''])

如果是:

$mysqli = new mysqli();

然后使用:

$mysqli->real_escape_string($_POST[''])

答案 2 :(得分:4)

绝对没有

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

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

至于你得到的错误 - 这是非常明显的:这个函数需要2个参数,而不是一个。只需传递此功能的手册页中所述的适当参数,您就可以了

答案 3 :(得分:1)

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

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

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

<强>更新

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

它来找我,这不是问题,使用哪个MySQL扩展,但是用于转义数据的功能。

如果你问我:

  • 使用mysqliPDO,因为不推荐使用mysql并弃用。
  • 将连接句柄传递给escape-function或更好
  • 使用prepared StatementsPDO-Style

答案 4 :(得分:0)

由于所有MySQL扩展名都是deprecated,因此您最好使用MySQLi方法,这是未来的证明。

答案 5 :(得分:0)

如果你使用程序风格应该是这个:

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

其中link是连接

使用面向对象样式时

或者这个:

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

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