• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPで多次元配列の出力とデータベース入力)

PHPで多次元配列の出力とデータベース入力

このQ&Aのポイント
  • PHPで多次元配列の出力方法とデータベース入力を実現する方法について困っています。
  • 多次元配列を扱えず、出力方法がわからない状態です。特にSQLのクエリ実行時のVALUES内の記載方法に問題があります。
  • データベースへの入力をするためには、配列の値をVALUES内に適切に組み込む必要があります。しかし、現在のコードでは正しい記載方法が分からず、データの入力ができません。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

まずこちらをお読みください。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71 今からPHP+MySQLを学ぶならばぜひPDOでいきましょう。 また、このデータ定義のしかただと扱いにくいので配列を転置させていただきました。 もし配列をもとの状態から転置させたいのであれば、 $data = call_user_func_array('array_map', array_merge(array(null), $data)); とすると一発で出来ます。 【サンプルコード】 (全角スペースでインデントしてます) <?php // データ定義 $data = array(   array(     '入力項目1',     'チェックボックス1',     '選択1',     'あいうえお',   ),   array(     '入力項目2',     'チェックボックス2',     '選択2',     'アイウエオ',   ) ); // 例外処理ブロック try {      // DB接続   $pdo = new PDO(     'mysql:dbname=test_db;host=localhost;charset=utf-8', // DSN     'ABCD', // ユーザー名     'EFGH', // パスワード     array(       // SQL実行失敗時に例外をスロー       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,     )   );      // プレースホルダを含むSQL文   $sql = 'INSERT ' .       'INTO `product_b` (`text`, `checkbox`, `setntaku`, `textarea`) ' .       'VALUES (?, ?, ?, ?)'   ;      // プリペアドステートメントを生成   $stmt = $pdo->prepare($sql);      foreach ($data as $d) {     // 値をバインドしてSQL実行     $stmt->execute($d);   }      // 正常時   $message = 'エラーはありません。';    } catch (PDOException $e) {      // 例外が発生したとき   $message = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');    } // ブラウザにcharsetを伝える header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html>  <head>   <title>Test</title>  </head>  <body>   <p><?=$message?></p>  </body> </html> 【サンプル実行結果】 (ideoneにはPDO_MYSQLドライバがインストールされていないのでこのエラーになります) http://ideone.com/QLJuwT

agamik
質問者

お礼

ご回答を頂きましてありがとうございます。 やはり【 PDO 】での処理を念頭に考えるべき!っと思っていたのですが… 手元の参考書等を見てしまうと、安易にMySQLの構文に頼ってしまう自分が情けないです。。。 もっと勉強を重ねたいと思います。

その他の回答 (2)

noname#244856
noname#244856
回答No.3

連投失礼します。 【訂正】 vprintf → vsprintf

noname#244856
noname#244856
回答No.2

参考までにmysql関数で無理やり実装するとこんな感じでしょうか。 PDOの利点が目に見えると思います。 http://ideone.com/hwNYeU <?php // データ定義 $data = array(   array(     '入力項目1',     'チェックボックス1',     '選択1',     'あいうえお',   ),   array(     '入力項目2',     'チェックボックス2',     '選択2',     'アイウエオ',   ), ); // 例外処理ブロック try {      // DB接続   if (!$link = @mysql_connect('localhost', 'ABCD', 'EFGH')) {     throw new RuntimeException('DB接続に失敗しました。');   }      // 文字セット指定   mysql_set_charset('utf8', $link);      // DB選択   if (!@mysql_select_db('test_db', $link)) {     throw new RuntimeException(mysql_error($link));   }      // SQL文フォーマット   $format = 'INSERT ' .        'INTO `product_b` (`text`, `checkbox`, `setntaku`, `textarea`) ' .        'VALUES (%s, %s, %s, %s)'   ;      foreach ($data as $d) {     // 値をエスケープ     $d = array_map(       function ($i) use ($link) {         return mysql_real_escape_string($i, $link);       },       $d     );     // 値をバインドしてSQL実行     if (!mysql_query(vprintf($format, $d), $link)) {       throw new RuntimeException(mysql_error($link));     }   }      // 正常時   $message = 'エラーはありません。';    } catch (RuntimeException $e) {      // 例外が発生したとき   $message = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');    } // ブラウザにcharsetを伝える header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html>  <head>   <title>Test</title>  </head>  <body>   <p><?=$message?></p>  </body> </html>

agamik
質問者

お礼

早速、ご回答を頂きましてありがとうございます。 参考書を参考にしておりましたが、転置配列は記載がなく、、、やはり現場で開発されるコードは緊張感がありますね! とても感動しました。