Php 我应该对表单数据使用mysqli\u real\u escape string()还是mysql\u real\u escape\u string()?

Php 我应该对表单数据使用mysqli\u real\u escape string()还是mysql\u real\u escape\u string()?,php,mysql,mysqli,mysql-real-escape-string,Php,Mysql,Mysqli,Mysql Real Escape String,可能重复: 我需要将公司名称(由用户通过表单给出)输入我的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/inse

可能重复:

我需要将公司名称(由用户通过表单给出)输入我的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'])
在这种情况下我能做什么?

两种变体都可以*(请查看我的更新)

使用
mysql\u connect
时,应坚持使用
mysql\u real\u escape\u string()
并传递连接句柄

使用
mysqli\u connect
时,应坚持使用
mysqli\u real\u escape\u string()

更新

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

我意识到,问题不在于使用哪个MySQL扩展,而在于使用哪个函数来转义数据

如果你问我:

  • 使用
    mysqli
    PDO
    ,因为
    mysql
    不推荐使用
  • 将连接手柄传递到escape功能或更好的功能
  • 使用()

mysql\u real\u escape\u string()
旨在使数据安全地插入数据库而不会出错。(比如转义斜杠,这样就不会破坏代码)

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

如果连接字符串为:

mysql_connect()
然后使用:

mysql_real_escape_string($_POST[''])
$mysqli->real_escape_string($_POST[''])
如果是:

$mysqli = new mysqli();
然后使用:

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

由于所有的
MySQL
扩展都在使用中,因此最好使用
MySQLi
方法,这更符合未来的需要。

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

$city = mysqli_real_escape_string($link, $city);
链接在哪里

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

$city = $mysqli->real_escape_string($city);
查看php手册:

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

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


至于您得到的错误,这是非常不言自明的:这个函数需要两个参数,而不是一个。只需为该函数传递手册页面中所述的正确参数,您就可以了

要使用的参数取决于您使用的是
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) );  


他正在escape方法中添加一个
$\u POST
值。文件名为
insert_company.php
,所以他很可能是在插入数据。哎呀,他把我搞糊涂了,因为他说“我想得到”。我已经更正了我的答案。@你的常识哦,对吗?这就是为什么手册中有这样的说明吗???“转义未转义的_字符串中的特殊字符,同时考虑连接的当前字符集,以便安全地将其放置在mysql_查询()中。”阅读愉快!请注意,现在不推荐使用此选项
此扩展在PHP5.5.0中被弃用,在PHP7.0.0中被删除。
再次,否
mysql_*
现在已经不能使用了。事实上,只要你的PHP版本低于5.5(甚至是更高的版本,错误抑制的代价也很小)@YourCommonSense,它们就可以免费使用@YourCommonSense,不应该只与低于5.0的PHP版本一起使用,由于mysqli和PDO驱动程序已被弃用,并且已在PHP5.x中部署。@Jeffrey Nope,如果开发者愿意,他们可以自由使用mysqli。如果在5.5+中使用,它将只生成E_折旧警告。你最初的观点“不能使用”是不正确的-只是不适合使用它们。“如果你愿意,你可以用脚驾驶汽车,这不是一个好主意。”-Chris Rock你读过问题了吗?是的,他有一个错误,所以我给他一个错误的解决方案。当你从数据库取回数据时,你应该始终将数据输入数据库,你将使用类似htmlentities的格式来格式化数据。我尝试了过程性的方法,但结果是一个空字符串。有什么建议吗?不理解重复投票。“重复”的问题是关于
escape
vs
real\u escape
。这是关于
mysql
vs
mysqli
,两者都是
real\u escape
。。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果你选择PDO,.@MadaraUchiha他们在使用mysqlialready@YourCommonSense:显然不是。如果他们使用的是
mysql\u real\u escape\u string
,这就意味着他们有一个ext/mysql连接。这并不是“非常自解释的”——OP显然混淆了mysql函数的两种实现。当传递两个参数时,“mysqli”函数不会突然起作用,除非他实例化了这个对象。同意在不阅读文档的情况下使用它,但如果这里没有问题,那么我们应该结束问题而不是回答。这不是不言自明的,因为这是用户的问题。他们的问题是区分“mysqli”和“mysql”函数