我在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. 在函數中使用mysqli_real_escape_string
- 4. 使用Meteor.js檢測環境?
- 5. 使用Jenkins - 構建環境
- 6. 使用環境變量%ALLUSERSPROFILE%
- 7. 使用環境功能
- 8. 設置Qt使用環境
- 9. 使用lstlisting環境與宏?
- 10. 使用環境變量
- 11. nginx:使用環境變量
- 12. Linux環境乏使用python
- 13. 使用環境變量
- 14. 使用SaltStack設置環境
- 15. 在使用環境變量
- 16. 根據環境使用DI
- 17. 使用環回測試環境
- 18. Laravel使用語言環境的語言環境代碼
- 19. 使用Latex創建具有多個子環境的新環境
- 20. Django使用環境變量拆分設置環境
- 21. 如何使用逐字環境創建新的Beamer環境?
- 22. 使用Mex環境時設置環境變量
- 23. mysqli_real_escape_string使空字符串
- 24. 使用foreach和mysqli_real_escape_string很多帖子值
- 25. 如何使用mysqli_real_escape_string轉義單引號?
- 26. mysqli_real_escape_string()不正常
- 27. 警告mysqli_real_escape_string()的
- 28. array_map和mysqli_real_escape_string
- 29. PHP mysqli_real_escape_string問題
- 30. mysqli_real_escape_string與array_map
備註:請考慮使用PDO。它和MySQLi一樣強大(如果不是更好的話),它更容易學習,並且可以與MySQL以外的其他DBMS引擎一起使用。 – 2012-01-05 11:42:17