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
vsreal\u escape
。这是关于mysql
vsmysqli
,两者都是real\u escape
。。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果你选择PDO,.@MadaraUchiha他们在使用mysqlialready@YourCommonSense:显然不是。如果他们使用的是mysql\u real\u escape\u string
,这就意味着他们有一个ext/mysql连接。这并不是“非常自解释的”——OP显然混淆了mysql函数的两种实现。当传递两个参数时,“mysqli”函数不会突然起作用,除非他实例化了这个对象。同意在不阅读文档的情况下使用它,但如果这里没有问题,那么我们应该结束问题而不是回答。这不是不言自明的,因为这是用户的问题。他们的问题是区分“mysqli”和“mysql”函数