限定しりとり

◆PHPバージョン
5.3.3

◆mysqlバージョン
4.1.22

◆テーブル情報
`no` int(11) NOT NULL auto_increment,
`name` text NOT NULL,
`mail` text NOT NULL,
`memo` text NOT NULL,
`updating` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`no`)
ENGINE=MyISAM DEFAULT CHARSET=utf8

◆SQL
(1)insert into test(name, mail, memo) values ('abc','abc@test.com','abc')
(2)insert test set name='abc', mail='abc@test.com', memo='abc'

◆処理概要
$conn = mysql_connect(ホスト、ユーザ、パスワード);
mysql_query("set names utf8");
$rs = mysql_select_db(DB名, $conn);
$result = mysql_query(SQL, $conn);


◆登録情報
(1, 'abc', 'abc@test.com', 'abc', '2011-09-02 16:28:57'),
(2, '', '', '', '2011-09-02 16:28:57'),

【問題】
上記SQL(1)、(2)どちらでDBに登録しても、登録情報のように同時に空データも同時に登録されてしまう
全く原因の検討がつかないので、何か手がかりがありましたらご教授頂けたらと思います。
どうぞよろしくお願いします。

A 回答 (5件)

うまくいきませんか。


それではtimestamp型はやめて、datetime型にして、

$tmstmp = date("Y-m-d H:i:s");
$sqlstr = "insert into test(name, mail, memo, updating) values ('abc','abc@test.com','abc'," . $tmstmp . ")";
mysql_query($sqlstr, $conn);

といった操作を挿入クエリ発行の度にやってみてはどうでしょうか?

また、mysqlのinsert命令は、1文で一度に複数レコードを挿入できるようですから、insert命令の文字列の末尾に何か付いているのかもしれません。

これも助言のみで確かめていませんけど、あしからず。
    • good
    • 0
この回答へのお礼

seastar3さん

 お礼が遅くなり、すみません。

 datetime型に変更してみましたが、やはりうまくいかずでした。

 >また、mysqlのinsert命令は、1文で一度に複数レコードを挿入できるようですから、insert命令の文字列の末尾に何か付いているのかもしれません。
 こちらの対応もしてみました。この対応だけだったと思うのですが、うまくいくようになりました!

 単純な登録だけと思っていたのですが、今回は色々と勉強になりました。
 貴重なアドバイスありがとうございました!!大変助かりました。

お礼日時:2011/09/10 20:22

もしかして?と思ったのですが、モバイルの振り分け(htaccess)などで2回のリクエストが発生していませんか?

    • good
    • 0
この回答へのお礼

 kosukejlampnetさん

 お礼が遅くなってすみません。
 デバックで確認しても、今回クエリーが2回処理されているのは確認できませんでした。

 再度のアドバイスありがとうございました。とても参考になりました。

お礼日時:2011/09/10 20:21

いざとなったら・・・


最後に「delete from テーブル where name=''」などで
怪しいデータを削除しちゃうとか・・・
    • good
    • 0
この回答へのお礼

 yambejpさん

 お礼が遅くなってすみません。

 アドバイスありがとうございました。
 リアルタイムでデータを確認したいので、今回この方法は利用できませんでした。

お礼日時:2011/09/10 20:15

''(空文字)!=NULL


ですよ。

フィールドの定義でNOT NULLを設定しても、''はNULLではないのでデータは追加されます。
insert test set name=NULL, mail=NULL, memo=NULL

ならデータは挿入されません。

この回答への補足

sql文を直接、コマンドで実行すると、正常に一行のみ挿入されました。

ちなみに、PC、モバイルとも同じ処理を行っているのですが、モバイルからの登録のみこの現象が確認されました。

補足日時:2011/09/04 19:16
    • good
    • 0
この回答へのお礼

 kosukejlampnetさん

 ご回答ありがとうございます。
 name、mail、memoカラム全てアプリの方で、必ず文字列が格納されていることを確認してからの、DBへの登録になるのでNULLまたは、空文字で登録されることはないのですが、insert処理した後、空文字が自動的に挿入されてしまうのです。

お礼日時:2011/09/04 19:14

こちらのいぞるでさんのブログの受け売りですが、



http://isoldeblog.blog93.fc2.com/blog-entry-14.h …

テーブル定義で updating フィールドに NOT NULL default CURRENT_TIMESTAMP を設定しておくと、レコード挿入後に自動的に新レコードを作ってしまうのかもしれません。
対応として、 on update CURRENT_TIMESTAMP を付け加えればいいのではないでしょうか。

検証なしですがあしからず。

この回答への補足

テーブル情報を下記に変更しても、自動的に新レコードが追加されてしまいます。

updating timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

補足日時:2011/09/04 15:25
    • good
    • 0
この回答へのお礼

seastar3 さん
 
ご回答ありがとうございました!
ご紹介頂いた方法で、新規データ作成しましたがやはり結果は同じでした。

でも、timestampについてとても勉強になりました!

お礼日時:2011/09/04 13:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!