前提
Wordpressで独自テーブルを実装しています。
実現したいこと
INSERT
にあたって未指定のカラムに勝手に0
が入ってしまう原因を突き止め、これを防ぎたいです。
※ただし、外部キー制約以外の方法を模索しています。
発生している問題
該当のソースコードにあるように lang_id
カラムを指定せずINSERT
すると、勝手に0
が入ってしまいます。
該当のソースコード
■CREATE
まずこちらphpMyAdminから実行し CREATE
致しました。
SQL
1CREATE TABLE `wp_names` ( 2 `ID` INT(11) NOT NULL AUTO_INCREMENT, 3 `lang_id` INT(3) UNSIGNED NOT NULL, 4 `name` VARCHAR(10) NOT NULL, 5 PRIMARY KEY (`ID`) 6);
■INSERT
続いて次のようにphpでlang_id
を未指定で実行しますと1
が返り、INSERT
が成功します。
php
1global $wpdb; 2$table = 'names'; 3$newdata = ['name'=>'カブトムシ']; // lang_id を未指定 4$format = ['%s']; 5$result = $wpdb->insert( $wpdb->prefix.$table, $newdata, $format ); 6var_export($result); // 1 が返る
■問題の確認
成功したことについて「lang_id
には何が入ったんだ?」と疑問を感じ、phpMyAdminでSELECT * FROM wp_names;
を見てみると次の結果で、このように未指定のlang_id
に対し、勝手に0
が入ってしまうという問題が確認されました。
ID | lang_id | name |
---|---|---|
1 | 0 | カブトムシ |
試したこと
■SQLFiddleでのINSERT
まず、未指定のカラムに勝手に0
が入るのは、MySQLの本来の仕様なのか?を確認すべく、SQLFiddleをお借りして実行してみました。こちらです。
http://sqlfiddle.com/#!9/381c0f
上記SQLFiddleにさらに次を記載すると'みかん'
のINSERT
でエラーとなり、どうやら本来はエラーになるもののように思われます。
SQL
1INSERT INTO wp_names (`name`) 2VALUES ('みかん');
■phpMyAdminでのINSERT
次に、未指定のカラムに勝手に0
が入るのは、$wpdb->insert()
の仕様なのか?を確認すべく、phpで$wpdb->insert()
を実行するのではなく、phpMyAdminから次のINSERT
を実行してみました。
SQL
1INSERT INTO wp_names (`name`) 2VALUES ('クワガタ');
するとここではエラーにならずwp_names
は次の内容となり、やはりlang_id
に0
が入ってしまいます。
ID | lang_id | name |
---|---|---|
1 | 0 | カブトムシ |
2 | 0 | クワガタ |
■考察
以上のように、未指定は本来エラーだが、私の環境では勝手に0
が入ってしまうものかと思われます。
しかしその原因が発見できません。「MySQL のあるバージョンでは勝手に0
が入る」などがリファレンスマニュアルにあるかと思ったのですが見当たらず…。
ツールのバージョンなど
最後に私の環境を以下に記載させて頂きます。
PHP 8.0
MySQL 5.7.31
phpMyAdmin 4.4.15.10
この問題の原因と、そして防ぐ方法がお分かりになる方がいらっしゃいましたら宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー