我在php中使用mysqli扩展连接数据库。我有这么简单的问题。使用mysqli而不是mysql更好吗?为什么需要使用mysqli_real_escape_string?这个函数究竟做了什么?谢谢...mysqli_real_escape_string使用环境
回答
我将举一个不使用SQL的小例子。想象一下,你有这样的PHP代码:
<?php
echo 'Hello, world!';
现在你想O'Hara
更换world
:
<?php
echo 'Hello, O'Hara!'; // Parse error: syntax error, unexpected T_STRING, expecting ',' or ';'
是的,当然,这不是有效的PHP。你需要,因为它解释为一个文字的报价,而不是字符串分隔符逃脱单引号:
<?php
echo 'Hello, O\'Hara!';
您编写SQL查询时有完全一样的问题。如果将随机输入注入代码,迟早会失效。你需要编码输入,所以它被作为文字输入处理,而不是破碎的代码。
你怎么能这样做?那么,MySQL就像PHP一样接受\'
(尽管这只是一个巧合:其他数据库引擎使用其他转义方法)。所以,最笨的解决办法是在这里和这里加回斜线:
SELECT id FROM user WHERE name='O\'Hara';
当然,这是一个很大的工作进行硬编码所有需要逃避可能的字符(你可能会忘记其中的一些)因此您可以使用可为您完成这项工作的功能:mysql_real_escape_string()
或mysqli_real_escape_string()
。
问题是:这足够好吗?嗯,这样的作品,但它会导致恼人的代码是难以维持:
$sql = "UPDATE user SET name='" . mysql_real_escape_string($name) . "' WHERE id='" . mysql_real_escape_string($id) . "'";
...,你仍然需要采取周围的单引号的完整价值的关怀......这并不总是强制性的(想想数字)......真是一团糟。有人不能发明更好的东西吗?好消息是:他们做到了!这就是所谓的准备好的发言:
// Just an example, I invented the syntax
$sql = 'UPDATE user SET name=:name WHERE id=:id';
$params = array(
'name' => "O'Brian",
'id' => 31416,
);
$MyDbConnection->execute($sql, $params);
在现实生活中:
- 库MySQLi有
prepare()
方法来做到这一点。 Find some examples there。 - 传统的MySQL扩展......没有任何内容:它根本不支持准备好的语句!如果你使用这个扩展名,你会陷入恼人的加引号和字符串连接方法。
我希望这可以解释整个问题。
Mysql比Mysqli稍快,但它在99%的Web开发中没有任何影响。真正的优势是Mysqli更专注于类和方法。
mysqli_real_escape_string是一种预防性功能,用于转义您要在Mysql查询中使用的字符串中的任何非法/恶意字符。还有一个标准的mysql_real_escape_string函数。如果有疑问,最好使用它而不是使用它,但要注意太多可能会导致脚本/查询的速度问题。为了简化起见,如果你正在编写过程PHP使用标准的Mysql,但是如果你正在编写面向对象的代码,那么使用Mysqli并且最大化它的潜力。您必须始终使您的查询安全,mysql_real_escape_string只是一种方法。
希望这会有所帮助!
- 1. 何时使用mysqli_real_escape_string?
- 2. 如何使用mysqli_real_escape_string()
- 3. 使用环境变量
- 4. 使用环境功能
- 5. 使用Jenkins - 构建环境
- 6. 使用环境变量
- 7. 根据环境使用DI
- 8. Linux环境乏使用python
- 9. 使用环回测试环境
- 10. 使用Mex环境时设置环境变量
- 11. 使用Latex创建具有多个子环境的新环境
- 12. Django使用环境变量拆分设置环境
- 13. 如何使用逐字环境创建新的Beamer环境?
- 14. 如何使用mysqli_real_escape_string转义单引号?
- 15. array_map和mysqli_real_escape_string
- 16. 如何在Ruby环境中使用HTML环境中的嵌套上升循环?
- 17. 怎样才能用mysqli_real_escape_string
- 18. IIS不使用用户环境变量
- 19. Android应用环境
- 20. 环境
- 21. 使环境变永久
- 22. PHP 7 mysqli_real_escape_string()错误
- 23. 的mysqli - 问题mysqli_real_escape_string
- 24. Htmlentities vs addslashes vs mysqli_real_escape_string
- 25. 为sevlet Path环境,使用Tomcat 7.0
- 26. 在cgi环境下使用phpunit
- 27. 使用php cli创建测试环境
- 28. 使用JS运行环境获取Rails
- 29. 使用aspnet_iisreg跨环境web.config加密
- 30. 使用的语言环境 - 问题
备注:请考虑使用PDO。它和MySQLi一样强大(如果不是更好的话),它更容易学习,并且可以与MySQL以外的其他DBMS引擎一起使用。 – 2012-01-05 11:42:17