MYSQLにINSERTできない問題とは?

このQ&Aのポイント
  • MYSQLのWHERE文の中でINSERTができない問題について相談です。
  • メールを指定した時間に送信するための手順がうまくいかず困っています。
  • 送信先メールアドレスを抽出しながらMYSQLへのINSERTを行いたいが、一度しかINSERTされません。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • yamada404
  • ベストアンサー率56% (9/16)
回答No.2

説明が不足していたようですいません。 最初に select した際には、 customer のテーブルの情報が 5件 $rst にデータが積み込まれているかと思います。 (該当レコードがあればの話ですが) それの積み込まれた情報を一件ずつ while文にて処理されて行く処理イメージだと思ったのですが insert した際に 5 件のデータが積み込まれたデータが insert の実行結果の一件に変更されてしまっている様に見えます。 続けて処理をされるのであれば、 insert した結果値は $rst に受け取らないで別変数で受けて処理する 形になるかと思います。

kiyomidesuyo
質問者

お礼

出来ました!! $rst を $result に変えてみました。 print $sql; をwhile文 の外に置いてみていたので、最後の一回しか 表示してないので、変えてもうまく行かないなあ、と思っていました。 しかし、データベースを良く見てみると全部インサートできていました。 よく考えると、頂いた回答が理解できます! 大変分かりやすい回答ありがとうございました!!

kiyomidesuyo
質問者

補足

はい! まさにその通り、結果をインサートしたいのです。 while文は5回回っていますので、その中にインサート文を入れたらいいと単純に考えていました。 while文の中で $name などは5回回っていて、[print $name;] とすると5人分出てきます。 別変数で受け取るとはどのようにしたら良いでしょうか? すみません、宜しくお願いいたします。

その他の回答 (1)

  • yamada404
  • ベストアンサー率56% (9/16)
回答No.1

最初のselectした $rst = mysql_query($sql , $con); の結果セットの中に INSERT INTOの結果セットを入れているから中身が変わってないですか? selectした結果の$rstと insertした結果の$rstと見比べてみては?

kiyomidesuyo
質問者

補足

