PHPによるMySQLクエリ文の操作での文字の取り扱いについて

このQ&Aのポイント
  • //テーブルレコードを追加するSQL文の組み立て $sql = "insert into $TNAME ("; for($i=1;$i<=$INCOMECNT;$i++){ $sql .= $income[$i] . ','; } for($i=1;$i<=$COLCNT;$i++){ $sql .= $item[$i] . ','; } $sql .= "contributor, nowdate, imgfilename, regdate, password, parent, parent2) values ("; for($i=1;$i<=$INCOMECNT;$i++){ $sql .= "\"$income[$i]\","; } for($i=1;$i<=$COLCNT;$i++){ $sql .= "\"$item[$i]\","; } $sql .="\"$contributor\", \"$nowdate\", \"$imgfilename\", now(), \"$crpassword\", \"$parent\")"; //SQLの発行 $rst = mysql_query($sql, $con);
  • 上記のソースコードを実行すると、insert文が正しく実行されません。カンマの扱い方やバックスラッシュの扱い方に問題があるのでしょうか。
  • 正しいinsert文を実行するためには、カンマの位置やバックスラッシュのエスケープが必要です。それぞれの変数を適切に処理し、SQL文を組み立てることが重要です。
回答を見る
  • ベストアンサー

PHPによるMySQLクエリ文の操作での文字の取り扱いについて

//テーブルレコードを追加するSQL文の組み立て $sql = "insert into $TNAME ("; for($i=1;$i<=$INCOMECNT;$i++){ $sql .= $income[$i] . ','; } for($i=1;$i<=$COLCNT;$i++){ $sql .= $item[$i] . ','; } $sql .= "contributor, nowdate, imgfilename, regdate, password, parent, parent2) values ("; for($i=1;$i<=$INCOMECNT;$i++){ $sql .= "\"$income[$i]\","; } for($i=1;$i<=$COLCNT;$i++){ $sql .= "\"$item[$i]\","; } $sql .="\"$contributor\", \"$nowdate\", \"$imgfilename\", now(), \"$crpassword\", \"$parent\")"; //SQLの発行 $rst = mysql_query($sql, $con); 上記のソースでinsertできません。 ,←カンマの扱いが正しくないせいでしょうか? それとも\←の扱いでしょうか。 どうぞ宜しくお願い致します。

  • PHP
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

"["や"]"の文字が原因でSyntaxErrorになってるようですね。 対象テーブルのフィールド名は本当に income[1],income[2]...なのでしょうか? テーブルのフィールド名の文字列の一部として"[","]"を使う必要がなければ、 income1,income2,.... に変えたほうが、今後も面倒なことにならないと思います。

sato777
質問者

お礼

[]は認識されないようですね。知りませんでした。 変更すると正常に動作しました。 本当に助かりました。又、勉強にもなりました。 心から感謝いたします。有難う御座いました。

その他の回答 (3)

回答No.3

デバッグを埋め込まれてはいかがでしょうか echo "sql=".$sql; $rst = mysql_query($sql, $con); echo mysql_errno().": ".mysql_error(); これで、実行前のsql文が見えるので、カンマ問題か否かの判断ができるはず。 後、エラーがあれば、メッセージでも確認できるはず。 # echoに関しては、標準出力がNGならばテンポラリなファイルに書き出す等やってみてはいかがでしょう。

sato777
質問者

補足

デバッグしてみましたが、原因がつかめません。 以下がデバッグレポートです。 sql=insert into kakeibo3 (income[1], income[2], item[1], item[2], item[3], item[4], item[5], item[6], contributor, nowdate, imgfilename, regdate, password, parent, parent2) values ('収入Y','収入W','食品','飲料/酒','外食','接待交際','公共料金','雑費','', '20050811', '0', now(), 'pa', '', '')1064: You have an error in your SQL syntax near '[1], income[2], item[1], item[2], item[3], item[4], item[5], item[6], contributo' at line 1 どこかケアレスミスがあるのでしょうか どうぞ宜しくお願い致します。

回答No.2

ちゃんとPGM読んでないのですが insert文のカラム数が一致していないのではないでしょうか value句では、now()が最後から3個目に対し、regdateは最後から4個目。 よって個数が違う、または、型のミスキャストを直してあげると動くのではないでしょうか

sato777
質問者

補足

記述間違いでした。すみません。 しかしながら、これをきちんと記述しても同じです。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

ダブルクウォーテーションをシングルクウォーテーションにしたらどうなります? $sql .="\"$contributor\", \"$nowdate\", \"$imgfilename\", now(), \"$crpassword\", \"$parent\")"; ↓ $sql .="'$contributor', '$nowdate', '$imgfilename', now(), '$crpassword', '$parent')";

sato777
質問者

補足

もちろんうまくいきません

