みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

複数クエリ実行

以前ここで質問させて頂き諦めていたのですが、やはりどうしても諦めきれず、
再度挑戦しようとしているスクリプトです。
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)で何か問題があると思われるのですが、こちらの方わかる方いらっしゃいましたら
教えて頂けませんでしょうか?

宜しくお願い致します。

投稿日時 - 2009-07-23 22:14:35

QNo.5150171

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

MySQLでは、「group by」や「order」など、SQL文の予約語をフィールドで使うとエラーが出るようです。
その為に、where句などで文字列をクオートするように、フィールド名をクオートしてやります。
MySQLの場合はフィールド名のクオートは「'(バッククオート)」を使うと決まっているというだけです。

他の、例えばPostgreSQLは「"(ダブルクオーテーション)」で囲む必要があります。

投稿日時 - 2009-07-25 01:46:12

ANo.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文の前に記述したほうが良いのではないでしょうか。

投稿日時 - 2009-07-23 22:56:42

お礼

hogehoge78様

ご回答有難う御座いました。
言われたままに書き直しましたらちゃんと入力されるように
なりました。setAttribute、set namesの部分は前に出すのは
自分のミスで、余計な負担が掛かってたのはわかります。

このバッククォートで囲う上手く行った理由がちょっと理解出来なかったですが、ネットで調べてみます。恐らくSQL文のgroup byと言うものをhogehoge78さんは仰っていたかと思います。

素早い対応有難う御座います。

投稿日時 - 2009-07-24 00:51:28

あなたにオススメの質問