アドバイスありがとうございます!! 早速見比べてみました。 select * from.......は「phpMyAdmin」で実行するとキチンと期待する結果です。 PHPで実行すると。 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/v・・・・・・・・・/select33.php on line 78 (78行目は  while($col = mysql_fetch_array($rst)) { です。) INSERT INTO mail_queue_timer (timermailID,customerID,jikan ,sender , recipient ,headers, body ) VALUES (1244870735, 1,10 , "送信元メールアドレス" , "1001@********com" ,"タイトル" , "本文" ) そして、INSERT INTO の中身は「一番目の結果」でした。そしてそれはデータベースに入っていました。 (1件だけ) すみません、何が間違っていますでしょうか?

関連するQ&A

  • 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
  • if文で、レコードが無い場合だけ変数が表示しなくなる

    いつもお世話になっています。 やりたい事から説明します。 リストボックスで絞込みを2段階にしています。 その2段階目で、レコードがあればきちんと表示するのですが 無い場合に、一段階戻したいのです。 やってみた事。 前のページから、POST で 【genreno = $sgenreno】を送っています。 うまく表示するのですが、レコードが無いときにうまく表示できません。 *レコードが無いので、前のページに戻るリンクを表示したいのです 下は私なりに書いてみたのですが、if文にしない時はうまくいくのですが if文にすると、レコードが無い場合にだけ変数が表示しません。 **変数以外の部分は表示するので、分岐は出来てると思うのですが 変な事をしているのだと思いますが、色々やってみてもうまくいきません。 宜しくアドバイスをお願いいたしますm(__)m <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); //1ページ当りの表示件数を設定します $PAGESIZE = 10; if (!isset($page)) { $sql = "select count(*) as cnt from テーブルA where genreno = $sgenreno"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $tcnt = $col["cnt"]; mysql_free_result($rst); $page = 1; } $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "$tcnt 件の登録があります。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示しています</p>"; } else { $pagehead .= "$tcnt] を表示しています</p>"; } //1ページ分だけ抽出するSQL文を組み立てます $sql = "select * from テーブルA where genreno = $sgenreno order by id desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE";    $rst = mysql_query($sql, $con); //結果セットからデータを読み込みます while($col = mysql_fetch_array($rst)) { $genreno=$col["genreno"];  $genre=$col["genre"]; $sgenre=$col["sgenre"]; } //△△△△△△△うまくいかないのはこの部分△△△△△△△ if($tcnt == 0 ){ $navi .= "<a href='1setubi_search.php?genreno=$genreno'>【".$genre."】"."</a>"."【".$sgenre."】は登録がありません。" ; } else{ $navi .= "今表示しているのは<a href='1setubi_search.php?genreno=$genreno'>【".$genre."】"."</a>"."【".$sgenre."】です。" ; //↑この行はレコードがある場合は表示します } mysql_free_result($rst); //△△△△△△△うまくいかないのはこの部分まで△△△△△△△

    • ベストアンサー
    • PHP
  • SELECT文で取り出したデータを文字列を別のtableのひとつのフィールドへ

    宜しくお願いいたします。 PHP5 Mysql5 で運用しています。 $sql = "SELECT * FROM member WHERE ****** $rst = mysql_query($sql, $con); で取り出して while($col = mysql_fetch_array($rst)) { print $col['mail']; } これで表示はさせられるのですが、 この出てきたデータを [ , ] で区切って全部一まとめにして。 次の画面で、別のテーブルの一つのフィールドに 全部入れたいのですが判りません。。 表示はさせられるのだから、それを一まとめにしては 出来るつもりでしたが。どうしても判りません。 どのようにしたらよろしいでしょうか? アドバイスなど、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列をmysqlに保存

    チェックボックスで複数選択されたチェックボックスの値を配列としてmysqlに保存したいのですがどうも上手くいきません。いろいろweb上で探してみましたが、serialize/unserialize関数?を使うのでしょうか?ちなみに抽出も上手くいきません。どなたか教えていただけませんか?宜しくお願いします。以下スクリプトの一部です。 //配列 <input type='checkbox' name='op[]' value='ac'>ac <input type='checkbox' name='op[]' value='pw'>pw <input type='checkbox' name='op[]' value='cd'>cd //データベースに登録 $sql="insert into test (test) values (\"$op\")"; mysql_query($sql,$con); //データベースから配列として抽出 $sql = "select * from op"; $rst = mysql_query($sql,$con); $col = mysql_fetch_array($rst); $op = $col[op];

    • ベストアンサー
    • PHP
  • mysql insert文

    恐れ入ります。 input 送信で、perl にてレコードをinsertしたいのですが、なかなかうまくいきません。 <form action="./xxx.cgi" method="post"> <input type ="hidden" name=num></input> <input type="text" name="col1"></input> <input type="text" name="col2"></input> <input type="text" name="col3"></input> <input type="submit" value="登録"> </form> として送信して、 $sql = "insert into kensou(num,col1,col2,col3) "; $sql.="values('$form{num}','$form{col1}','$form{col2}','$form{col3}')"; # SQL実行 $sth = $db->prepare($sql); if(!$sth->execute){ print "SQL失敗\n"; exit; } で受け取ろうとしているのですが、うまくいきません。 どなたかご教授いただけないでしょうか。

  • 別テーブルから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

    • ベストアンサー
    • MySQL
  • select文

    こんばんは。PHPでデータベースからレコードとフィールドを表として取り出そうとしてますが、うまく行きません。 MySQLへの接続はうまくいってると思うので、while文が間違ってるのでしょうか?PHPのバージョンはPHP Version 4.4.2です。 よろしくお願いしますm(__)m <?php require_once("dbini.php"); $con = mysql_connect($server, $user, $pass); $select = mysql_select_db($dbname, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $body = "<table border='0' cellpadding='5' cellspacing='5' width='500'><tr><td>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<b><font size='+2'>".$col["title"]."</font></b>" $body .= "</td></tr>"; $body .= "<tr><td colspan='2'>".$col["article"]."</td></tr></table>"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html> <body> <?= $body ?> </body> </html>

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

    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
  • mysql_num_rowを繰り返したい

    ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、 mysql_num_row()で各選択肢の件数を抽出したいのですが。 選択肢は1~5の数値(int型)でanテーブルに入っています。 for ($i = 1; $ <= 5; $++) { $rst = mysql_query("SELECT * FROM an WHERE field=$i", $con); $kotae.$i = mysql_num_row($rst); } このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。  文法が間違っているからだと思うのですが。上記のようなことをやりたいのです。  forを使わないでやると、 $rst = mysql_query("SELECT * FROM an WHERE field=1",$con); $kotae1 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=2",$con); $kotae2 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=3",$con); $kotae3 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=4",$con); $kotae4 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=5",$con); $kotae5 = mysql_num_rows($rst); です。  forを使って楽にやりたい場合はどうすればよいでしょうか 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP+mysqlでSQL文に文字数制限はありますか?

    基本的な質問で申し訳ありません。 $sql="......";にSQL文を書き $rst = mysql_query($sql,$con); $col = mysql_fetch_array($rst); として($conはmysql_connect関数の結果です) WEBを作成しているのですが、ある程度以上長いSQL文を書くと正常に作動しません。(短いSQLであれば正常に差作動します。)  当然SQL文自体もmysqlで直接実行すると作動するものです。SQL文自体がUNIONや副問い合わせを多用し250行程度になってしまったためかと考えていますが、文字数制限等があるのでしょうか?PHPには変数宣言が無いと認識しているのでどう対処して良いかわかりません。 SQLを分解できないとすると何か良い方法はありますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP