2012-01-05 12 views
1

私はデータベースに接続するためにPHPでmysqli拡張を使用しています。私はそのような簡単な質問をしました。 mysqlの代わりにmysqliを使用する方が良いですか?なぜmysqli_real_escape_stringを使用する必要がありますか?この関数は正確に何をしていますか?ありがとう...mysqli_real_escape_string using environment

+1

サイドノート:PDOの使用を検討してください。これはMySQLiほど強力ではありませんが、それは学習しやすく、MySQL以外のDBMSエンジンでも使用できます。 –

答えて

2

SQLを使用しない少しの例を示します。あなたはこのPHPコードを持って想像:

<?php 
echo 'Hello, world!'; 

は今、あなたはO'Haraworldを置き換えたい:

<?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や文字列の連結方法に悩まされます。

これは質問全体を説明してくれることを願っています。

+0

ありがとうございます:) – DaHaKa

+0

私はmysqli_prepare()関数を使用しているので、mysqli_real_escape_string yesを使う必要はありませんか? – DaHaKa

+0

それだけでは不必要なだけでなく、両方を使うと、 'echo 'Hello!O \\\' Hara! 'と同様にデータベースに挿入された実際の偽の" –

1

MysqlはMysqliよりやや高速ですが、Web開発の99%で効果がありません。本当の利点は、Mysqliがクラスとメソッドについてより焦点を当てていることです。

Mysqli_real_escape_stringは、Mysqlクエリで使用する文字列の不正な/悪意のある文字をエスケープするための予防的な機能です。標準のmysql_real_escape_string関数もあります。疑わしい場合は、使用しないよりも使用する方が良いですが、あまりにも多くのスクリプトやクエリで速度の問題を引き起こす可能性がありますので注意してください。

手続き型PHPを書いているのであれば標準のMysqlを使ってください。オブジェクト指向のコードを書いているのであれば、Mysqliを使ってその可能性を最大限にしてください。クエリを安全にする必要があります。mysql_real_escape_stringは単なる1つの方法です。

希望すると便利です。