これがエラーの原因です:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Michael Berkowskiとandrewsiがコメントで指摘しているように、値を:subdomain
にバインドすることはできません。 プレースホルダーは、クエリではそのように記載されていないため、 PDOプレースホルダーは、データベース、テーブル、または列の名前ではなく、値にのみ使用できます。 。
この種のSQLクエリを動的に作成する場合は、データベース、テーブル、または列の名前をバッククォートで囲む必要があります。 (列と名前にクエリを壊す可能性のあるSQL予約キーワードが含まれている場合)およびエスケープ値 配置されますが、MySQLi
は使用できません そのため、すでにPDO
を使用している場合 。
PDOにはreal_escape_string()
が付属していないため それを実行するメソッドであり、実際には、そのような値をエスケープする必要はありません(Ye'name
のような名前の列が実際にある場合を除きます。 これは完全に愚かな私見です)、preg_match()
を使用した単純なフィルター またはpreg_replace()
十分です:
if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
// note the ` (backtick), and using " (double quotes):
$this->data->query("CREATE TABLE `{$this->subdomain}`");
} else {
// throw exception or error, do not continue with creating table
}
'
の使用例のほんの一部 (一重引用符-アポストロフィ)"
に対して (二重引用符)PHPの文字列:
$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5
{}
二重引用符で囲まれた文字列は、配列とオブジェクトプロパティへのアクセスに使用され、通常の変数の周囲で使用できます。
$
のエスケープ 二重引用符で囲む場合は、\$
で行います。 それ以外の場合は、変数呼び出しを想定します。