なるの備忘録

エンジニアリングそして営業ができるエンジニアに向けて、日々学んだことをアウトプットしていきます。

【予約語に注意】FuelPHPでユーザ登録をしようとすると「Fuel\Core\Database_Exception [ 1064 (1064) ]: You have an error in your SQL syntax;」と出る

FuelPHPでユーザ登録をするとエラーが出る。

FuelPHPでユーザ登録をしようとすると以下のようなエラーが出た。

Fuel\Core\Database_Exception [ 1064 (1064) ]:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, profile_fields, last_login, login_hash, created_at) VALUES ('test8', 'zGE' at line 1 [ INSERT INTO users (username, password, email, group, profile_fields, last_login, login_hash, created_at) VALUES ('test8', 'zGEG+uMfdUKF9EJ4dPFONfP4OKlu33BkVIr6wLUDa4M=', 'test8@mail.com', 1, 'a:0:{}', 0, '', 1556079498) ]

どうやらINSERT文自体が間違っているらしい。

直接DBでSQLを実行してみる

直接DBでSQLを実行してみるとここでもエラー。
一つ一つカラムを外していくと、どうやらgroupというカラムが原因のようだ。

カラム名予約語が使われているときは「`」で囲う

SELECT、DELETE、または BIGINT などの特定の語は、テーブル名やカラム名などの識別子として使用するために予約されており、特別な取り扱いが必要となる。
今回の場合は、カラム名として使用されている「group」が予約語のため(group byで使用)、エラーが起きていたよう。

※参考
dev.mysql.com

そんな時はカラム名を「`(バッククォート)」で囲めば解決。
今回の場合だと以下のように実施。

INSERT INTO users (username, password, email, `group`, profile_fields, last_login, login_hash, created_at) VALUES ('test8', 'zGEG+uMfdUKF9EJ4dPFONfP4OKlu33BkVIr6wLUDa4M=', 'test8@mail.com', 1, 'a:0:{}', 0, '', 1556079498)
gontora.hatenadiary.com

これで直接DBでSQL文を実行してみると、無事データ登録が出来た。

FuelPHPが自動的に生成しているSQL文での予約語対策

しかし今回のSQL文はFuelPHPが自動的に生成しているので、実際のコードを実施したときは依然エラーが出る。

調べてみるとどうやら、config/db.php 等で設定している、使用しているデータベース設定の identifierを以下のように設定する必要があるそう。

'identifier'   => '`',

これでカラム名がバッククォートで括られるように設定されるようだ。

db.phpファイル全体だとこんなイメージ。

<?php
return array(
    'active' => 'mysqli',
    'mysqli' => array(
        'type' => 'mysqli',
        'connection' =>array(
            'hostname'      => 'localhost',
            'database'      => 'framework',
            'username'      => 'root',
            'password'      => 'root',
            'persistent'    => false,
            'compress'      => false,
        ),
        'identifier'   => '`',
        'table_prefix'  => '',
        'charset'       => 'utf8',
        'caching'       => false,
        'profiling'     => true,
    ),
);

これで無事登録できました。
このへんはFuelPHPでもバージョンで違うよう。
最近のバージョンはデフォルトで設定されていないのかな?

※参考
teratail.com