XOOPSとMySQLとPHPと(INSERT編)
今回は、XOOPSからMySQLを使用する際のつまらないミスとか失敗を書いてみる
知人から依頼され、Crazy Pugというフットサルチームのサイトを作成することになり、一寸興味のあったXOOPS CubeというCMSを利用することにしたのが丁度一年前
ちなみにCMSというのはContents Management Systemの略で、WikiやWeblog(ブログ)なんかもCMSです
そして今回、次の様な注文を受けました
『参加した大会とその結果の一覧をサイトに載せたい。なんかそんな感じでよろしく』
他のチームのサイトで見かけて自分の所にも載せたくなったそうです
『フォームで登録出来るように』という要望があったので、久々にSQLを使ってみることに
必要な機能は『データの追加』『データの参照』、あと特に言われなかったが『データの削除』も要るだろう
そして『データの訂正』は無くても何とかなるので気づかなかったことに…
取りあえず今回は追加・参照・削除の部分に焦点を絞ることにする
※ちなみに例ではデータの型をそのままカラム名・変数名にしています
まず始めに書いたレコード追加部分は、
global $xoopsDB;
$sql_add ="INSERT INTO ".$xoopsDB->prefix("table_name");
$sql_add .=" (int_1, int_2, int_3, text_1, text_2, text_3)";
$sql_add .=" VALUES ($int_1, $int_2, $int_3, $text_1, $text_2, $text_3)";
$xoopsDB->query($sql_add);
"$xoopsDB->prefix()" は値をXOOPSのテーブル接頭語付きに変換します
XOOPSをデフォルトでインストールしている場合は、テーブルの接頭語が"xoops"なので、
今回の場合"$xoopsDB->prefix("table_name")"は"xoops_table_name"になります
当然、直接"xoops_table_name"と書き込めば"$xoopsDB->prefix()"を使う必要はありません
この時生成されるクエリは次のようになります (変数の値は適当)
INSERT INTO xoops_table_name(int_1, int_2, int_3, text_1, text_2, text_3) VALUES (111, 222, 333, hoge, foo, bar)
実際に試してみるがレコードはうまく追加されない
う~ん、"query()"にはいくらか制限があるらしいからそれが原因か?
試しに"&XoopsDB->query();"を"&XoopsDB->queryF();"に変更してみる
結果はやはり失敗…どうやら"queryF()"でもだめらしい
調べてみたところ"query()"の制限は次の通り
"include/common.php"を参照すると…
// #################### Connect to DB ##################
require_once XOOPS_ROOT_PATH.'/class/database/databasefactory.php';
if ($_SERVER['REQUEST_METHOD'] != 'POST' || !xoops_refcheck(XOOPS_DB_CHKREF)) {
define('XOOPS_DB_PROXY', 1);
}
$xoopsDB =& XoopsDatabaseFactory::getDatabaseConnection();
-
MethodがPOSTではない
-
Refererが自サイト内ではない
どちらかの条件を満た場合に、"SELECT"で始まるクエリ以外を拒否します
つまり、"INSERT"や"DELETE"、"UPDATE"等は使えません
上の条件を満たし"query()"で拒否される場合は、制限の無い"queryF()"を使用することで解決できます
そう聞くと、はじめから制限の無い"queryF()"を使った方が早そうな気はしますが、CSRF(Cross Site Request Forgeries)等に弱くなる為、通常は"query()"を使用する方が、
セキュリティ上好ましいそうです
話を戻して、今回はPOSTを使用しているし、リファラも自サイト内です
よって、"query()"のまま"INSERT"を使用できるので、原因は他にあるはずです
今度はクエリを直接MySQL氏に食べさせて理由を聞いてみることにします
返ってきた返事は次の通り、
#1054 - Unknown column 'hoge' in 'field list'
------------------------------------------
意訳(異訳):”ほげ”ってなんじゃ~~~ (ノ`´)ノ ~┻━┻
"piyo"の方が良かったですか?怒られました (--;
どうやらtext型の値をそのまま放り込んだのがまずかったらしい
ついでなのでint型の値も含めて ' ' で括ってみる
global $xoopsDB;
$sql_add ="INSERT INTO ".$xoopsDB->prefix("table_name");
$sql_add .=" (int_1, int_2, int_3, text_1, text_2, text_3)";
$sql_add .=" VALUES ('$int_1', '$int_2', '$int_3', '$text_1', '$text_2', '$text_3')";
$xoopsDB->query($sql_add);
そして生成されるクエリは次の通り、
INSERT INTO xoops_table_name(int_1, int_2, int_3, text_1, text_2, text_3) VALUES ('111', '222', '333', 'hoge', 'foo', 'bar')
結果は…今度は"ほげ"も受け取ってもらえました
レコード追加成功です
そんな感じでレコード追加は完了しました
随分長くなってしまったのでレコード参照と削除は次の機会にしましょう
う~ん、読み返してみると、なんだか他所のサイトを見ている気分だ…
