- ベストアンサー
MySQLプリペアドクエリでのINSERT文によるデータ追加方法の詳細
- MySQL文(プリペアドクエリ)を使用したINSERT文によるデータ追加方法について教えてください。
- 具体的なテーブル構造とデータを持つ2つのテーブルを例に、INSERT文の書き方を説明してください。
- プリペアドクエリを使用する場合の書き方と、パラメータのバインド方法について具体的なコード例を示してください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>パラメータ個数が可変の場合 引数個数が可変な関数の引数に配列渡しても、複数引数の代わりにはならないようなので、MySQLi_STMT->bind_paramを実行時可変にするのは、無理かも。 PDOStatement->bindParam だと、パラメーター一個ずつ対応させるので、foreachで回せば、いくらでも可変になるんだけど。 無理矢理やるなら、最大個数を決めて、1個から、最大個数までswitch文で切り分けるのも4-5個程度までなら、許容範囲かも。 <?php $data = '2,4,8'; /* どこかから受け取ったものがこの形式と仮定して */ $list = explode(',' , $data); $cnt = count($list); $sql = 'INSERT INTO /* 中略 */ where person_id IN ('; switch ($cnt){ case 0: $sql .= ' 0 )' ; /* ダミー値、エラーにしないけど、一件も取得されないようにする */ $presql = $db->prepare($sql); $presql->bind_param('s' ,$para01 ); break; case 1: $sql .= ' ? )' ; $presql = $db->prepare($sql); $presql->bind_param('si' ,$para01, $list[0] ); break; case 2: $sql .= ' ?,? )' ; $presql = $db->prepare($sql); $presql->bind_param('sii' ,$para01, $list[0],$list[1] ); break; case 3: /* パラメータ個数を増やしただけの同じ式なので省略 */ break; case 4: default: // これ以上は無視 /* 省略 */ } $presql->execute();
その他の回答 (1)
- utakataXEX
- ベストアンサー率69% (711/1018)
person_id IN ( 2 , 4 ) は、書き換えれば person_id = 2 OR person_id = 4 なので、バインドパラメータが "2,4" とと言うのは違います。 パラメータは3つ定義する必要があります。 (略) $para02="2"; $para03="4"; (略) $presql = $db->prepare("INSERT INTO sendmail (name,email,ticket) SELECT name,email,? FROM person WHERE person_id IN ( ? , ? )"); (略) $presql->bind_param("ss",$para01,$para02,$para03); (略)
補足
回答ありがとうございます。 person_id IN ( 2 , 4 ) は、書き換えれば person_id = 2 OR person_id = 4 これはわかっているのですが、2,4の部分のパラメータの個数が可変になります。 パラメータ個数が可変の場合、プリペアードクエリは使えないと考えた方がよろしいでしょうか。