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

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

ただいまの
回答率

90.33%

  • PHP

    21341questions

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

  • HTML5

    4300questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHPで出力したHTMLがループ回数(重さ?)によって一部処理されない現象

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 606

pegy

score 70

お世話になります。
PHPからHTMLへの出力で不可思議な現象があったため、確認をさせてください。
PHPのコードの概略は以下のとおりです。

ここで最下部の<a href="a_input_all.php" class="button">戻る</a>について
Ⅰ.ループ処理を行っている、処理_Cを3回までのループさせている場合には表示され4回以上の処理を行う場合には
これが表示されなくなります。
Ⅱ.要素検証を行うと3回までのループは適切に処理されていることが確認でき、4回以上の処理の場合にはその直前の
<?php endif;?>の前々の結果しか出力されておりません。
Ⅲ.ループで処理している内容はそこそこ重たい処理、(3回ループでも10秒以上を要します)と思われます。
Ⅳ.ChromeでもIEでも同じ手続きをしてみましたが、結果は同様でした。

という現状なのですが、なぜこのような現象が起きるのか分からなかったため
もしご経験やアドバイスがあればお尋ねしたく思います。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>確認画面</title>
    <link rel="stylesheet" href="./C_css/style.css">
  </head>
  <body>

<?php if (empty($_SESSION['correct'])):?>
処理_A
  <?php else:?>
    <?php if(is_array_empty($resultError))//配列の要素が全て空であるか検証する関数:?>
       処理_B
    <?php else:?>
       処理_C
    <?php endif;?>
<?php endif;?>

