プロが教えるわが家の防犯対策術!

$sql='INSERT INTO extra(id,userid,exid,date,extext) values(null,?,?,?,?)';

$stmt=$dbh->prepare($sql);
$flag=$stmt->execute(array($placeholders[':userid'],$placeholders[':exid'],$placeholders[':date'],$placeholders[':extext']));

if($flag){
print('データの追加に成功しました。');
}else{
print('データの追加に失敗しました。');
}

}
上記の文で、インサートを行うと初めの一つのデータだけはインサートできますが、その後は全く追加できません。idがプライマリーキーで、autoincrementをしているのですが、自動入力の際には
引数をnullにすると自動でインクリメントしてくれると書いてありました。

質問者からの補足コメント

  • 回答ありがとうございます。
    userid,exid,dateにユニークIDをつけています。
    この3つが重複したときにupdate するように、後でon duplicate key update を付けたそうと思っていたのですが、unique id をつけていると、3つがすべて重複でなく、一つだけでも重複していると
    データが追加できません。duplicate key update 構文の例文では3つのデータが重複した時というような例文もあったのですが、http://d.hatena.ne.jp/IwamotoTakashi/20080329/p1
    うまくいきませんでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/02/18 11:02
  • すみません。またわからなくなってしまいました。
    この複合インデックスですが、PHPmyadmin で設定するなら、構造タブの中のインデックスという
    アイコンの事ですか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/02/18 14:08

A 回答 (4件)

>PHPmyadmin で設定



(1)テーブルを開いて構造を選びます。
(2)各カラムの前のチェックボックスあるので必要なものにチェックします
(3)テーブルの下にある「ユニーク」というアイコンか文字をクリックします

phpMyAdminでやるとインデックス名を任意につけることができません。
インデックス名を変更したいならインデックスを作ったあとで、
インデックスの編集メニューから名称を変更してください
    • good
    • 0

>unique id をつけていると、3つがすべて重複でなく、一つだけでも重複していると


>データが追加できません

それはユニーク属性の付け方がおかしい
3つが完全に合致したときだけ処理したいなら
複合インデックスを設定してください

create table extra(id int not null primary key auto_increment,userid int,exid int,date date,extext text,unique test_index(userid,exid,date))
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。複合インデックスを設定したら、ON DUPLICATE UPDATE 構文も使えるようになりました。ユニークキーではなくて、インデックスを付けるべきだったんですね。
解決しました。

お礼日時:2016/02/18 11:41

あ、よくみたらソースのコピペが適当すぎて


$pdoと$dbhがずれてますね
どちらかに統一してください

それと$placeholdersがどうやって渡されているかわからないので
うまくいかないようならその辺の補足も必要かも
    • good
    • 0

書式はあっているっぽいです


<?PHP
$dsn = 'mysql:host=localhost; dbname=testdb';
$user = 'root';
$password = 'mypassword';
$pdo = new PDO($dsn, $user,$password);
try{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql='INSERT INTO extra(id,userid,exid,date,extext) values(null,?,?,?,?)';
$stmt=$dbh->prepare($sql);
$flag=$stmt->execute(array($placeholders[':userid'],$placeholders[':exid'],$placeholders[':date'],$placeholders[':extext']));
}catch(PDOException $e){
die($e->getMessage());
}

で、エラーはつかめないでしょうか?
extraテーブルで主キーがidだとして、実はuseidもユニーク属性がついていて
はじかれるとか想像はできても運用状況がわからないのでなんとも・・・
この回答への補足あり
    • good
    • 0

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