• 締切済み

複数クエリ実行

以前ここで質問させて頂き諦めていたのですが、やはりどうしても諦めきれず、 再度挑戦しようとしているスクリプトです。 PHP5.29 Apache2.33 MySQL5 -------------------------------------------------------------------------- ファイル名:test.php <form action="test2.php" method="post"> <? for($i=0;$i<3;$i++) { ?> <input type="text" name="group[<?php echo $i?>][name]" /><br /> <input type="checkbox" name="group[<?php echo $i?>][check][]" value="日本語" />日本語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="英語" />英語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="西語" />西語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="独語" />独語 <input type="checkbox" name="group[<?php echo $i?>][check][]" value="伊語" />伊語 <br /> <textarea name="group[<?php echo $i?>][context]" cols="30" rows="3" /></textarea> <br /> <? } ?> <input type="submit" value="登録" /> </form> -------------------------------------------------------------------------- ファイル名:test2.php <?php $dbuser="root"; $dbpass="root"; $db=new PDO("mysql:host=localhost;dbname=test",$dbuser,$dbpass); $group=$_POST['group']; for($i=0;$i<count($group);$i++) { $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $db->query('set names utf8'); $name=$group[$i]['name']; $check=implode(" ",$group[$i]['check']); $context=$group[$i]['context']; $arr=array($name,$check,$context); $stt=$db->prepare('insert into test(name,group,context) values(?,?,?)'); $stt->execute($arr); //print_r($arr); print "<br />"; } ?> <br /><br /><a href="test.php">戻る</a> <hr /> <?php print_r($_POST); ?> -------------------------------------------------------------------------- 上記スクリプトにて名前と言語及びテキストまでのパラメータを表示する所までは何とか行けたのですが、 いざ入力しようとするとエラーが返されます。エラーは'SQLSTATE[42000]:と言うものでSQL文に異常が 報告されています。「print_r($arr);」で配列が正確に格納されていることを確認しています。 どうも$stt->execute($arr)で何か問題があると思われるのですが、こちらの方わかる方いらっしゃいましたら 教えて頂けませんでしょうか? 宜しくお願い致します。

みんなの回答

回答No.2

MySQLでは、「group by」や「order」など、SQL文の予約語をフィールドで使うとエラーが出るようです。 その為に、where句などで文字列をクオートするように、フィールド名をクオートしてやります。 MySQLの場合はフィールド名のクオートは「'(バッククオート)」を使うと決まっているというだけです。 他の、例えばPostgreSQLは「"(ダブルクオーテーション)」で囲む必要があります。

回答No.1

insert into test(name,group,context) values(?,?,?) こちらのSQL文ですが、 insert into test(`name`, `group`, `context`) values(?, ?, ?) と、フィールド名をバッククオートで囲ってやったら状況変わりますでしょうか。 groupあたりがSQL文の制御文字とかぶってたりしているので引っかかっている可能性があります。 それと、 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $db->query('set names utf8'); この二つは、for文の前に記述したほうが良いのではないでしょうか。

atlantic32
質問者

お礼

hogehoge78様 ご回答有難う御座いました。 言われたままに書き直しましたらちゃんと入力されるように なりました。setAttribute、set namesの部分は前に出すのは 自分のミスで、余計な負担が掛かってたのはわかります。 このバッククォートで囲う上手く行った理由がちょっと理解出来なかったですが、ネットで調べてみます。恐らくSQL文のgroup byと言うものをhogehoge78さんは仰っていたかと思います。 素早い対応有難う御座います。

関連するQ&A