<a href="a_input_all.php" class="button">戻る</a>
</body>
</html>
処理_Cの詳細
<?php else:?>
 <?php
   for ($i=$start; $i <$end ; $i++) {
    $counting=count($resultAlter[$secid[$i]]);
    echo "<b><u>結果レポート:".$secid[$i]."</u></b><br>";
    echo '<div style=" width:500px; border:1px solid #000000; padding:10px">';
    echo "登録が完了しました。".$counting."事業年度分の内訳は下記の通りです"."<br>";
     for ($r=0; $r <$counting ; $r++) {
       $counting1=count($resultAlter[$secid[$i]][$r]);
       $ttl[]=$counting1;
        echo "■".$scan[$r+2].":".$counting1."件"."<br>";

          try
                 {
                    $stmt_A = $pdo->prepare("INSERT IGNORE INTO all_fsdb
                    (entityName,entityCode,taxonomyNameEng,taxonomyNameJpn,amout,amtDecimals,fsCategory,taxonomySource,accumName,yearEnd,period,unq)
                    VALUES (:entityName,:entityCode,:taxonomyNameEng,:taxonomyNameJpn,:amout,:amtDecimals,:fsCategory,:taxonomySource,:accumName,:yearEnd,:period,:unq)");
                for ($u=0; $u <$counting1 ; $u++) {
                    $stmt_A->BindValue(':entityName',$result[$secid[$i]][$r][$u][11],PDO::PARAM_STR);
                    $stmt_A->BindParam(':entityCode',$result[$secid[$i]][$r][$u][12],PDO::PARAM_INT);
                    $stmt_A->BindValue(':taxonomyNameEng',$result[$secid[$i]][$r][$u][1],PDO::PARAM_STR);
                    $stmt_A->BindValue(':taxonomyNameJpn',$result[$secid[$i]][$r][$u][5],PDO::PARAM_STR);
                    $stmt_A->BindParam(':amout',$result[$secid[$i]][$r][$u][2],PDO::PARAM_INT);
                    $stmt_A->BindParam(':amtDecimals',$result[$secid[$i]][$r][$u][3],PDO::PARAM_INT);
                    $stmt_A->BindValue(':fsCategory',$result[$secid[$i]][$r][$u][4],PDO::PARAM_STR);
                    $stmt_A->BindValue(':taxonomySource',$result[$secid[$i]][$r][$u][6],PDO::PARAM_STR);
                    $stmt_A->BindValue(':accumName',$result[$secid[$i]][$r][$u][7],PDO::PARAM_STR);
                    $stmt_A->BindParam(':yearEnd',$result[$secid[$i]][$r][$u][8],PDO::PARAM_INT);
                    $stmt_A->BindParam(':period',$result[$secid[$i]][$r][$u][9],PDO::PARAM_INT);
                    $stmt_A->BindValue(':unq',$result[$secid[$i]][$r][$u][10],PDO::PARAM_STR);
                    $stmt_A->execute();
                    }
                  }
        catch (PDOException $e)
                  {
                  var_dump($e->getMessage());
                  }

              }
          echo ("<br>合計で".array_sum($ttl)."件のレコードが登録されました"."<br>");
          $ttl=array();
          if (empty($resultError[$secid[$i]])) {
          }else{
            echo '<p style="color:#ff0000;">(注)以下の'.count($resultError[$secid[$i]]).'件のレコードを除外して        登録いたしました<p><br>';
            prep($resultError[$secid[$i]]);
          }
          echo '</div>';
        }
    ?>
    <br>
    <a href="a_input_all.php" class="button">戻る</a>
    <?php
    $_SESSION = array();
    if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');}
    session_destroy();
    ?>
<?php endif;?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2017/03/16 18:33

    for文でやってることは、例えばDBにクエリーを実行しているとか、ファイルIOしているとか、どういうことでしょうか。って都度質問するのが面倒なので当たり障りない範囲のソースコードはもうちょっと貼ってほしい。

    キャンセル

  • pegy

    2017/03/16 18:39

    コメントありがとうございます。それでは早速コードを開示させて頂きます。読みづらいかもしれませんが、宜しくお願い申しあげます。

    キャンセル

  • pegy

    2017/03/16 18:43

    様々な角度で試しているのですが、phpの処理が途中で終わっていて、それ以降が実行されていない模様です。phpの処理、htmlへの出力上エラーを返さずにこのような減少が起きるのかがなぞではあります。

    キャンセル

回答 4

checkベストアンサー

+2

webサーバーのエラーログやアクセスログをまず確認してほしい。
思い込みで場当たり的な行動をしても解決しにくいので、現象を正確に捉えるようにしましょう。
エラーログへの情報が少なければ、設定ファイルを直してログ出力レベルを変更しましょう。

その上で、どういうエラーだったか、
実行時間が足りずに打ち切っているのか、
メモリ不足で打ち切っているのか、
確認した上で対策を講じましょう。

それと、処理CでINSERT INTO文を実行していますが、
1行ごとに実行していると時間が掛かるでしょうね。
VALUES句を複数一度に書いてしまうのはダメなんでしょうか。
INSERT INTO ~ VALUES (~), (~), (~), (~)
みたいな。
VALUES句要素を配列に格納しておいて最後にimplode()で連結してしまうとか。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5 INSERT 構文

にあるように、VALUES句はVALUES (~), (~), (~), (~)という風に書けることがわかります。

あと、INSERT INTO文実行数はたいした数じゃないのに遅い、
遅くてPHPの実行が打ち切られてしまう、
ということであれば、こんな情報も役に立つかもしれません:

Mysqlでinsert、delete、updateが遅い場合の対策 - Qiita

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 22:51

    ご回答ありがとうございます。
    webサーバーのエラーログやアクセスログについては承知をいたしました。
    また、insert into文について、恥ずかしいながら初めて知りました。この2時間くらい勉強し下記のような簡単なコードは書けるようになりました。

    a=1;
    $b="sato";
    $c="green";
    $d=2;
    $e="tanaka";
    $f="pink";
    $ary[]=array($a,$b,$c);
    $ary[]=array($d,$e,$f);

    try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql='INSERT INTO comple (id,name,color) VALUES (?,?,?)';
    $stmt= $pdo->prepare($sql);
    foreach ($ary as $key) {
    $stmt->execute(array($key[0],$key[1],$key[2]));
    }
    これでも処理は行えるのですが、これもexecuteを複数回行ってる時点で処理が重いのでしょうか?
    VALUESを複数回書く場合のexecute処理の書き方は今調べ中です。
    度々恐れ入りますが、よろしくお願い申し上げます。

    キャンセル

+2

単にPHP実行時間の制限にかかっているだけでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 22:52

    ご指摘の通りでした。ご回答をいただき、ありがとうございます。

    キャンセル

+1

出力されたHTMLの確認ができないので想像ですが
phpの条件内で出力されるタグが途中閉じていないので
以降のタグが表示されていないように見えるのではないでしょうか?
ソースで確認するとどこが原因か分かりやすいと思います。

可能なら重い処理とHTML出力の処理を分けると良いと思います。

トランザクションを使わないのであれば処理が重くて落ちたのか
特定のレコードの登録でエラーが起きているかもわかると思いますので
こちらも他の方が言われるようログや登録後のテーブルデータを検証すると
原因がわかると思います。
<?php if (empty($_SESSION['correct'])):?>
処理_A
<?php else:?>
<?php if(is_array_empty($resultError))//配列の要素が全て空であるか検証する関数:?>
処理_B
<?php else:?>
処理_C
<?php endif;?>
<?php endif;?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>確認画面</title>
<link rel="stylesheet" href="./C_css/style.css">
</head>
<body>
<?php
結果に従ってHTMLを整形して出力
?>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 18:26

    ご回答まことに「有難うございます。
    ①確かに</div>の閉じタグが消えており、それ以降のhtmlが出力処理されていないように見えます。しかしながらループ回数や処理の重さによって、相違するということが考えられるのでしょうか?

    ②可能なら重い処理とHTML出力の処理を分けるというのは処理部分のphpを外部ファイルにしてインクルードするといったイメージでしょうか?

    キャンセル

  • 2017/03/17 09:36


    1.ループ回数や処理の重さについては他の方の回答にあるようにメモリ不足などによる処理落ちではないでしょうか。
    2.回答に追記しました。

    キャンセル

+1

phpのメモリ不足で落ちているのでは?と直感的に思いました。
php.iniのmemory_limitを増やしてみたらどうでしょう?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/16 22:52

    ご指摘の通りでした。ご回答をいただき、ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21341questions

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

  • HTML5

    4300questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。