バッククォートはテーブルとカラムの識別子に使用されますが、識別子がMySQLの予約済みキーワードである場合、または識別子に空白文字または制限されたセットを超える文字が含まれている場合にのみ必要です(以下を参照) 予約済みキーワードの使用を避けることをお勧めします。可能な場合は列またはテーブルの識別子として、引用の問題を回避します。
リストのような文字列値には、一重引用符を使用する必要がありVALUES()
ます。二重引用符は MySQL でも文字列値に対してサポートされていますが、単一引用符は他の RDBMS でより広く受け入れられているため、二重引用符ではなく単一引用符を使用することをお勧めします。
MySQL はまた、リテラル値が のような文字列として単一引用符で囲まれていることを想定DATE
しDATETIME
ています'2001-01-01 00:00:00'
。詳細については、日付と時刻のリテラルのドキュメントを参照してください。特に-
、日付文字列のセグメント区切り文字としてハイフンを使用する代わりの方法については、こちらを参照してください。
あなたの例を使用すると、PHP文字列を二重引用符で囲み、値に一重引用符を使用します'val1', 'val2'
。 NULL
は MySQL キーワードであり、特別な (非) 値であるため、引用符で囲まれていません。
これらのテーブルまたは列の識別子はいずれも予約語ではなく、引用符が必要な文字も使用していませんが、とにかくバッククォートで引用しています (これについては後で詳しく説明します...)。
RDBMS 固有の関数 ( NOW()
MySQL など) は引用符で囲む必要はありませんが、それらの引数は、前述の同じ文字列または識別子の引用規則に従います。
バッククォート (`)
表と列 ────────┬──────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ────────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$query = " INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`)
VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW()) ";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
引用されていないキーワード──────┴┴┴┘ │ │ │ │ │││││
単一引用符 (') 文字列 ────────────┴────┴──┴────┘ │ │││││
シングルクォート (') DATE ────────────────────────────┴──────────┘ ││││ │
引用されていない関数 ──────────────────────────────────────────┴┴┴┴┘
可変補間
変数の引用パターンは変更されませんが、変数を文字列に直接挿入する場合は、PHP で二重引用符で囲む必要があります。SQL で使用する変数を適切にエスケープしたことを確認してください。(代わりに、SQL インジェクションに対する保護として、準備済みステートメントをサポートする API を使用することをお勧めします)。
// いくつかの変数置換で同じこと
// ここで、変数テーブル名 $table はバッククォートで囲まれ、変数
// VALUES リスト内は一重引用符で囲みます
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) 値 (NULL, '$val1' , '$val2' , '$date' )";
準備されたステートメント
準備済みステートメントを使用する場合は、ドキュメントを参照して、ステートメントのプレースホルダーを引用する必要があるかどうかを判断してください。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 の数字、ドル、アンダースコア)
テーブルまたは列の識別子として、空白などのセット以外の文字を使用できますが、それらを引用符 (バッククォート) で囲む必要があります。
また、数字は識別子として有効な文字ですが、数字だけで識別子を構成することはできません。その場合は、バッククォートで囲む必要があります。