質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

4492閲覧

配列の追加が途中で止まってしまう

m_s

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/01/23 07:32

編集2017/01/23 17:24

下のPHPのwhile文ループ内のif文を1回通過するとそれより先のループで配列の追加処理が行われなくなってしまいます、ただelse文にすべての処理が通ると追加処理が全てのループで行われるようなのですがなぜそうなってしまうのかの理由がわからないので教えてほしいです。詳細説明はPHPコードの下にあります。

PHP

1<?php 2//途中から 3mysql_connect($db_host, $db_username, $db_password, $db_name); 4mysql_select_db($db_name) or die (mysql_error()); 5mysql_set_charset('utf8'); 6 7 8$sql = "SELECT id,state,mail_from_adress,mail_to,mail_subject,mail_text,mail_answer,report_result,mail_URL FROM `attack_mail_db`"; 9$query = mysql_query($sql) or die(mysql_error()); 10 11while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { 12 if($row["state"] == 1) { 13 $report_check_num = 0; 14 $report_check_correct_count = 0; 15 16 $i = 1; 17 while ($row["report_result"][$i] != "]") { 18 $report_check_num++; 19 if ($row['report_result'][$i] == 0) { 20 $report_check_correct_count++; 21 } 22 $i++; 23 } 24 $report_check_num = $report_check_num - ($report_check_num - 1) / 2; 25 26 $report_check_correct_rate = bcdiv($report_check_num, $report_check_correct_count, 2); 27 $mail_id = $row["id"]; 28 $sql = "UPDATE `attack_mail_db` SET `correctRate` = '$report_check_correct_rate' WHERE `attack_mail_db`.`id` = '$mail_id'"; 29 $query = mysql_query($sql) or die(mysql_error()); 30 } 31 else { 32 $report_check_correct_rate = 0; 33 } 34 35 $mailList [] = array( 36 'id' => $row["id"], 37 'state' => $row["state"], 38 'cometime' => "", 39 'mailSubject' => "先日相談したメニューについて", 40 'mailFrom' => "飯田太郎", 41 'mailTo' => "(株)○○食品", 42 'mailName' => "masaki@gmail.com", 43 'correctRate' => $report_check_correct_rate,//count($row["report_result"]),//$report_check_num, 44 ); 45 46} 47 48 $result = json_encode($mailList, JSON_UNESCAPED_UNICODE); 49 printf($result); 50?>

###説明の詳細
SQL文はきちんと実行できており、エラーは特に無いのですが、SELECT文でDBから取得したデータを配列$Listに格納する際に、
なぜか、while文内の

PHP

1if($row["state"] == 1){ 2}

内の処理を通った場合、それより先のループで配列$Listにデータが格納されなくなってしまいます。(下の処理が実行されない)
また、$List内のデータが原因なのではないかと思ったのですがそうでもない様でした。
ただ、else文に全てwhile文の各ループが通った時は全ての新しいデータが配列$Listに格納されました

PHP

1$List [] = array( 2 'Name' => "aaaaaaaaaa", 3 );

###(追記)原因を探っていると・・・

PHP

1if($row["state"] == 1){ 2}

内のUPDATEをコメントアウトすると全てのループでデータが格納されたのでUPDATEがおかしいことがわかりました
おそらく、UPDATEをPHP内で複数回呼ぶとだめっぽいんですけどその予想は正しいでしょうか?
(

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/01/23 08:32

if($row["state"] == 1){ } 内のコードを省略せず全て、記載してください。
namimon

2017/01/23 08:34

if($row["state"] == 1)内の処理で結果が変わるようでしたら、その処理を具体的にお願いします。
m_s

2017/01/23 16:10

新しく情報を追加しました
guest

回答4

0

Before

php

1$sql = "UPDATE `attack_mail_db` SET `correctRate` = '$report_check_correct_rate' WHERE `attack_mail_db`.`id` = '$mail_id'"; 2$query = mysql_query($sql) or die(mysql_error());
After

php

1$sql = "UPDATE `attack_mail_db` SET `correctRate` = '$report_check_correct_rate' WHERE `attack_mail_db`.`id` = '$mail_id'"; 2mysql_query($sql) or die(mysql_error());

手元に環境がないため未検証ですが、UPDATE文の実行時に変数$queryに値を再代入してしまっていることが原因と思われます。

投稿2017/01/23 19:07

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

KiyoshiMotoki様の解答にあります通り、

$sql = "SELECT id,state,mail_from_adress,mail_to,mail_subject,mail_text,mail_answer,report_result,mail_URL FROM `attack_mail_db`"; $query = mysql_query($sql) or die(mysql_error());

のループ内で、同じ変数名で

$sql = "UPDATE `attack_mail_db` SET `correctRate` = '$report_check_correct_rate' WHERE `attack_mail_db`.`id` = '$mail_id'"; $query = mysql_query($sql) or die(mysql_error());

という処理をしているのが原因だと思われます。
それはさておき、mysql関数は現在非推奨となっていますので、 PDOやMySQLiに書き換えることをお勧めします。

蛇足ですが、ここに書き込む前にテーブル名は変えてもよかったかもしれませんね。

投稿2017/01/24 00:07

namimon

総合スコア726

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最初にすべてを配列に入れてから、次 UPDATEされるのはどうでしょうか?

php

1while(($row = mysql_fetch_array($result))) { 2 $rows[] = $row; 3} 4foreach ($rows .... 5 UPDATE 6} 7

投稿2017/01/23 08:55

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHP

1if($row["state"] == 1) { 2 3}

ここ、なにもせずにカッコ閉じちゃってますけど、これは質問文の貼り付けミスかなにかでしょうか?

投稿2017/01/23 08:09

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_s

2017/01/23 16:11

いや、あまり内容を知られたくなかったもので・・・・載せませんでしたすみません その中の情報を再度新しく載せました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問