関連するQ&A

  • WHERE文の中で、MYSQLにINSERTが出来ない。

    メールを指定した時間に送信しようとしています。 手順はMYSQLに送信したい時間とメールの色々を入れて、 CRONで現在時間を調べて、合致したものを送信する。 このような手順で実現しようとしていますが、 最初でつまずいています。 送信先メールアドレスを while で抽出しながら MYSQLへインサートするつもりですが 一度しかインサートしてくれません。 インサートのsqlを[print $sql;]で、表示したものをphpMyAdminで SQL を実行すると キチンと挿入できます。 **3回分まとめてSQL を実行してもうまく挿入できます。 前のページから送ったものは全て[print] で、思い通りの結果が表示します。 どなたか、ご教授お願いいたします。 $sql = "select count(*) as cnt from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $tcnt = $col["cnt"]; mysql_free_result($rst); print $tcnt."通送信<br />"; $subject ="これはPOSTで送りました"; $honbun ="これはPOSTで送りました"; $from = '送信元メールアドレス'; $jikan = "これはPOSTで送りました"; $sql ="select * from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $customerID= $col['customerID']; $name = $col['name']; $mail = $col['mail']; i++ $sql = "INSERT INTO mail_queue_timer (timermailID,customerID, jikan ,sender , recipient ,headers, body ) VALUES ($timermailID, $customerID,$jikan , \"$from\" , \"$mail\" ,\"$subject\" , \"$honbun\" ) "; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • PHP
  • MySQLで、INSERT文でエラー

    下記のスクリプトで、MySQLサーバーのテーブルの中身を見ようとしたら、 返り値が空でした(行数0) ( クエリの実行時間 0.0010 秒 ) と表示されます。 どこが間違ってるのでしょうか。 ////////////////////// // データベース登録 // ////////////////////// $con = mysql_connect("mysql020.******", "*****", "*****"); // リモートのMySQLデータベースサーバーに接続する mysql_select_db("LAA0471050-ideamemo"); // データベースサーバーに存在する(myPHPAdminで作成済みの)データベースを選択する $sql = "SET NAMES utf8"; mysql_query($sql, $con); $sql = "INSERT INTO ideamemo_table (color, title, contents, create) VALUES ('$color', '$title', '$contents', '$create');"; mysql_query($sql, $con); mysql_close($con); ?>

    • ベストアンサー
    • MySQL
  • PHPを使用してMySQLを更新について

    SQLを勉強しようと思い、本を見ながらやっているのですが、入力する文字が全て半角でないとPHPで正常に登録できません。コマンドプロンプトから「Insert ・・・ 」と下記の通り打ち込むと問題なく登録できます。本当は下記のtest1~3は全角/半角を意識せず入力出来るようにしたいと思っています。お手数ですがご教示お願いします。 使用している環境は下記です。 WinXP HE Mysql 5.0 php 5.2.1 Apache 2.0.46 (SQLを更新しようとしている部分 ・・・ 下記”test3”は「3」だけ全角にしているとエラーになるが、半角で「3」と記述すると正常に登録できる) $sql = "INSERT INTO cdinfo(cd_no,artist_name,title,genre,melody1) VALUES(9,'test1','test2','J-POP','test3')"; $result = query($sql,$con); (上記”query”の中身) <?php function query($sql,$con) { $result = mysql_query($sql,$con); if ($result == false) { echo ("クエリーの実行に失敗しました!"); exit(); } return $result; } ?>

    • ベストアンサー
    • MySQL
  • トランザクションについて教えてください

    PHPとMysqlを利用しています。MySQL4.1.18です。 同じテーブルに2つ以上の値をINSERTする場合、 1つでもエラーがあればロールバックさせるということはできますでしょうか。 あらかじめ「id=1」の値を登録しておき、この場合1つめがエラーになるので 2つめも実行されないでほしいのですが、実行されてしまいます。 テーブルのタイプはInnoDBにしています。 どうぞよろしくお願いします。 以下を参考に作成しました。 http://oshiete.nikkeibp.co.jp/qa3065237.html $sql = "begin"; $rst = mysql_query($sql, $con); //1つめ $sql= "INSERT INTO T_test(id,name)values('1','山田')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} //2つめ $sql= "INSERT INTO T_test(id,name)values('2','鈴木')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} $sql = "commit"; $rst = mysql_query($sql, $con); if($err){ $sql = "rollback"; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • MySQL
  • PHPによるSQL文の中にPHP処理を記述するには

    PHP内のSQL発行部分の $QUERY="     INSERT     INTO         TABLE     (         `FIELD_A`,         `FIELD_B`,         `FIELD_C`     ) values (         `{$DATA[1]}`,         `{$DATA[2]}`,         `{$DATA[3]}`     ) "; このようなクエリを $QUERY="     INSERT     INTO         TABLE     (         `FIELD_A`,         `FIELD_B`,         `FIELD_C`     ) values (         `{$DATA[($i++)]}`,         `{$DATA[($i++)]}`,         `{$DATA[($i++)]}`     ) "; のような感じにしたいのですが うまくいきません。 どうすれば、クエリー文の中で$i++等の処理を 含まさせることができるでしょうか?

    • ベストアンサー
    • PHP
  • データに「,」があると「"」でくくられます。

    タブ区切りのデータファイルaaa.txtがあり、これをMySQLに読み込んでdatabaseというテーブルを作成したいのです。 これを実行すると、1行目は 1 concon コンコン とデータを読んでくれるのですが、2行目のようにカンマがあると 2 "con,con" コンコン のように両端に"がつくのです。 con,conと表示させるにはどのようにすればよいのでしょうか。 aaa.txt(スペースはタブ区切り) 1 concon コンコン 2 con,con コンコン $fp = fopen("aaa.txt","r"); $cnt = 0; while (!feof($fp)) { $record[$cnt] = fgets($fp, 1024); $cnt += 1; } fclose($fp); $sql="create table database(no int not null primary key auto_increment,dat1 varchar(200),dat2 varchar(200))"; $rst=mysql_query($sql,$con); for ($i=0; $i<$cnt-1; $i++) { $str[$i] = explode("\t", $record[$i]); $sql="insert into database(no,dat1,dat2)values('".$str[$i][0]."','".$str[$i][1]."','" .$str[$i][2]."')"; (続く)

    • ベストアンサー
    • PHP
  • PHPとMYSQLでデータ登録

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 上記のようにエラーでました。分かる方いらっしゃいましたらよろしくお願いします。 ソースは下の通りです。 <?php $con = mysql_connect("localhost","root","matsushima") or die(mysql_error()); mysql_select_db("koukou") or die(mysql_error()); $sql = "insert into area(name_area) values('".$_POST[name_area]."')";//SQL文の作成 $res = mysql_query($sql) or die(mysql_error());//クエリの実行 mysql_close($con);//切断 ?> <html> <head> <title>登録完了画面(サンプルリスト)</title> <meta name="keywords" content="入力フォーム,確認画面,サンプル"> </head> <body> <p>

  • PHP+MySQL データが無い時のみ追加したい

    PHP+MySQLで簡単なページカウンタを作っていますが、どうも正常に動いてくれません。 カウントを取りたいページに <IMG src="count.php?pagename=サンプルページ"> としてページネームを渡してあります。 count.phpの主要部分は //ページネームを取得(例:サンプルページ) $pagename = $_GET["pagename"]; とし、データベースに接続したあと // データ取り出し $sql = "SELECT name, count FROM shukei ORDER BY count;"; $rst = mysql_query($sql, $con); //データをループで読み込み while ($col = mysql_fetch_array($rst)) { $name = $col[name]; //渡されたページ名がDB内にあればカウント1増 if($name == $pagename){ $sql = "update shukei set count = count + 1 where name = '$name'"; } //渡されたページ名がDB内に無ければ新規追加 elseif($name != $pagename){ $sql = "INSERT INTO shukei(name,count) values(\"$pagename\",1)"; } } mysql_query($sql, $con); //接続解除 mysql_free_result($rst); $con = mysql_close($conn); としています、どんどん新規で追加されていってしまいます。 DB内にページ名が存在するならカウントアップをし、無い時はカウント1として新規追加をさせたいのですが…。 テーブル名はshukeiで id,name,count としております。 何か根本が間違っているのでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 【PHP+MySQL 】レコード追加できない

    配列に入っているタブ区切りのデータを MySQLのテーブルに入れたいと思い 下記のようにコーディングしたのですが (因みにDB接続はちゃんと確立されております) ------------------------------------------ $arrData[0] = "1001 ^ あ"; $arrData[1] = "1002 ^ い";     ・     ・     ・ $sql = 'insert into table_a values (?,?)'; $stmt = $dbh->prepare($sql); for($i=0;$i<=count($arrData);$i++){ $tmp = split("\t",$arrData[$i]); $flag = $stmt->execute(array($tmp[0],$tmp[1])); if (!$flag){ die('データの追加に失敗しました'); } } ------------------------------------------ データの追加に失敗しましたが表示されうまくできません。 ■ どのように直せばよいかご教示願います。 ■ また、mysql関数にはPDO関数のprepare→executeのような 書き方は無いのでしょうか。 ご存知の方いらっしゃいましたら教えて下さい。 よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP+MYSQLでレコードの表示させ方

    いつも初心者の質問でスミマセン。 PHP MYSQL で 会員制ページを作っています。 このような時にはどういう風にしたらいいか教えてください。 1件のレコードに 名前 出身県 性別 がある時に 下記のようにその個人のページにリンクしたいのですが ひとつの県だけなら出来るのですが、 このように条件を色々と設定するにはどうしたらいいか ヒントだけでもお願いいたします。 沖縄県出身者 男 A B C 女 D E F 東京出身者 男 G H I 女 J K L このようにしていました。 <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "select * from mem where seibetu = 1 and area = 1 " ; $rst = mysql_query($sql, $con); $body1 .= ""; while($col = mysql_fetch_array($rst)) { $body1 .= "⇒" . "<A href='" . $col["id"] . "j.html'>" . $col["name"] . "</A>"; $body1 .= "<br>\n"; } mysql_free_result($rst); $con = mysql_close($con); ?> これでボディに<?= $body1 ?> を張っていました。 これを<?= $body2 ?> と繰り返したらいいのかと思い色々していましたが どうしてもうまくいきません。 宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう