sql >> データベース >  >> RDS >> Mysql

SQLSTATE [42000]:構文エラーまたはアクセス違反:1064

    これがエラーの原因です:

    $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
    

    {} 二重引用符で囲まれた文字列は、配列とオブジェクトプロパティへのアクセスに使用され、通常の変数の周囲で使用できます。
    $のエスケープ 二重引用符で囲む場合は、\$で行います。 それ以外の場合は、変数呼び出しを想定します。



    1. 特定の値が複数の行で発生する回数をカウントするSQLクエリ

    2. データベース設計:EAVオプション?

    3. UPDATEとSELECTを同時に行う方法

    4. データベースにファイルを保存することの長所と短所は何ですか?