配列データのMySQLへの登録

このQ&Aのポイント
  • 配列データをMySQLのデータベースに登録する方法を教えてください。
  • for文などを試行錯誤してもうまく実行できない状況です。
  • 参考にしているコードでは1つ目のデータしか登録されず、他のデータが登録されない問題が発生しています。
回答を見る
  • ベストアンサー

配列データのMySQLへの登録

下記の配列のデータをMySQLのデータベースに登録をしたいと思っています。 (参考)に記述しています内容で実行をしましたが、1つ目のデータしか登録がされず、 for文なども考え試行錯誤していましたが、うまく実行できない状況であります。 登録のための方法をご教授いただければと思います。よろしくお願いします。 array(3) { [0]=>"146-0082" [1]=>"東京都大田区" [2]=>"田中さん" array(3) { [0]=>"120-0015" [1]=>"東京都足立区" [2]=>"山田さん" -------------------- (参考) $sql = ('insert into table (number, adress, name) values (:number, :adress, :name)'); $stmt = $dbh->prepare($sql); $params = array( ":number" => $data[0], ":adress" => $data[1], ":name" => $data[2] );

  • PHP
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>$array = >array("146-0082", "東京都大田区", "田中さん"), >array("120-0015", "東京都足立区", "山田さん"), >); となっております。 いや、syntax errorになるソースで提示されても困ります・・・ 私が書いたとおり $array = array( array("146-0082", "東京都大田区", "田中さん"), array("120-0015", "東京都足立区", "山田さん"), ); という意味でいいということですよね。 この配列(insertする内容だけで構成)が生成できているなら疑問符プレースホルダを使って $stmt = $dbh->prepare('insert into table (number, address, name) values (?, ?, ?)'); foreach ($array as $data) { $stmt->execute($data); } とも書けますね。 なお、PDOのエラーモードは適切に設定されていますでしょうか?デフォルトはPDO::ERRMODE_SILENTなので何かエラーがあってもわかりません(エラーになる記述なのに「何故か動かない」と悩む方を見かけますので)。 http://www.php.net/manual/ja/pdo.error-handling.php

kondo3069
質問者

お礼

ご返答ありがとうございます。 不十分な情報での質問となり申し訳ありませんでした。 ご指摘のとおりPDOのエラーモードの設定も行ってみたいと思います。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こんな感じでどうでしょう? <?PHP $array = array( array("146-0082", "東京都大田区", "田中さん"), array("120-0015", "東京都足立区", "山田さん"), array("000-000", "北海道札幌市", "佐藤さん"), array("999-999", "沖縄県那覇市", "鈴木さん"), ); $pdo = new PDO($dsn, $user,$password); $sql="insert into tbl (`number`,`address`,`name`) values"; $str="(".implode(",",array_fill(1,3,"?")).")"; $sql.=implode(",",array_fill(1,count($array),$str)); //print $sql.";<br>\n"; $a=array(); array_walk_recursive($array, function($b) use (&$a){$a[] = $b;}); //print_r($a); $stmt = $pdo->prepare( $sql); $stmt->execute($a);

kondo3069
質問者

お礼

ご回答ありがとうございます。 array_walk_recursiveは初めて知った関数で非常に参考となりました。 質問させていただいた内容は、まだ試行錯誤中ですが、もう試してみたいと思います。 ありがとうございます。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>下記の配列のデータ どういう構成になっているのか読み取れません。例示してください。 たとえば $array = array( array("146-0082", "東京都大田区", "田中さん"), array("120-0015", "東京都足立区", "山田さん"), ); のようになっているのであれば、 $sql = ('insert into table (number, address, name) values (:number, :address, :name)'); $stmt = $dbh->prepare($sql); foreach ($array as $data) { $stmt->execute(array(":number"=>$data[0], ":address"=>$data[1], ":name"=>$data[2])); } でいいと思いますが・・・

kondo3069
質問者

補足

配列の構成を正しくお伝えできておりませんでした。 $array = array("146-0082", "東京都大田区", "田中さん"), array("120-0015", "東京都足立区", "山田さん"), ); となっております。 大変お手数でございますが、再度ご回答をいただきたく思います。 よろしくお願いいたします。

