- ベストアンサー
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); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo.1です。 制約とは大雑把に言うと、格納されるデータを制限するものです。 制約と言ってもいくつかあるわけですが、本件ではUNIQUE制約(一意性制約)を指しています。 何を以って一意であるとするかは設計次第です。 一意性制約 http://ja.wikipedia.org/wiki/%E4%B8%80%E6%84%8F%E6%80%A7%E5%88%B6%E7%B4%84 本題に入ります。 プログラムを何回も実行しているということですが、一回実行する度にテーブルの内容を確認しているのでしょうか。 改めて検証するために一旦テーブルを空にした後、一回だけプログラムを実行して結果を確認するのが良いと思います。蛇足ですが、ブラウザで検証しているのだと思いますので、くれぐれも更新ボタンを押すなどページの更新は行わないようにしましょう。
その他の回答 (2)
- mpx
- ベストアンサー率71% (149/209)
ソースの記載範囲内だけでは多重に同じデータを書きこむ部位はなさそうですので、他のスクリプトでここの部位を複数コールしたか、同じソフトを複数回繰り返したのだと思います。 同じデータが複数書込みができること自体が問題だとすると、それなりのテーブルの作り方にしておかないと問題がありそうですね。 テーブルで工夫が出来ないのなら、 merge(Oracle) か replace(MySQL) などで書き込むのも良いのでは?
お礼
遅れてしまって申し訳ないです。 replace文ですか。PRYMARYキーを曲名に設定すればいいのですかね。 ありがとうございます。試してみます。
- UmJammer
- ベストアンサー率58% (115/196)
仮に配列$cdがハードコーディングされているなどの理由で常に同じ内容であり、テーブルに制約を設けていないのであれば、この例ではプログラムを実行する度に同じデータが挿入されることになります。 実際にプログラムを何回か実行したということはありませんか?
お礼
早速の回答ありがとうございます。 テーブルに制約とはどのようなものなんでしょうか? プログラムは何回も実行していますが仮に配列$cdに前回と異なる値を格納したとしても同じように重複データが発生します。
お礼
遅れてしまって申し訳ないです。 ありがとうございます。上記のUNIQUE制約で重複を防ぐことができました。