SQL分が動的に作成するとエラーとなる - PHPプロ!Q&A掲示板

4941

  • 募集中!! 0P

SQL分が動的に作成するとエラーとなる

質問日時 / 2018年5月3日 16:31    回答数 / 2件

Questioner:  kapibarasan240  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

お世話になります。

カラムが多いためSQL文を下記のように作成してINSERT処理したいのですがどうしてもエラーが出ます。


  1. $sq = "'";
  2.  
  3.   for($i=1;$i<=50;$i++){
  4.     $i3 = str_pad($i, 3, 0, STR_PAD_LEFT);
  5.     $array[] = $i3;
  6.   }
  7.  
  8.   foreach($array as $value_1){
  9.     $values_1 .= 'D' . $value_1 . '="%s"' . ', ';
  10.   }
  11.   foreach($array as $value_2){
  12.     $values_2 .= ' mysqli_real_escape_string($db, $_POST[' . $sq . $value_2 . $sq . ']),';
  13.   }
  14.   $sql = 'sprintf('. $sq;
  15.   $sql .= 'INSERT INTO result1 SET ' . $values_1;
  16.   $sql .= 'fullname="%s"' . $sq . ',';
  17.   $sql .= $values_2;
  18.   $sql .= ' mysqli_real_escape_string($db, $_REQUEST[' . $sq . 'fullname' . $sq .']));';

「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 'sprintf('INSERT INTO result1 SET D001="%s", D002="%s", D003="%s", D004="%s", D00' at line 1」

可能な限り調べていろいろ試したのですがどうも変化ありません。

ちなみに作成したSQL文を直接使用すると問題なくINSERT処理ができます。

  1. sprintf('INSERT INTO result1 SET D001="%s", D002="%s", D003="%s", D004="%s", D005="%s", D006="%s", D007="%s", D008="%s", D009="%s", D010="%s", D011="%s", D012="%s", D013="%s", D014="%s", D015="%s", D016="%s", D017="%s", D018="%s", D019="%s", D020="%s", D021="%s", D022="%s", D023="%s", D024="%s", D025="%s", D026="%s", D027="%s", D028="%s", D029="%s", D030="%s", D031="%s", D032="%s", D033="%s", D034="%s", D035="%s", D036="%s", D037="%s", D038="%s", D039="%s", D040="%s", D041="%s", D042="%s", D043="%s", D044="%s", D045="%s", D046="%s", D047="%s", D048="%s", D049="%s", D050="%s", fullname="%s"', mysqli_real_escape_string($db, $_POST['001']), mysqli_real_escape_string($db, $_POST['002']), mysqli_real_escape_string($db, $_POST['003']), mysqli_real_escape_string($db, $_POST['004']), mysqli_real_escape_string($db, $_POST['005']), mysqli_real_escape_string($db, $_POST['006']), mysqli_real_escape_string($db, $_POST['007']), mysqli_real_escape_string($db, $_POST['008']), mysqli_real_escape_string($db, $_POST['009']), mysqli_real_escape_string($db, $_POST['010']), mysqli_real_escape_string($db, $_POST['011']), mysqli_real_escape_string($db, $_POST['012']), mysqli_real_escape_string($db, $_POST['013']), mysqli_real_escape_string($db, $_POST['014']), mysqli_real_escape_string($db, $_POST['015']), mysqli_real_escape_string($db, $_POST['016']), mysqli_real_escape_string($db, $_POST['017']), mysqli_real_escape_string($db, $_POST['018']), mysqli_real_escape_string($db, $_POST['019']), mysqli_real_escape_string($db, $_POST['020']), mysqli_real_escape_string($db, $_POST['021']), mysqli_real_escape_string($db, $_POST['022']), mysqli_real_escape_string($db, $_POST['023']), mysqli_real_escape_string($db, $_POST['024']), mysqli_real_escape_string($db, $_POST['025']), mysqli_real_escape_string($db, $_POST['026']), mysqli_real_escape_string($db, $_POST['027']), mysqli_real_escape_string($db, $_POST['028']), mysqli_real_escape_string($db, $_POST['029']), mysqli_real_escape_string($db, $_POST['030']), mysqli_real_escape_string($db, $_POST['031']), mysqli_real_escape_string($db, $_POST['032']), mysqli_real_escape_string($db, $_POST['033']), mysqli_real_escape_string($db, $_POST['034']), mysqli_real_escape_string($db, $_POST['035']), mysqli_real_escape_string($db, $_POST['036']), mysqli_real_escape_string($db, $_POST['037']), mysqli_real_escape_string($db, $_POST['038']), mysqli_real_escape_string($db, $_POST['039']), mysqli_real_escape_string($db, $_POST['040']), mysqli_real_escape_string($db, $_POST['041']), mysqli_real_escape_string($db, $_POST['042']), mysqli_real_escape_string($db, $_POST['043']), mysqli_real_escape_string($db, $_POST['044']), mysqli_real_escape_string($db, $_POST['045']), mysqli_real_escape_string($db, $_POST['046']), mysqli_real_escape_string($db, $_POST['047']), mysqli_real_escape_string($db, $_POST['048']), mysqli_real_escape_string($db, $_POST['049']), mysqli_real_escape_string($db, $_POST['050']), mysqli_real_escape_string($db, $_REQUEST['fullname']));

上記が作成されるSQL文です。
もしお時間ある方いましたらヒントいただけますか。
どうぞよろしくお願いいたします。


ツリー一覧

┗A01shimix>上記が作成されるSQL文です。 そのSQL文を見て「
 ┗A01-1kapibarasan240shimix様 ご回答ありがとうございます。 根本的に

回答一覧

並び替え:

A01 満足
answerershimix [5月8日 09:08]

>上記が作成されるSQL文です。

そのSQL文を見て「しまった」と思わなかったのでしょうか?

SQLには(当然ですが)sprintfというものはありません。(phpで)sprintfした「結果」をSQL文として得たいのではないのですか?





というか、いちいちmysqli_real_escape_stringを通すよりはprepare/executeを使うほうが格段に楽だと思いますが・・・
  1. <?php
  2. $array = [];
  3. for($i=1$i<=50$i++) { $array[] = sprintf('%03d'$i)}
  4.  
  5. $colname = [];
  6. foreach ($array as $val) { $colname[] = 'D' . $val}
  7. $colname[] = 'fullname';
  8. $data = [];
  9. foreach($array as $val) { $data[] = $_POST[$val]}
  10. $data[] = $_REQUEST['fullname'];
  11.  
  12. $sql = 'insert into result (' . implode(''$colname) . ') values (' . implode(''array_fill(0count($colname)'?')) . ')'
  13. $stmt = $pdo->prepare($sql);
  14. $stmt->execute($data);
上記はPDOの例ですが、mysqliでも同様に書けますよね?

ただmysqliだとexecuteは引数がなく(空にする)、あらかじめbind_paramしないといけなかった気がします。なのでよほどmysqliでないといけない理由がない限りはPDOを使うことを推奨します。


あと・・。fullnameだけ$_REQUESTで処理している理由がわかりません。$_POSTなのか$_GETなのか$_COOKIEなのかは決まっていると思うのですが・・・

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkapibarasan240 [5月18日 16:24]

shimix様

ご回答ありがとうございます。
根本的に間違っていたようでお恥ずかしい限りです。
いただいた内容で一度試してみたいと思います。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)