私は次のような構文を使用しています
$query = "SELECT * FROM contacts WHERE contact_id = $id";
多くの場合、機能しますが、機能しないことがよくあります。次に、使用する場合
$query = 'SELECT * FROM contacts WHERE contact_id = "'.$id.'";
それは動作します。どちらが正しいアプローチですか??
実際、SQL クエリを作成する場合、これらの構文はどちらも最適ではありません。
SQL クエリを作成している場合は、次のようにパラメーター化されたクエリを使用して作成する方がはるかに優れています。
$query = 'SELECT * FROM contacts WHERE contact_id = ?';
$prep = $mysqli->prepare($query); //prepares the query for action
$prep->bind_param("i", $id); //inserts the $id variable into the '?' as an integer value.
...または PDO ライブラリを使用した同様の方法。
この方法でクエリを実行すると、クエリがより安全になります。
古いスタイルのmysql_xx()
関数 (このスタイルのコードをサポートしていない) を使用している場合、これらは時代遅れで安全でないと見なされ、PHP の将来のバージョンから削除されることに注意してください。できるだけ早く使用を中止する必要があります。(これについての詳細は、PHP のマニュアルを参照してください)
文字列の構文について質問しているのか、クエリの書き方について質問しているのか、質問からは明確ではありませんでした。上記はクエリの作成に役立ち、文字列構文の問題も回避しますが、文字列構文の問題についてまだ知りたい場合は、そのトピックについてもいくつか考えを続けます....
どちらの構文も完全に有効です。簡単に言うと、どちらの方法でも問題ないため、任意のコードで最適な方法で実行してください。
あなたは、最初の構文が「うまくいかないことが多い」と述べました。これは完全に有効な PHP 構文であるため、詳しく説明していただけると助かります。
失敗する理由は、PHP などの変数名に他の単語が結合されている場合、または配列要素を変数として使用しようとしている場合です。この場合、次のように変数名を中かっこで囲む必要があります。
$string = "this is a string with a {$variable} in it";
実際、これはすべての場合に機能します (また、文字列で変数を使用している場合にわかりやすくするのにも役立ちます)、常に実行することをお勧めします。
一重引用符を使用するとパフォーマンスが向上すると言う人もいます。それは....しかし、違いは非常にわずかであり、実際、多くの変数を連結すると、さらに少なくなります。正直なところ、パフォーマンスが心配で、この種のことが問題になる場合は、PHP のようなインタープリター型言語を使用するべきではありません。
$query = "SELECT * FROM contacts WHERE contact_id = '". $id . "'";
しかし、クエリは脆弱ですSQL Injection
。コードを保護する方法の記事は次のとおりです。SQL Injection
フィルタリングする列が数値でない場合、以下のクエリは機能しません。
$query = "SELECT * FROM tableName WHERE username = $name";