2014年9月26日金曜日

MySQLでデータ挿入が出来ない!?

Windows Server 2008上にアプリケーションとFTPサーバー機能を持たせて、Webベースのドキュメント共有・管理システムを運用しています。PHPとMySQLを利用しています。

社内のサーバーに移行作業と基本的なテストが終わり、いよいよ切り替えというタイミングなのですが、一部のページでmySQLのデータベースへデータ登録がエラーとなるという不具合が分かりました。

テストの時には問題なかったと思うのでとても不思議です。

そのあとやったことというと、本格的な運用開始のためにWindows Serverのライセンスを正式に発行してもらったこと、そしていくつかのセキュリティパッチをあてたことです。

SQLのクエアリ文を次のようなPHPコードで$queryに渡し、mysqli_query($db_link, $query)でインサートしていますが、ここの処理がエラーとなっているようです。

$query="INSERT INTO `db`.` tbl1` (`sw_num`, `sw_parent_num`, `sw_date`, `model`, `version`, `sw_id`, `author_code`, `comment`)
VALUES (NULL, ‘” . sw_parent_num  .”’, '" .$date ."', '" .$model ."', '" .$version ."', '" .$sw_id ."', '" .$author_code ."',  '" .$comment ."')";

mySQLはどちらもVer. 5.4、PHPもどちらもVer. 5.4同じです。なぜ現行のサーバーではうまくいき、新しいものでダメなのか本当に不思議です。phpMyAadminは3.5.0に対して新サーバーでは比較的新しい4.1.12を使っています。でも基本的にはmySQLのバージョンと、PHPの(もっと言えばmysqliの)バージョンが大事なのだろうと思うので、やっぱり不思議です。

sw_numは自動発番させているので入力時は入れません。問題はsw_parent_num が現在は使われておらず、入力時には何も入りません。NULLや '' (入力なし)ではうまく行かず、強引に'0'と入れるとうまく動くようになりました。

ちなみに両方ともmediumint型としています。

結局下記のようにして、sw_parent_numフィールドに強引に0を入れて動くようになり、様子を見ています。
$query="INSERT INTO `db`.` tbl1` (`sw_num`, `sw_parent_num`, `sw_date`, `model`, `version`, `sw_id`, `author_code`, `comment`)
VALUES (NULL, ‘0’, '" .$date ."', '" .$model ."', '" .$version ."', '" .$sw_id ."', '" .$author_code ."',  '" .$comment ."')";

他のページでも似たような現象がありました。
Date型の使用開始日という意味のフィールドに対して、同じように現在は入力させていません。

これも新サーバーではデータ挿入エラーとなったのですが、’0000-00-00’と強引にダミーの日付を入れて動くようになりました。

PHPとmySQLのバージョンが同じなのになんで新サーバーだけでデータ挿入エラーになるのかよく理解できていません。が、該当のQuery文は確かにもう少し厳密に書いた方がよいので書き換えることとしました。

テーブル内にあるフィールドで使用していないものはQuery文でも取り上げていませんでしたが、テキスト型以外のものは少なくともダミーで相当する型のデータを入れると動作が安定するようです。




0 件のコメント:

コメントを投稿