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

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

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

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

PHP

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

Q&A

解決済

4回答

2422閲覧

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

pegy

総合スコア243

HTML5

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

PHP

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

0グッド

0クリップ

投稿2017/03/16 09:04

編集2017/03/16 09:41

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

ここで最下部の<a href="a_input_all.php" class="button">戻る</a>について
Ⅰ.ループ処理を行っている、処理_Cを3回までのループさせている場合には表示され4回以上の処理を行う場合には
これが表示されなくなります。
Ⅱ.要素検証を行うと3回までのループは適切に処理されていることが確認でき、4回以上の処理の場合にはその直前の

<?php endif;?>の前々の結果しか出力されておりません。

Ⅲ.ループで処理している内容はそこそこ重たい処理、(3回ループでも10秒以上を要します)と思われます。
Ⅳ.ChromeでもIEでも同じ手続きをしてみましたが、結果は同様でした。

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

PHP

1 2 3<!DOCTYPE html> 4<html> 5 <head> 6 <meta charset="utf-8"> 7 <title>確認画面</title> 8 <link rel="stylesheet" href="./C_css/style.css"> 9 </head> 10 <body> 11 12<?php if (empty($_SESSION['correct'])):?> 13処理_A 14 <?php else:?> 15 <?php if(is_array_empty($resultError))//配列の要素が全て空であるか検証する関数:?> 16 処理_B 17 <?php else:?> 18 処理_C 19 <?php endif;?> 20<?php endif;?> 21 22<a href="a_input_all.php" class="button">戻る</a> 23</body> 24</html>

PHP

1処理_Cの詳細 2<?php else:?> 3 <?php 4 for ($i=$start; $i <$end ; $i++) { 5 $counting=count($resultAlter[$secid[$i]]); 6 echo "<b><u>結果レポート:".$secid[$i]."</u></b><br>"; 7 echo '<div style=" width:500px; border:1px solid #000000; padding:10px">'; 8 echo "登録が完了しました。".$counting."事業年度分の内訳は下記の通りです"."<br>"; 9 for ($r=0; $r <$counting ; $r++) { 10 $counting1=count($resultAlter[$secid[$i]][$r]); 11 $ttl[]=$counting1; 12 echo "■".$scan[$r+2].":".$counting1."件"."<br>"; 13 14 try 15 { 16 $stmt_A = $pdo->prepare("INSERT IGNORE INTO all_fsdb 17 (entityName,entityCode,taxonomyNameEng,taxonomyNameJpn,amout,amtDecimals,fsCategory,taxonomySource,accumName,yearEnd,period,unq) 18 VALUES (:entityName,:entityCode,:taxonomyNameEng,:taxonomyNameJpn,:amout,:amtDecimals,:fsCategory,:taxonomySource,:accumName,:yearEnd,:period,:unq)"); 19 for ($u=0; $u <$counting1 ; $u++) { 20 $stmt_A->BindValue(':entityName',$result[$secid[$i]][$r][$u][11],PDO::PARAM_STR); 21 $stmt_A->BindParam(':entityCode',$result[$secid[$i]][$r][$u][12],PDO::PARAM_INT); 22 $stmt_A->BindValue(':taxonomyNameEng',$result[$secid[$i]][$r][$u][1],PDO::PARAM_STR); 23 $stmt_A->BindValue(':taxonomyNameJpn',$result[$secid[$i]][$r][$u][5],PDO::PARAM_STR); 24 $stmt_A->BindParam(':amout',$result[$secid[$i]][$r][$u][2],PDO::PARAM_INT); 25 $stmt_A->BindParam(':amtDecimals',$result[$secid[$i]][$r][$u][3],PDO::PARAM_INT); 26 $stmt_A->BindValue(':fsCategory',$result[$secid[$i]][$r][$u][4],PDO::PARAM_STR); 27 $stmt_A->BindValue(':taxonomySource',$result[$secid[$i]][$r][$u][6],PDO::PARAM_STR); 28 $stmt_A->BindValue(':accumName',$result[$secid[$i]][$r][$u][7],PDO::PARAM_STR); 29 $stmt_A->BindParam(':yearEnd',$result[$secid[$i]][$r][$u][8],PDO::PARAM_INT); 30 $stmt_A->BindParam(':period',$result[$secid[$i]][$r][$u][9],PDO::PARAM_INT); 31 $stmt_A->BindValue(':unq',$result[$secid[$i]][$r][$u][10],PDO::PARAM_STR); 32 $stmt_A->execute(); 33 } 34 } 35 catch (PDOException $e) 36 { 37 var_dump($e->getMessage()); 38 } 39 40 } 41 echo ("<br>合計で".array_sum($ttl)."件のレコードが登録されました"."<br>"); 42 $ttl=array(); 43 if (empty($resultError[$secid[$i]])) { 44 }else{ 45 echo '<p style="color:#ff0000;">(注)以下の'.count($resultError[$secid[$i]]).'件のレコードを除外して 登録いたしました<p><br>'; 46 prep($resultError[$secid[$i]]); 47 } 48 echo '</div>'; 49 } 50 ?> 51 <br> 52 <a href="a_input_all.php" class="button">戻る</a> 53 <?php 54 $_SESSION = array(); 55 if (isset($_COOKIE[session_name()])) { 56 setcookie(session_name(), '', time()-42000, '/');} 57 session_destroy(); 58 ?> 59<?php endif;?>

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

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

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

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

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

toutou

2017/03/16 09:17

ループってどれ?
pegy

2017/03/16 09:28

処理_Cのなかで詳細まではより煩雑になると考え明記いたしませんでした。for分が処理_Cには書かれているとご理解を頂ければ幸いです。
退会済みユーザー

退会済みユーザー

2017/03/16 09:33

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

2017/03/16 09:39

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

2017/03/16 09:43

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

回答4

0

ベストアンサー

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 10:29

編集2017/03/20 07:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pegy

2017/03/16 13: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処理の書き方は今調べ中です。 度々恐れ入りますが、よろしくお願い申し上げます。
guest

0

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

投稿2017/03/16 09:19

zico_teratail

総合スコア907

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

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

pegy

2017/03/16 13:52

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

0

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

投稿2017/03/16 10:03

watanabe9434

総合スコア26

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

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

pegy

2017/03/16 13:52

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

0

出力された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 09:12

編集2017/03/17 00:36
sha

総合スコア141

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

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

pegy

2017/03/16 09:26

ご回答まことに「有難うございます。 ①確かに</div>の閉じタグが消えており、それ以降のhtmlが出力処理されていないように見えます。しかしながらループ回数や処理の重さによって、相違するということが考えられるのでしょうか? ②可能なら重い処理とHTML出力の処理を分けるというのは処理部分のphpを外部ファイルにしてインクルードするといったイメージでしょうか?
sha

2017/03/17 00:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問