web-dev-qa-db-ja.com

変数として扱われるパスワード文字列のドル記号($)

PHP/MySQL Webアプリケーションでデータベースへの接続に問題が発生した問題のトラブルシューティングに時間を費やしました。データベースには、まったく同じ資格情報でシェルとphpMyAdminからアクセスできますが、意味がありませんでした。

パスワードに$記号が含まれていたことがわかります。

$_DB["password"] = "mypas$Word";

送信されたパスワードは「mypas」であり、明らかに間違っています。

この問題を処理する最良の方法は何ですか? \で$をエスケープしました

$_DB["password"] = "mypas\$Word";

そしてそれは働いた。

私は通常$string = 'test'文字列の場合、これはおそらく以前にこれにぶつかることを避けた方法です。

これは正しい動作ですか?このパスワードがデータベースに保存されていて、PHP引き出した場合-この同じ問題が発生しますか?.

42
ncatnow
$_DB['password'] = 'mypas$Word';

単一引用符の文字列は処理されず、「そのまま」使用されます。 $ variableまたはエスケープシーケンス(\ n、\ rなど)の置換が特に必要でない限り、常に単一引用符の文字列を使用する必要があります。より高速でエラーが発生しにくくなります。

90
Thomas Bonini

PHPは、変数$Wordを文字列mypas$Wordに補間しています。これは、二重引用符で囲まれた文字列リテラルの通常の動作です。 $Wordはおそらく未定義なので、結果の補間された文字列はmypasです。

解決策は、単一引用符を使用することです。単一引用符で囲まれた文字列リテラルは、変数補間を受けません。

10
Benji XVI

他の回答は、パスソードに単一引用符が埋め込まれるまですべて機能します。

不合格:

$_DB['password'] = 'my'pas$Word';

代替案:

他のエスケープ文字がない場合は、\$で$をエスケープできます。

$_DB['password'] = "my'pas\$Word";

または、単一引用符をエスケープする方が簡単な場合があります。

$_DB['password'] = 'my\'pas$Word';

7
brianlmerritt

単一引用符で囲まれた文字列に入れてください:

$_DB['password'] = 'mypas$Word';

二重引用符で囲まれた文字列は変数を補間しますが、単一引用符で囲まれた文字列は補間しません。これで問題が解決します。

3
Ray Hidayat

一重引用符を使用する

$_DB["password"] = 'mypas$Word';
3
ghostdog74

"の代わりに単一引用符 'を使用するだけで、$ Wordを変数として扱わないようにします。

$_DB['password'] = 'mypas$Word';
2
Jeff Beck

二重引用符付きの文字列引用符は、変数に対して解釈されます。一重引用符で囲まれた文字列は、文字どおりに解釈されます。

$a = "one";
$b = "$a";
echo $b . "\n";
$b = '$a';
echo $b . "\n";

これにより、次の結果が得られます。

one
$a
2
Brian Riehman

このスレッドを見つける前に、この問題に出くわして修正しました。単一引用符で囲まれたすべてのソリューションが完璧に機能すると確信しています。パスを連結することを選択しましたが、シングルクォートの解決策を知らなかったので、パスも正常に機能します.... IE

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
1
blink