0

以下のコードを 1 時間以上見つめていますが、問題は見られません。

    public function add($data){
        $sql = 'INSERT INTO ' . $this->name . '(fbid, userAccessToken, name, location, story, gender, email, email_md5, referrer, date, use, optin) VALUES (:fbid, :userAccessToken, :name, :location, :story, :gender, :email, :email_md5, :referrer, :date, :use, :optin)';

        $mysqldate = date('Y-m-d G:i:s');
        $result = $this->dbh->prepare($sql);

        if($result->execute(array(
            ':fbid' => $data['fbid'],
            ':userAccessToken' => $data['userAccessToken'],
            ':name' => $data['name'],
            ':location' => $data['location'],
            ':story' => $data['story'],
            ':gender' => $data['gender'],
            ':email' => $data['email'],
            ':email_md5' => md5($data['email']),
            ':referrer' => $data['referrer'],
            ':date' => $mysqldate,
            ':use' => $data['use'],
            ':optin' => $data['optin']
        ))){

            $return = $this->dbh->lastInsertId();  
        }
    }

エラーは

PHP 警告: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。'use, optin) VALUES ('517371547', 'no-auth', 'Shane Jones', 'Manchest' at line 1

4

4 に答える 4

8

USEmySQLの予約語です。

バックティックに入れるか、別の列名を使用する必要があります。

于 2013-02-01T15:03:07.260 に答える
3

useMySQLのキーワードです。列識別子として使用する場合は、バッククォートで囲みます。

$sql = 'INSERT INTO `' . $this->name . '` ( `fbid`, `userAccessToken`, `name`, `location`, `story`, `gender`, `email`, `email_md5`, `referrer`, `date`, `use`, `optin`) VALUES (:fbid, :userAccessToken, :name, :location, :story, :gender, :email, :email_md5, :referrer, :date, :use, :optin)';

とにかく、そのようなエラーを防ぐために、常にすべての識別子をバッククォートで囲む必要があります!

于 2013-02-01T15:05:33.303 に答える
2

USEは予約済みのキーワードであり、バッククォートで囲む必要があります`ドキュメントを参照)。

于 2013-02-01T15:06:19.090 に答える
1

問題は、クエリを手動で作成しているという事実に起因しています。構文的に正しいクエリ
を 作成する義務を負う健全なデータベース抽象化ライブラリを使用すると、コードは数行の短い行と同じくらい小さくなります。

public function add($data){
    global $db;
    $data['date'] = date('Y-m-d G:i:s');
    $db->query('INSERT INTO ?n SET ?u',$this->name,$data);
    return $db->insertId();
}

また、100 近い予約語をまったく知らない場合でも、エラーを発生させません。

于 2013-02-01T15:09:39.247 に答える