- ベストアンサー
MDB2の操作について
- MDB2を使用したMYSQLのデータ操作方法について調べています。
- データの有無によってINSERTまたはUPDATEを行いたい状況です。
- ON DUPLICATE KEY UPDATEを使用することで実現できるようですが、MDB2での構文がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
<? 私もMDB2を利用しているというだけで、深い知識がある訳ではありません。 ただ、プリペアドステートメントを理解していれば、それで事は足りるかと…。 //SQLに挿入するデータを整形しておく $id = $_POST['id']; $name = $_POST['name']; $age = $_POST['age']; //プリペアド・ステートメントの準備 $sql = "UPDATE table SET namae = ?,age = ? WHERE id = ".$id; $type = array('integer','text'); //変数?に代入する値のタイプ、SQLフィールドのタイプですね。 $sth = $mdb2 -> prepare($sql,$type,MDB2_PREPARE_MANIP);//変更の伴うSQLの場合にMDB2_PREPARE_MANIPを追記 //プリペアド・ステートメントの実行 $data = array($name,$age);//変数?に代入される値を配列で指定 $res = $sth -> execute($data);//いじくる必要なし //自分が利用するかぎりでは、INSERT,UPDATE,REPLACE INTO,SELECT等、どんなSQL文でもコレでOK! //SELECTの場合は、プリペアドステートメントを使うこともないですけど…。
その他の回答 (2)
$sqlをprintしてみると判ると思いますが、SQL文が成立していないだけだと思います。それと日本語を挿入する場合、クォーテーションなりで括ってあげないとです。 //$a = array(id, name); //フィールド名 //$b = array(1, "'あああ'"); //value //$sql = "REPLACE INTO test($a[0],$a[1]) VALUES($b[0],$b[1])"; //$res = $mdb2->query($sql); 余談ですが、プリペアドステートメントを利用した方が良いです。クォーテーションで括る必要が無くなります。 セキュリティ的にもマシです。 //プリペアド・ステートメントの準備 $sql = "INSERT INTO test (id,name) VALUES (?,?)"; $type = array('integer','text'); $sth = $mdb2 -> prepare($sql,$type,MDB2_PREPARE_MANIP); //プリペアド・ステートメントの実行 $data = array(1,'あああ'); $res = $sth -> execute($data);
REPLACE INTOじゃダメなんでしょうか? $sql = "REPLACE INTO テーブル名(フィールド名) VALUES (値) SELECT 文"; $res = $mdb2->query($sql); ※挿入するデータが既にテーブルに存在する場合は、既存のレコードを上書き(置換)します。(UPDATE文と同じ) 逆に、挿入するデータがテーブルに存在しない場合は、新規レコードを挿入します(INSERT文と同じ)。
お礼
お返事ありがとうございます。REPLACE INTOでいけました! MDB2では質問時に記載したのような形式になるものかと思い込んで おりそこがダメでしたね^^; できれば1つだけ補足をお願いしたいのですがこのような形式の場合 $fieldsのようにフィールド名とvalueの配列をつくり投げることは 無理なのでしょうか? 試しに $a = array(id, name); //フィールド名 $b = array(1, 'あああ'); //value $sql = "REPLACE INTO test($a) VALUES($b)"; $res = $mdb2->query($sql); とやってみたのですがエラーになってしまいました。
お礼
お返事ありがとうございます。 >余談ですが、プリペアドステートメントを利用した方が良いです。クォーテーションで括る必要が無くなります。 >セキュリティ的にもマシです。 どうも不慣れなもので存在は知っていましたが使用したことはなく こういったアドバイスを頂けますと非常に助かります。 マニュアルを参考にテストしてみましたが使い方を初めて知りなるほどといった感じです。 気になることとしてはINSERTの例でありupdete文(WHERE句あり)の例が 見当たらないのですがその場合は質問時に記載したようなautoExecute()ではなく autoPrepare()を使用すればプリペアド・ステートメントも実行できるので セキュリティ的にも改善し簡単であるという理解でいいのでしょうか? 試しに以下のようなソースで実行したところ問題なく実行できました。 $table = 'test'; $field = array('id', 'name'); $type = array('integer', 'text'); $mdb2->loadModule('Extended'); $sth = $mdb2->extended->autoPrepare($table, $field, MDB2_AUTOQUERY_UPDATE, 'id = '.$mdb2->quote(1, 'integer'), $type); $value = array(1, 'aaa'); $res =& $sth->execute($value); 何度もお手数お掛け致しますがお返事頂けますと幸いです。宜しくお願い致します。