2012-01-05 47 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只是一種方法。

希望這會有所幫助!