バックティックはテーブルと列の識別子に使用されますが、識別子がMySQL予約キーワード 、または識別子に空白文字または制限されたセットを超える文字が含まれている場合(以下を参照)、引用符の問題を回避するために、可能な場合は列またはテーブルの識別子として予約キーワードを使用しないことをお勧めします。
VALUES()
のように、文字列値には一重引用符を使用する必要があります リスト。文字列値についてもMySQLで二重引用符がサポートされていますが、他のRDBMSでも一重引用符が広く受け入れられているため、二重引用符の代わりに一重引用符を使用することをお勧めします。
MySQLはDATE
も期待しています およびDATETIME
'2001-01-01 00:00:00'
のような文字列として一重引用符で囲まれるリテラル値 。 日付と時刻のリテラル> 詳細については、特にハイフン-
を使用する代わりのドキュメントを参照してください。 日付文字列のセグメント区切り文字として。
したがって、あなたの例を使用すると、PHP文字列を二重引用符で囲み、値'val1', 'val2'
に一重引用符を使用します。 。 NULL
はMySQLキーワードであり、特別な(非)値であるため、引用符で囲まれていません。
これらのテーブルまたは列の識別子はいずれも予約語ではなく、引用符が必要な文字を使用していませんが、とにかくバッククォートで引用しています(これについては後で詳しく説明します...)。
RDBMSにネイティブな関数(たとえば、NOW()
MySQLの場合)は引用符で囲まないでください。ただし、それらの引数は、すでに説明したのと同じ文字列または識別子の引用符の規則に従います。
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
可変補間
変数の引用パターンは変更されませんが、変数を文字列で直接補間する場合は、PHPで二重引用符で囲む必要があります。 SQLで使用するために変数を適切にエスケープしたことを確認してください。 (プリペアドステートメントをサポートするAPIを使用することをお勧めします代わりに、SQLインジェクションに対する保護として 。
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (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の数字、ドル、アンダースコア)
それ以外の文字は、たとえば空白など、テーブルまたは列の識別子として使用できますが、その場合は必須 それらを引用(バックティック)します。
また、数字は識別子の有効な文字ですが、識別子を数字だけで構成することはできません。その場合は、バックティックで包む必要があります。