私はクエリを書くための最良の方法を学ぼうとしています。また、一貫性を保つことの重要性も理解しています。これまで、私は特に考えずに、一重引用符、二重引用符、バックティックをランダムに使用してきました。
例:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
また、上記の例では、、などが変数になる可能性があることを考慮してtable
ください。col1
val1
これの基準は何ですか?あなたはどうしますか?
ベストアンサー1
バックティックはテーブルや列の識別子に使用されますが、識別子がMySQL 予約キーワード、または識別子に空白文字または制限されたセットを超える文字が含まれている場合 (以下を参照) 引用符の問題を回避するために、可能な場合は列またはテーブルの識別子として予約キーワードを使用しないことが推奨されることがよくあります。
リストにあるような文字列値には、一重引用符を使用する必要がありますVALUES()
。MySQL では文字列値に二重引用符もサポートされていますが、他の RDBMS では一重引用符の方が広く受け入れられているため、二重引用符ではなく一重引用符を使用することをお勧めします。
MySQLでは、DATE
リテラルDATETIME
値は のように一重引用符で囲まれた文字列として扱われます'2001-01-01 00:00:00'
。日付と時刻のリテラル詳細については、特に-
日付文字列のセグメント区切りとしてハイフンを使用する代替方法については、ドキュメントを参照してください。
したがって、あなたの例を使用すると、PHP 文字列を二重引用符で囲み、値には一重引用符を使用します'val1', 'val2'
。NULL
は MySQL キーワードであり、特殊な (非) 値であるため、引用符で囲みません。
これらのテーブルまたは列の識別子はいずれも予約語ではなく、引用符を必要とする文字を使用していませんが、バックティックを使用して引用符で囲んでいます (これについては後で詳しく説明します)。
RDBMS 固有の関数 ( NOW()
MySQL など) は引用符で囲まないでください。ただし、その引数は、すでに説明した文字列または識別子の引用符のルールに従います。
バックティック (`) テーブルと列 ───────┬──────┬──┬──┬──┬────┬────┬────┬────┬────┬────┬──────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = " `table` に INSERT INTO (`id`, `col1`, `col2`, `date`, `updated`) 値 (NULL、'val1'、'val2'、'2001-01-01'、NOW()) "; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 引用符なしのキーワード ─────┴┴┴┘ │ │ │ │ │ │ │││││ シングルクォーテーション (') で囲まれた文字列 ───────────┴────┴────┴────┘ │ │ │││││ 一重引用符 (') DATE ───────────────────────────┴──────────┘ │││││ 引用符で囲まれていない関数 ──────────────────────────────────────────┴┴┴┴┘
変数補間
変数の引用パターンは変わりませんが、文字列内で変数を直接挿入する場合は、PHP で二重引用符で囲む必要があります。SQL で使用するために変数が適切にエスケープされていることを確認してください。(SQLインジェクションに対する保護として、代わりに準備されたステートメントをサポートするAPIを使用することをお勧めします。)。
// 変数の置換でも同様です // ここで、変数テーブル名 $table はバッククォートで囲まれ、変数は // VALUESリスト内の引用符は一重引用符で囲まれている$query = " `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1'、'$val2'、'$date' ) に INSERT INTO ";
準備された声明
準備済みステートメントを使用する場合は、ドキュメントを参照して、ステートメントのプレースホルダーを引用符で囲む必要があるかどうかを判断してください。PHP、PDO、MySQLi で利用できる最も一般的な API は、他の言語のほとんどの準備済みステートメント API と同様に、引用符で囲まれていないプレースホルダーを想定しています。
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
識別子内でバックティック引用符を必要とする文字:
MySQLのドキュメントによると次の文字セットを使用して識別子を引用符 (バックティック) で囲む必要はありません。
ASCII:
[0-9,a-z,A-Z$_]
(基本的なラテン文字、数字 0 ~ 9、ドル記号、アンダースコア)
テーブルまたは列の識別子として設定された文字以外にも、空白文字などを使用できますが、その場合は引用符 (バックティック) で囲む必要があります。
また、数字は識別子として有効な文字ですが、識別子を数字だけで構成することはできません。数字だけで構成する場合は、バックティックで囲む必要があります。