• ベストアンサー
  • すぐに回答を!

別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数789
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.3
  • YEND77
  • ベストアンサー率56% (21/37)

『最後の1件』と『コードの全体像』から insert文は作られているけど、実行がされていないかもです。 たぶんループ外(while文)でinsert文を実施しているため 最後の1件だけがinsertされている。 insert文を実行している箇所を変更したくない場合は、 連結していけばいいのかななんて思います。 (件数によっては現実的ではないかもですが・・・) 上記の場合、while文の1つ上で $sql = ""; クエリ文の初期化をし、 $sql = "INSERT INTO db_test.tbl_test_new ( の部分を $sql .= "INSERT INTO db_test.tbl_test_new ( にする。

共感・感謝の気持ちを伝えよう!

質問者からの補足

アドバイスありがとうございます。 別件で四苦八苦していたもので返信が遅くなりました。 >連結していけばいいのかななんて思います。 こんな考え方もあるのですね!! イレギュラーな方法のような気もしますが、 こうゆうのもありですよね! まだ、テストしていませんがこれでいけるような気がします。 ※新規テーブルに挿入する項目は多くはないからです。 基本は私も一般人(何しろ独学なもので・・・)なので。 でも、凄いことですね。 一般人の参考意見なのですね。 たくさんの事例を扱っていなければできない回答ですよね。 (請負業務だけが実績じゃないですものね。) 何しろ、チャチャも含めて回答して下さったのは、 YEND77様だけですから。 YEND77を尊敬いたします!! 実は、今作成しているwebアプリを携帯にも対応できるように実装しなくてはいけないので奮闘中なのです。 お忙しい中、 アドバイスを下さり、ありがとうございます。 検証結果を後日お知らせいたしますね。 よろしくお願いいたします。

その他の回答 (2)

  • 回答No.2
  • YEND77
  • ベストアンサー率56% (21/37)

postした変数を使うにはやはりfetchでくるくる回すやり方ですかね。。。 確認ですが、フェッチループ内で、 $rst2 = mysql_query( $sql ); などとクエリの実行はしているんですよね。 あと、トランザクションはきってますか? あと、挿入されているデータは、最初の1件ですか?最後の1件ですか? select にorder by等をかけて順序性を規定して試して いただけますか? 追記: 前回のURLすこし張り間違いです。 http://ftp.ntu.edu.tw/MySQL/doc/refman/5.1/ja/insert-select.html

共感・感謝の気持ちを伝えよう!

質問者からの補足

新たに回答していただきまして、 ありがとうございます。 よろしくお願いします。 >などとクエリの実行はしているんですよね。 実行しております。 >あと、挿入されているデータは、最初の1件ですか?最後の1件ですか? 最後の1件です。 >トランザクションはきってますか? 意味がよくわかりません。スミマセン。。。 調べてみます。 全体像が分からないとアドバイスをしずらいですよね。 ということで、 詳細コードを記述します。 function date_rst( $year, $month, $day, $add_date ) { $base = mktime( 0, 0, 0, $month, $day, $year ); $date = $add_date * 86400; $date_rst = $base + $date; return date( "Y-m-d 00:00:00", $date_rst ); } $sql = "SELECT db_test.tbl_test.test_id, db_test.tbl_test.base_days FROM db_test.tbl_test WHERE db_test.tbl_test.test00_id = '" . mysql_real_escape_string( $_SESSION['test00_id'] ) . "' AND db_test.tbl_test.base_days != '0000-00-00 00:00:00'"; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $year = substr ( $col['base_days'], 0, 4 ); $month = substr ( $col['base_days'], 5, 2 ); $day = substr ( $col['base_days'], 8, 2 ); $add_date = $col['base_days']; $rst_date = date_rst ( $year, $month, $day, $add ); $sql = "INSERT INTO db_test.tbl_test_new ( reg_date, test_id, test00_id, rst_date, state ) VALUES ( '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $col['test_id'] ) . "', '" . mysql_real_escape_string( $_SESSION['test00_id'] ) . "', '" . mysql_real_escape_string( $rst_date ) . "', '1' )"; } やりたいことはご理解いただけてると思いますので、 上記を上手く実行させたいのですが、 できますでしょうか? よろしくお願いします。

  • 回答No.1
  • YEND77
  • ベストアンサー率56% (21/37)

mysql5 はしらないのですが、、、 insert into select の構文が簡単かと思います。 (フェッチでやる方法もあるかと思いますが・・・) http://ftp.ntu.edu.tw/MySQL/doc/refman/5.1/ja/insert.html

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 >insert into select の構文が簡単かと思います。 この場合、仮にtbl_Aのフィールド値“data”に変更を加えた場合は、 どのように対応したら良いのでしょうか? 例) $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $add = "$_POST['add']"; $data = ( $col['data'] + $add );   ↑ 追加。実際はもう少し複雑なのですが・・・・ $sql = "INSERT INTO tbl_B ( date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $data ) . "' ←変数になった場合 )"; } 引き続き、アドバイスなどよろしくお願いします。