関連するQ&A

  • mysqlのデータをPDOでDELETEできない

    PDOオブジェクト(PHP)を使用したmysqlのデータ削除について、質問させてください。 PDOオブジェクトを使用して、mysqlのデータ読み込み・削除を行っています。 特定のデータを読み込み、処理を行わせた後、対象のデータの削除をしたいのですが 読み込みは出来るのに、削除で失敗してしまいます。 処理を行わせるSQLをvar_dumpで出力させ、 それを直接phpMyAdminでSQL実行してみたのですが、 問題なく削除が行われています。 SQLの問題ではなく、PHP側の問題だと思うのですが、 解決方法が見つかっておりません。 知恵を貸していただけないでしょうか。 $post_data = explode('¥t', $_POST['data_array']); $user_id = $post_data[0]; $account_name = $post_data[1]; $data_id = $post_data[2]; $gunre_id = $post_data[3]; try { // DB接続 $dbh = new PDO($serverInfo["SERVER"], $serverInfo["USER"], $serverInfo["PASS"]); $dbh -> query('SET NAMES utf8'); // 処理させる対象アカウント情報を取得 $sql_account; $sql_account = 'SELECT * FROM '. $serverInfo['TBL_ACCOUNT']. ' WHERE GUNRE_ID = :gunre'; } $stmt_account = $dbh -> prepare($sql_account); $stmt_account -> bindParam(':gunre', $gunre_id, PDO::PARAM_STR); $stmt_account -> execute(); while($account = $stmt_account -> fetch(PDO::FETCH_ASSOC)) { // 取得してきたデータを使用して処理 // この処理は正常に行われているので、SELECTは正常に行われていると考えられます } // 処理が完了したら、データを削除 // ↓ここで組み立てたSQLを出力し、phpMyAdminでSQL実行すると、データは削除されました $sql_delete = 'DELETE FROM '. $serverInfo['TBL_DATA']. ' WHERE USER_ID = "'. $user_id. '" AND ACCOUNT_NAME = "'. $account_name. '" AND DATA_ID = "'. $data_id. '"'; $stmt_delete = $dbh -> prepare($sql_delete); // ↓元々はbindParamで指定していたのですが、処理が出来なかったので // $SQL_deleteの中に値を埋め込み、処理を行わせました。結局出来なかったのですが・・・ // $stmt_delete -> bindParam(':id', $user_id, PDO::PARAM_STR); // $stmt_delete -> bindParam(':account', $account_name, PDO::PARAM_STR); // $stmt_delete -> bindParam(':data', $data_id, PDO::PARAM_STR); $result = $stmt_delete -> execute(); var_dump($result); // ←出力結果は「false」です } catch (Exception $ex) { echo '<font color="red">システムエラーが発生しました</font><br />'; exit(); } 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_queryがある場所について

    ZendFramework-1.11.7を使用しています。 Zend_DbでPdo_Mysqlで接続して利用しています。 そこで、クエリを実際に実行している箇所を探しているのですが、 ソースの中にmysql_queryが見つからないのです・・・ PHPとかでSQLを発行したい場合にはmysql_queryでやるんですよね?? ┬ Zend │└ Db │ ├ Statement.php ファイルには public function execute(array $params = null) { /* * Simple case - no query profiler to manage. */ if ($this->_queryId === null) { return $this->_execute($params); } があるのですが、これは $this->_execute($params); を実行していて ┬ Zend │└ Db │ ├ Statement │ │ ├ Pdo.php ファイルには public function _execute(array $params = null) { try { if ($params !== null) { return $this->_stmt->execute($params); } else { return $this->_stmt->execute(); } があるのですが、これは $this->_stmt->execute(); を実行しているようなのです。 なんか行ったり来たり(^^;)していて最終的にどこでSQLを発行(mysql_queryを実行)しているのかが フォルダ全体を文字列検索しても見つからないのです・・・ _stmtが何のオブジェクトなのかが定かではないので、追跡しづらいのかもしれませんが、 どこでSQLを発行しているのか教えて頂けないでしょうか?

    • ベストアンサー
    • PHP
  • PDOのprepareの使い方が正しいのか教えてください

    1つのレコードに入った二つのデータを反映させようと思ってますが、 prepareの使い方を教えてください。 持っている参考書があまり参考にならず困っているのですが、 prepareを使った再利用のやり方として、下記の方法は正しいでしょうか? $sql = "INSERT INTO $table (name,birth) VALUES(:name,:birth);"; $statement = $dbh->prepare($sql); $rtn = $statement->execute(array('太郎','2000/01/01')); $rtn = $statement->execute(array('花子','2000/10/31')); 一応、DBにデータの追加はでてきますが、 検索すると、 $statement->bindValue(':name',$name,PDO::PARAM_INT); を使ったやり方がたくさん出てきていて、 何が正しいやり方なのかよくわかりません。 宜しくお願いいたします。

    • ベストアンサー
    • 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
  • PDOでmysqlへinsertについて

    現在釣りの仲間が集まるサイトを作っており、会員登録機能がついています。 ニックネームやアドレスなどを登録する簡易な機能です。 ここに新しい機能として自分のプロフィール画像をのせれるようにしたいと思い、参考になるサイトみつけあれこれ試している状態です。 サイトの方を勝手に載せていいのかわからないので、困っている部分のコードを掲載シます。 $stmt = $pdo->prepare(implode(' ', array( 'INSERT', 'INTO image(name, type, raw_data, thumb_data, date)', 'VALUES (?, ?, ?, ?, ?, ?)', ))); $stmt->execute(array( $_FILES['upfile']['name'], $info[2], file_get_contents($_FILES['upfile']['tmp_name']), ob_get_clean(), // バッファからデータを取得してクリア date_format( new DateTime('now', new DateTimeZone('Asia/Tokyo')), 'Y-m-d H:i:s' ), )); というコードでinsertの?を:ooに変えてidを指定したいと思っております。 $stmt = $pdo->prepare(implode(' ', array( 'INSERT', 'INTO image(id, name, type, raw_data, thumb_data, date)', 'VALUES (15, :name, :type, :raw_data, :thumb_data, :date)', ))); $stmt->execute(array( $_FILES['upfile']['name'], $info[2], file_get_contents($_FILES['upfile']['tmp_name']), ob_get_clean(), // バッファからデータを取得してクリア date_format( new DateTime('now', new DateTimeZone('Asia/Tokyo')), 'Y-m-d H:i:s' ), )); これで実行すると15番のIDに画像が登録され問題ないです。 しかし15と直接打たないとエラーになってしまいます。 やりたいことはログインしているセッションのID(会員番号)で画像を登録しプロフィール画面など呼び出して使いたいということです。 自分なりにセッションのIDを入れる工夫をしてみたのですが、どうもエラーになってしまったり変に登録されてしまったりと上手くいきません。 ヒントなど何か解決のお手伝いをお願いいたします。

    • ベストアンサー
    • PHP
  • レコード削除・sqlインジェクション対策

    このようなSQL文は危険でしょうか? $sql = "delete テーブル名 where id = :id"; $stmt = $dbh->prepare($sql); $stmt->execute(array(":id" => $_POST['id'])); 上記の例だと、$_POST['id']は、 ちゃんとエスケープできているのでしょうか?

    • ベストアンサー
    • MySQL
  • sql エラー

    エラーが出ます。どこかおかしな点はありますでしょうか。 エラー文 Call to a member function prepare() on a non-object ソース $page = 1; $limit = 2; $offset = $limit * ($page - 1); $sql='SELECT COUNT(*) FROM message WHERE memberid=? GROUP BY aid'; $stmt=$dbh->prepare($sql); $data[]=$memberid; var_dump($data); $stmt->execute($data); $dbh=null; $total=$stmt->fetchColumn(); $lastpage= ceil($total/$limit); $sql='SELECT aid,max(kaisyamei),max(day) FROM message WHERE memberid=? GROUP BY aid LIMIT '.$limit.' OFFSET '.$offset; $stmt=$dbh->prepare($sql); $stmt->execute($data); $dbh=null; ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからデータを取り出す mysql

    Mysql  2つのテーブルからデータを取りたいです。 テーブル名 aman id : amemberid : bookid : kakaku : sonota : day テーブル名 bman id : bmemberid : bookid :title : day この二つのテーブル amanからkakaku,sonota。bmanからtitleを取り出したいのですが どのようなSQLになるのでしょうか。 bookidは2つのテーブルに同じ数字番号が入るようになっています。 ソース $sql='SELECT * FROM aman WHERE bookid=? JOIN message2 ON aman.bookrid=bman.bookrid'; $stmt=$dbh->prepare($sql); $data[]=$carid; これではだめでした。

    • ベストアンサー
    • MySQL
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう