2009-08-23 13 views
6

引用符との違いは何ですか?違いは何ですか?異なる引用符を使用する際にエラーがありますか?PHP:異なる引用符ですか?

$result = pg_query_params($dbconn, 
     'INSERT INTO users 
     (username, email, passhash_md5) 
     VALUES ($1, $2, $3)', 
      array($username, $email, $passhash_md5 
    ) 


     $result = pg_query_params($dbconn, 
      "SELECT user_id 
      FROM users 
      WHERE email = $1", 
      array($email) 
     ) 

答えて

18

一重引用符( ')を使用すると変数置換は行われません。つまり、最初の例の値は文字通り通常の文字列であり、それらを置き換える関数に渡されないと$ 1 $ 2などとなります。

可変置換を必要としない場合は、パフォーマンス上の理由からシングルクォートを使用することをお勧めします。

``はシェルエンジンを呼び出し、それを実際のコマンドとして呼び出し、結果を返します。これはperlの場合と同じです。したがって、それはまったく異なる意味を持っています。

例:

 
$email = '[email protected]'; 
$sql1 = "SELECT user_id FROM users WHERE email = $email"; 
$sql2 = 'SELECT user_id FROM users WHERE email = $email'; 

$ SQL1には、電子メール= [email protected]

$ SQL2は、電子メール= $メール

+5

ユーザーエスケープFROM SELECT user_idのだろうユーザーからのSELECTのuser_idだろう\ nと\ tのような文字を制御するために、一重引用符で囲まれた文字列でも展開されません。 – PhiLho

+1

'$ sql1'のような文字列は、いつも私をうんざらさせます。あなたが_それに変数を含めるには、 '{$ email} 'を使って常に自分の好みを得ます。私の通常のアプローチ: ''どこのemail = "。$ email"、それは文字通り取られないことが絶対的に明らかになります。 – JorenB

+0

もちろん、これらの方法のどれも、あなたが変数と呼んでいても、SQLインジェクションに対して安全です! OPは、一重引用符で$ 1などを使ってpg_query_paramsを使用するのは正しいです。ここでは変数置換は実際には起こりません。 '$ 1'構文は多分誤解を招くかもしれません...他のクエリパラメータ化システムは単に '?'を使用します。 – bobince

2

シングルとダブル引用符で囲まれた文字列の違いはよくPHP manual about Stringsに説明されています。あなたの例では

、あなたが置換変数などpg_query_paramsに固有の何かを意味$1として、それを使用しているので、あなたははPHPが変数名として、あなたは、SQLクエリ文字列の単一引用符を使用する必要があります解釈する必要はありません。

2

基本的には、"はあなたがそうのような変数埋め込むことができます:'を使用して(php manualから)

<?php 
$beer = 'Heineken'; 
echo "$beer's taste is great"; // works; "'" is an invalid character for variable names 
echo "He drank some $beers"; // won't work; 's' is a valid character for variable names but the variable is "$beer" 
echo "He drank some ${beer}s"; // works 
echo "He drank some {$beer}s"; // works 
?> 

は、変数のためのチェックは行われないことを意味します。

<?php 
echo '$beer'; 
?> 

出力は$beerとなります。

関連する問題