- ベストアンサー
mysqlへのデータ追加について
以下を実行すると”失敗しました”が表示されます。 $q1~$q5にはtest.html(FORM)からから受け取った(POST),2ビット文字を含む100文字未満が格納されています。(POSTの受け渡しテスト部分で受け渡しの成功は確認) それをmysqlのテーブルに格納したいのですが,そこがうまくいきません。 mysqlのdataテーブルにはq1~q5のフィールドがあり,すべてtext(200)です。本やネットで調べていますが原因がよくわかりません。 mysql_query($sql, $con)の書き方がおかしいのでしょうか。 どなたかご教授下さい。よろしくお願いします。 <?php $q1 = $_POST['q1']; $q2 = $_POST['q2']; $q3 = $_POST['q3']; $q4 = $_POST['q4']; $q5 = $_POST['q5']; /*POSTの確認 $body = $q1; $body .= $q2; $body .= $q3; $body .= $q4; $body .= $q5; print $body; */ require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASS); mysql_query("SET_NAMES 'sjis'"); $selectdb = mysql_select_db($DBNAME, $con); $sql = "insert into data (q1, q2, q3, q4, q5) values ($q1, $q2, $q3, $q4, $q5)"; $rst = mysql_query($sql, $con); if($rst){ print $q1."<br>"; print $q2."<br>"; print $q3."<br>"; print $q4."<br>"; print $q5."<br>"; print "上記の内容で登録しました。"; }else{ print "失敗しました。";} $con = mysql_close($con); ?>
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
print "失敗しました"; のところで、 print mysql_error($con); をした場合、何と出てくるでしょうか。 SQL文のそれ自体が間違っている場合、どこら辺が間違っているというものが表示されます。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
$sql = <<<eof insert into `data`(`q1`,`q2`,`q3`,`q4`,`q5`) values('{$q1}','{$q2}','{$q3}','{$q4}','{$q5}') eof; $rst = mysql_query($sql, $con) or die($sql."<br>".mysqlerror()); で、デバッグしてみてください
お礼
回答ありがとうございます。 PEARというかクラスというか・・・その使い方はまだまだ理解しきれていませんでした。 たくさん勉強しないといけません。 問題の箇所はSET_NAMESに_アンダーバーが入っていたことでした。 初歩的なミスでお騒がせして申し訳なかったです。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
>values ($q1, $q2, $q3, $q4, $q5) values ('$q1','$q2','$q3','$q4','$q5') で一度トライしてみてください
補足
回答ありがとうございます。 >values ($q1, $q2, $q3, $q4, $q5) の部分ですが, values ('$q1','$q2','$q3','$q4','$q5') values (\"$q1\",\"$q2\",\"$q3\",\"$q4\",\"$q5\") 上記の両方で試しましたが,ダメでした。
- INTLINSIDE
- ベストアンサー率42% (383/907)
1.接続は出来ているんでしょうか。 if(!$con = mysql_connect($DBSERVER, $DBUSER, $DBPASS)){ print "接続失敗"; exit; } で、確認してみてください。 2.addslashes等してみる。 たしかphp 5.2ぐらいからマルチバイトに対応していたと思いますが。 http://php.plus-server.net/function.addslashes.html これによって脆弱性が生まれる場合があるので、マルチバイトに対応しているかどうかphpのバージョンで一応確認してください。 3.MySQLのバージョンはいくつでしょうか。 フィールドが質問にあるだけなら、問題ないとも思うんですが。 まあ今後のために。 blobやtextを扱う場合はmy.iniなどのMAX_ALLLOW_PACKETSが 十分大きいかも確認しましょう。 無い場合、[mysqld]セクションに max_allow_packets=16M のように追加します。
補足
回答ありがとうございます。バージョンについては最初に書いておくべきでした。すみません。 PHP 5.2.3 Apache 2.2.4 MySQL 5.0.45 1.接続は問題なくできています(アドバイス通り確認) 2.addslashesは下記を実行し,Is your name O\'reilly?と出力されました。正しいのかどうかはわかりません。(出力結果は\'もそのまま出力されます) $str = "Is your name O'reilly?"; // 出力: Is your name O\'reilly? echo addslashes($str); 3.max_allow_packets=16はmy.iniにはその項目自体がありません。 また,[mysqld]の項目を見ても似たような項目はありませんでした。
お礼
みなさんのアドバイスを試しましたが何分初心者名ものでますます混乱してしまいました。 結局コードを一字一句読んでいくと mysql_query("SET_NAMES 'sjis'");のSETとNAMESに_アンダーバーが入っているのに気づき,はずしたらすんなり走りました。 初歩的なミスでみなさんには申し訳なかったです。 でも,デバッグの仕方などとても勉強になりました。 今後活用させていただきます。 ありがとうございました。