関連するQ&A

  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • 共通のカラムを持つテーブルの外部キーの設定

    MySQLバージョン4.1.16を使用しています。 2つのテーブル「tbl1」と「tbl2」があり、 それぞれ共通のカラムを別のテーブル「common_tbl」に設定(正規化)し そのcommon_idを「tbl1」と「tbl2」が参照します。 例えば、「tbl2」にデータをinsertする場合に、 まず「common_tbl」からinsertして、そのinsert_idを取得(利用)して 「tbl2」にデータを挿入します。 たぶんこの場合のinsertはこのようなやり方だと思います(あまり自信ないなぁ・・・) 「tbl2」の行を削除した場合に、「common_tbl」の行も自動で削除させたいと思うのですが、 どのように外部キーを設定するのか(どこに設定するのか)が分かりません。 「common_tbl」に「tbl1」のtbl1_idと「tbl2」のtbl2_idを それぞれ持たせるのはたぶん違うと思いますし・・・ この場合の正しいテーブル構成を含めてアドバイスをお願いしたいです。 例: 「tbl2」のtbl2_idが2の行を削除したら、 「common_tbl」のcommon_idが3の行も削除したい(外部キーで自動的に) テーブル「tbl1」 +------+---------+----------+ | tbl1_id| tbl1_col1 |common_id | +------+---------+----------+ |  1  |   値1  |   1    | +------+---------+----------+ テーブル「tbl2」 +------+---------+----------+----------+ | tbl2_id| tbl2_col1 | tbl2_col2 |common_id | +------+---------+----------+----------+ |  1  |   値1  |   値1  |    2   | +------+---------+----------+----------+ |  2  |   値2  |   値2  |    3   | +------+---------+----------+----------+ テーブル「common_tbl」 +----------+---------+----------+ |common_id |   col1  |   col2  | +----------+---------+----------+ |  1     |   値1  |   値1  | +----------+---------+----------+ |  2     |   値2  |   値2  | +----------+---------+----------+ |  3     |   値3  |   値3  | +----------+---------+----------+

    • ベストアンサー
    • MySQL
  • 複数検索時の条件分岐について

    環境:php5、mysql5 条件検索はできるのですが検索状況の違いによる条件分岐について どなたがアドバイスをお願いします。 $sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか WHILE以降を変更する気がするのですがやり方がよくわかりません。 よろしくお願いします。 以下設定 テーブル  :tbl_item [int] フィールド1:item_id [int] フィールド2:cate_id [int] ←他テーブル(名前に変換) フィールド3:item_name [varchar] フィールド4:price [decimal] フィールド5:stock_id [int]   ←他テーブル 条件1:cate_id(プルダウン)を検索条件に加えている時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); 条件2:cate_id(プルダウン)を検索条件に加えていない時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ・ ・ アイテム数 <?= $num_rows ?> 種類 ・ ・ <? WHILE ( $item = mysql_fetch_array( $result ) ) { ?> ・ ・ ・ <? $n ++; } ?>

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • select insertで複数テーブルから値を取得したい

    環境:oracle9i select insertで、2つのテーブルから値を取得して、1つのテーブルにinsertすることは可能でしょうか? たとえば、以下の場合、どのようなSQL文を書けばよいか、アドバイスいただけますでしょうか。 よろしくお願いします。 insertしたいテーブル:A Aテーブルの項目:o,p,q,r,s,t 値を取得するテーブル:B,C Bテーブルの項目:o,p,q,r Cテーブルの項目:o,p,s,t oとpが主キーになっていて、それらが一致するBとCのデータを あわせて、Aにinsertしたいと思っています。 insert into A(o,p,q,r,s,t) select このあと、どのように書けばよいのかがわかりません。

  • mysql危険回避(1 OR effective)

    mysqlの危険回避の質問です。 (私がした1つ前に質問したものでは、解決しなかったので再度表現を変えて行います。) mysqlでwhere句の値に 1 OR effective=0 が入ると危険であり、シングルクオテーションで回避できる、とあるサイトでみました。 それを踏まえ、それまで以下の(1)で動いていたものを(2)にしたら、動かなくなりました。 そこで質問です。 (初めてphpに触れた人に教えるレベルで、かなり噛み砕いて教えていただけたら幸いです。) ■(1)はそのままでは危険という認識でよろしいですか? ■(2)はなぜ動かないのでしょうか? ■(1)を危険のない(もしくは可能な限り危険のない)書き方をするとしたらどうしたら いいでしょうか?(PDOで書く事!やmysqliがいい、というのは知っています。 どうしてもmysql_real_escape_stringを使わなくてはいけないという条件があったと 想定して強引にやるとしたらどうか、という事でお答えをいただければと思います。) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $id = "'" . mysql_real_escape_string($id) . "'"; $password = "'". mysql_real_escape_string($password) . "'"; $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",$id , $password ); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 携帯サイトを構築しております。登録画面にてSELECT+INSERT文

    携帯サイトを構築しております。登録画面にてSELECT+INSERT文にてDuplicate entry for keyというエラーがでてしまいます。解決方法がわからない状態です。ご教授お願いいたします。ちなみにIDはPRIMARYでauto_incrementで、mailとNoは個別でUNIQUE KEYに設定しております。 <?php // データベースに接続する $conn = mysql_connect("xxxx","xxxxx","123456") or die("接続エラー"); mysql_query("set character set sjis") or die("エラー"); mysql_select_db("aaa") or die("接続エラー"); //すでに登録済みかどうか調べる $sql = sprintf("SELECT mail,No FROM users where (mail = '%s')or(No = '%s')", mysql_real_escape_string($mail), mysql_real_escape_string($No)); $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $count = mysql_num_rows($res); //データが抽出できたときはすでに登録済みと判断できる if($count > 0) { print '<font color="red">既に登録されております</font><br /> <a href="login.html">こちらからログインしてください</a>'; } ?> <?php DBに接続 $con = mysql_connect("xxxxxxx","xxxxxx","4123456")or die(mysql_error()); mysql_query("set character set sjis") or die("エラー"); mysql_select_db("xxxxxxx")or die(mysql_error()); $sql = "INSERT INTO users(name,kana,nick,sex,pass,mail,No,date)VALUES('".$name."','".$kana."','".$nick."','".$sex."','".$pass."','".$mail."','".$No."',NOW())"; $res = mysql_query($sql) or die(mysql_error()); mysql_close($con); function mysql_insert_string($table_name, $values) { $names = '`'.implode('`,`', array_keys($values)).'`'; $values = implode(',', array_map(mysql_escape, $values)); return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});"; } function mysql_escape($value) { switch (true) { case is_null($value) : return 'NULL'; case is_bool($value) : return $value ? 1 : 0; case is_numeric($value) : return $value; default : return "'".mysql_real_escape_string($value)."'"; } } ?>

    • 締切済み
    • PHP
  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • チェックボックスでチェックした配列の値をDBに。

    チェックボックスでチェックした配列の値を データベースのカラム名と照らし合わせて 一致する所に「1」を入れたいのですが、うまくいきません。 PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 どうしたら、入れることができるでしょうか? ご教授、よろしくお願いいたします。 1 送るページ $sql = "select * from `class_tbl`"; $rest = mysql_query($sql, $con); while($col = mysql_fetch_array($rest)) { $classID = $col["classID"]; $class_name = $col["class_name"]; $sql = "select * from `member_sub_tbl` where `ID` ='$ID'"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $kekka = $col["$classID"]; if($kekka==1) { echo <<<EOF <input type="checkbox" name="classID[]" value="$classID" checked/> $class_name EOF; } else{ echo <<<EOF <input type="checkbox" name="classID[]" value="$classID" /> $class_name EOF; } } } echo <<<EOF <input name="ID" type="hidden" value="$ID" /> EOF; 2 受けるページ $ID=$POST["ID"]; $classID=$POST["classID"]; var_dump($_REQUEST); 以下のように表示しています。 array(3) { ["classID"]=> array(10) { [0]=> string(4) "1010" [1]=> string(4) "1050" [2]=> string(4) "1110" [3]=> string(4) "1182" } ["sn"]=> string(2) "45" ["PHPSESSID"]=> string(32) "********************" } 「ID」の行に、配列の「1010」「1050」と 「member_sub_tbl(テーブル)」の「カラム名」を比較して、一致する所に「1」を入れたいのですがうまくいきません。 ※update をしたいのです。 試行錯誤していますが、方法が分かりません。 ご教授、よろしくお願いいたします。

    • ベストアンサー
    • PHP