3

MySql と PHP のバックスラッシュについて質問があります。テスト用の簡単なコードを書きます!

include "src/db.inc.php";
$name="licon's";
$name=addslashes($name);
$sql="insert into test values('$name')";
mysql_query($sql);
$sql1="select * from test";
$rs=mysql_query($sql1);
$row=mysql_fetch_assoc($rs);
echo $row['name'];

コードが表示されているように、一重引用符を含む文字列をテーブルに挿入したいと考えています。

1.文字列をエスケープする必要があります。ここでは関数を使用しますaddslashes()。はこのよう$nameなものになります " licon\'s"。

2.しかし、テーブルに挿入し$nameてmysqlコンソールで選択すると、関数によって追加されたバックスラッシュがaddslashes消えます。次のように:

mysql> select * from test;
+---------+
| name    |
+---------+
| licon's |
+---------+

3. PHP スクリプトでフィールド ' name' を選択して印刷すると、バックスラッシュも消えてしまいます。
次のように:

$sql1="select * from test";
$rs=mysql_query($sql1);
$row=mysql_fetch_assoc($rs);
echo $row['name'];
======
print: licon's 

addslashes()関数が変数にバックスラッシュを追加することを知りたいです$name。バックスラッシュが消えるのはなぜですか?

4

2 に答える 2

0

addslashes() と stripslashes() は、引用符を DB との間で操作する古い方法です。

その理由は、古い PHP バージョンには、デフォルトでオンになっている magic_quotes_gpc() があり、これにより、Get/Post/Cookie 操作に対して次のことが行われるためです。

  • magic_quotes がオンの場合、すべての ' (シングル クォーテーション)、" (ダブル クォーテーション)、\ (バックスラッシュ) は自動的にバックスラッシュでエスケープされます。

エコーする必要がある間、stripslashes() が必要になります

新しい PHP と mysql はそれをまったく必要とせず、mysql は引用符と特別なチャーターを処理するのに非常に優れているため、使用するのに最適なのは mysql_real_escape_string() または同等の mysqli_ 関数です。

さらに重要なことに、この機能は PHP 5.3.0 の時点で非推奨になっているため、addslashes() を実行しているため、おそらく何もしていません。

いいえ、addslashes は MySQL に送信するデータにスラッシュを追加しますが、MySQL はデータをデータベースに保存する前にスラッシュを削除します。MySQL は \' をデータの一部として解釈し、単一の ' を SQL ステートメント構文の一部として解釈します。

于 2014-01-21T07:25:11.167 に答える