2012-01-05 75 views
1

我在php中使用mysqli扩展连接数据库。我有这么简单的问题。使用mysqli而不是mysql更好吗?为什么需要使用mysqli_real_escape_string?这个函数究竟做了什么?谢谢...mysqli_real_escape_string使用环境

+1

备注:请考虑使用PDO。它和MySQLi一样强大(如果不是更好的话),它更容易学习,并且可以与MySQL以外的其他DBMS引擎一起使用。 – 2012-01-05 11:42:17

回答

2

我将举一个不使用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扩展......没有任何内容:它根本不支持准备好的语句!如果你使用这个扩展名,你会陷入恼人的加引号和字符串连接方法。

我希望这可以解释整个问题。

+0

感谢您的解释:) – DaHaKa 2012-01-05 12:32:39

+0

因此,如果我使用mysqli_prepare()函数没有必要使用mysqli_real_escape_string是吗? – DaHaKa 2012-01-05 12:36:23

+0

不仅没有必要:如果你同时使用它们,你最终会在数据库中插入真正的伪造“\”符号,就像输入'echo'你好,O \''Hara!'; – 2012-01-05 12:38:10

1

Mysql比Mysqli稍快,但它在99%的Web开发中没有任何影响。真正的优势是Mysqli更专注于类和方法。

mysqli_real_escape_string是一种预防性功能,用于转义您要在Mysql查询中使用的字符串中的任何非法/恶意字符。还有一个标准的mysql_real_escape_string函数。如果有疑问,最好使用它而不是使用它,但要注意太多可能会导致脚本/查询的速度问题。为了简化起见,如果你正在编写过程PHP使用标准的Mysql,但是如果你正在编写面向对象的代码,那么使用Mysqli并且最大化它的潜力。您必须始终使您的查询安全,mysql_real_escape_string只是一种方法。

希望这会有所帮助!