私はデータベースに接続するためにPHPでmysqli拡張を使用しています。私はそのような簡単な質問をしました。 mysqlの代わりにmysqliを使用する方が良いですか?なぜmysqli_real_escape_stringを使用する必要がありますか?この関数は正確に何をしていますか?ありがとう...mysqli_real_escape_string using environment
答えて
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エクステンションは何も持っていません。準備されたステートメントはまったくサポートされていません!この拡張機能を使用する場合は、厄介なadd-quotes-yourselfや文字列の連結方法に悩まされます。
これは質問全体を説明してくれることを願っています。
MysqlはMysqliよりやや高速ですが、Web開発の99%で効果がありません。本当の利点は、Mysqliがクラスとメソッドについてより焦点を当てていることです。
Mysqli_real_escape_stringは、Mysqlクエリで使用する文字列の不正な/悪意のある文字をエスケープするための予防的な機能です。標準のmysql_real_escape_string関数もあります。疑わしい場合は、使用しないよりも使用する方が良いですが、あまりにも多くのスクリプトやクエリで速度の問題を引き起こす可能性がありますので注意してください。
手続き型PHPを書いているのであれば標準のMysqlを使ってください。オブジェクト指向のコードを書いているのであれば、Mysqliを使ってその可能性を最大限にしてください。クエリを安全にする必要があります。mysql_real_escape_stringは単なる1つの方法です。
希望すると便利です。
- 1. mysqli_real_escape_stringとprepared statements?
- 2. Asp.net environment
- 3. Neo4j Non-Rest Environment
- 4. Wordpress Dev Environment Migration
- 5. Katta in production environment
- 6. weblogic server clustered environment
- 7. Spring + Hibernate with multithreading environment
- 8. Oracle Application Express Dev Environment
- 9. C++ 11 std :: vector in concurrent environment
- 10. mysqli_real_escape_stringの説明:データベースに保存
- 11. using System.Reflection
- 12. Using System.Random
- 13. systemd:PATHを設定する "Environment"指示
- 14. JRubyがJava Runtime Environmentのメモリ不足
- 15. using {DynamicResource {x:Static LocalizableTexts.OpenTextKey}}
- 16. Barchart using coreplot、iphone
- 17. "using System;"コンパイルエラー
- 18. using connection.open with statement
- 19. Logger.getLogger()using jmock
- 20. DDE using System.Windows.Automation
- 21. は、USINGコマンド
- 22. BackboneJS model.url using collection.url
- 23. as3 starling using box2d
- 24. AssemblyFileRemoteSources error using Assembly.LoadFrom
- 25. pjsip using cmake
- 26. fisher.test using R
- 27. Doctrine using MySQL
- 28. filter_var using FILTER_VALIDATE_REGEXP
- 29. GestureDetector using service
- 30. Capybara :: ElementNotFound using 'find_field'
サイドノート:PDOの使用を検討してください。これはMySQLiほど強力ではありませんが、それは学習しやすく、MySQL以外のDBMSエンジンでも使用できます。 –