• ベストアンサー

PHPでデータベースに正しく入力できない

別のプログラムで変数に値を渡して、その変数に入っている値(文字)をデータベースに入力するプログラムを作っています。 見ての通りCDのデータベースを作るプログラムです。 複雑なプログラムではないのですが 下記のようにプログラムを実行するとselect文で結果を確認した所 仮に繰り返し回数($t)が3だとして A、A-2、A-3、A-4 B、B-2、B-3、B-4 C、C-2、C-3、C-4 となるはずが、上記と同じデータが A、A-2、A-3、A-4 B、B-2、B-3、B-4 C、C-2、C-3、C-4 A、A-2、A-3、A-4 B、B-2、B-3、B-4 C、C-2、C-3、C-4 A、A-2、A-3、A-4 B、B-2、B-3、B-4 C、C-2、C-3、C-4 のように同じデータがそれぞれ2つずつ重複して入力されているのです。 2回目のprint文を見ると正しく表示されているのですが、データベースのほうは重複しているようです。 こちらに問題がないようなら変数受け渡しの部分も見せますので どなたか問題を見つけてくださらないでしょうか。お願いします。 $DBSERVER = "localhost"; //MySQLサーバ名 $DBUSER = "root"; //ログインユーザ名 $DBPASSWORD = ""; //パスワード $DBNAME = "cdb"; //データベース名 //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //MySQL読み込み時の文字コードを設定 mysql_query("set name sjis"); //データベースに接続します $selectdb = mysql_select_db($DBNAME); print("以下のデータを入力しました</BR>"); for($i=0;$i<$t-1;$i++){ $name=$cd[$i][0];/*array[]になるので入れ直し*/ $name=mb_convert_kana($name , "a","sjis");  $artist=$cd[$i][1]; $artist=mb_convert_kana($artist , "a","sjis"); $day=$cd[$i][2]; $record=$cd[$i][3]; $record=mb_convert_kana($record , "a","sjis"); $sql="insert into co2 values('0','$name','$artist','$day','$record')"; print("曲名: ".$name."</BR>"."歌手名: ".$artist."</BR>"."発売日: ".$day."</BR>"."レコード会社: ".$record."</BR></BR>"); mysql_query($sql); }

質問者が選んだベストアンサー

  • ベストアンサー
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.3

ANo.1です。 制約とは大雑把に言うと、格納されるデータを制限するものです。 制約と言ってもいくつかあるわけですが、本件ではUNIQUE制約(一意性制約)を指しています。 何を以って一意であるとするかは設計次第です。 一意性制約 http://ja.wikipedia.org/wiki/%E4%B8%80%E6%84%8F%E6%80%A7%E5%88%B6%E7%B4%84 本題に入ります。 プログラムを何回も実行しているということですが、一回実行する度にテーブルの内容を確認しているのでしょうか。 改めて検証するために一旦テーブルを空にした後、一回だけプログラムを実行して結果を確認するのが良いと思います。蛇足ですが、ブラウザで検証しているのだと思いますので、くれぐれも更新ボタンを押すなどページの更新は行わないようにしましょう。

rety87
質問者

お礼

遅れてしまって申し訳ないです。 ありがとうございます。上記のUNIQUE制約で重複を防ぐことができました。

その他の回答 (2)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

ソースの記載範囲内だけでは多重に同じデータを書きこむ部位はなさそうですので、他のスクリプトでここの部位を複数コールしたか、同じソフトを複数回繰り返したのだと思います。  同じデータが複数書込みができること自体が問題だとすると、それなりのテーブルの作り方にしておかないと問題がありそうですね。 テーブルで工夫が出来ないのなら、 merge(Oracle) か replace(MySQL) などで書き込むのも良いのでは?

rety87
質問者

お礼

遅れてしまって申し訳ないです。 replace文ですか。PRYMARYキーを曲名に設定すればいいのですかね。 ありがとうございます。試してみます。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

仮に配列$cdがハードコーディングされているなどの理由で常に同じ内容であり、テーブルに制約を設けていないのであれば、この例ではプログラムを実行する度に同じデータが挿入されることになります。 実際にプログラムを何回か実行したということはありませんか?

rety87
質問者

お礼

早速の回答ありがとうございます。 テーブルに制約とはどのようなものなんでしょうか? プログラムは何回も実行していますが仮に配列$cdに前回と異なる値を格納したとしても同じように重複データが発生します。