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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

4670閲覧

PHPで画面遷移が遅い

Kobi0927i

総合スコア8

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/09/11 23:41

編集2017/09/12 00:36

PHP+JAVASCRIPTでプログラムを書いていますが
画面の遷移が遅くて困っています。

テキストボックスに入力した値を、JAVASCRIPTで拾い
JAVASCRIPTからPHPでデータベースに書き込む処理をしていますが

上記の画面で何もしないで、別の画面に遷移させると
問題なく直ちに遷移しますが

上記の画面でテキストボックスに値を入れ
画面を遷移させると、1分ぐらいしてから
画面が遷移されています。
裏で動いているJAVASCRIPTに問題があるか
分かりませんが、ご教授お願いします。

ちなみに開発環境では、遅延は無く
本番環境(XSERVER)のみ発生しております。

追記
サーバー環境
OS
本番:CentOS Linux release 7.3.1611 (Core)
開発:CentOS Linux release 7.3.1611 (Core)

PHP
本番:PHP Version 7.0.18
開発:PHP Version 7.1.8

MySql
本番:mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
開発:mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper

プログラム(抜粋)

プログラムは3本の構成となっておりまして
inq_phpは、データベースで検索した結果を表示して、
画面からの入力を行います。
入力された時に、inp.jsが呼び出され
inp.jsから、upd.phpを呼び出し
データベースの更新を行います。

1.inq.php

<header> <script src="./inp.js"></script> </header> <body> <input type="number" onchange="isRegNum(this)" id=<?php echo htmlspecialchars($row['id']); ?> name=<?php echo htmlspecialchars("pages|".$i); ?> style ="background-color: #77c1e8;text-align:right;width:60px;" type="textbox" value="<?php echo htmlspecialchars($row['pages'] ,ENT_QUOTES,'UTF-8'); ?>"> </input> </body>

2.inp.js
function isRegNum(obj){

var obj_value=obj.value; /* 入力値 */ var obj_name=obj.name; /* 更新カラム名 */ var obj_id=obj.id; /* DB側の更新行番号 */ result = obj_name.indexOf( "|" ); obj_names = obj_name.substr(0,result); /* DB側の更新カラム名*/ table_rows=Number(obj_name.substr(result+1)); /* 画面側の更新行番号*/ console.log(obj_value); console.log(obj_names); console.log(obj_id); // 入力値のチェック // 0から9 又は .(46) // var obj_value = obj_value.replace( /,/g ,"" ) ; /* カンマが入力されていたら抜き取る*/ if (obj_names !="spec") { for(var i=0 ; i<obj_value.length; i++){ var code=obj_value.charCodeAt(i); if ((48>code || code>57) ){ if (code != 46) { /* 数値(0-9)と (.)以外の文字コード範囲 */

swal({
title: "エラー",
text: "半角数字とピリオド以外の文字が入力されています。"
});

// obj.value=""; return false; } } } } $.ajax({ type : "POST", url:"upd.php", datatype:"json", data: { arg1:obj_value, arg2:obj_names, arg3:obj_id }, }) .done(function(data){ /* 計算値をカンマ付きにさせる。 */ var tables = document.getElementById("cost_tbl"); var shipping_fee_blk = Number(data[0]['shipping_fee_blk']); var price1 = Number(data[0]['price1']); var price2 = Number(data[0]['price2']); var price3 = Number(data[0]['price3']); var price4 = Number(data[0]['price4']); var price5 = Number(data[0]['price5']); /* 計算値を表示させる。 */ tables.rows[table_rows].cells[12].innerText=String(shipping_fee_blk).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); tables.rows[table_rows].cells[16].innerText=String(price1).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); tables.rows[table_rows].cells[17].innerText=String(price2).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); tables.rows[table_rows].cells[18].innerText=String(price3).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); tables.rows[table_rows].cells[19].innerText=String(price4).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); tables.rows[table_rows].cells[20].innerText=String(price4).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); /* 入力された値にもカンマを付けて再表示させる。 注意:ここは */ var values = String(obj_value).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); switch (obj_names){ case "exchange": tables.rows[table_rows].cells[9].value=values; break; case "ratio": tables.rows[table_rows].cells[10].value=values; break; case "carriage": tables.rows[table_rows].cells[11].value=values; break; case "rate": tables.rows[table_rows].cells[13].value=values; break; case "lic_fee": tables.rows[table_rows].cells[14].value=values; break; case "adjust": tables.rows[table_rows].cells[15].value=values; break; case "retail_price": tables.rows[table_rows].cells[21].value=values; break; } }) .fail(function(jqXHR, textStatus, errorThrown) { $("#XMLHttpRequest").html("XMLHttpRequest : " + jqXHR.status); $("#textStatus").html("textStatus : " + textStatus); $("#errorThrown").html("errorThrown : " + errorThrown); })

}

3.upd.php

<?php // ------------------------------------------------------------------ // テキストボックスよりマウスが離れたときの処理 // // Ajax通信ではなく、直接URLを叩かれた場合はエラーメッセージを表示 // ------------------------------------------------------------------ /* 本番サーバーではJSONが使えないので、代替えソースで対応する。 */ if (!function_exists('json_encode')) { // JSON.phpを読み込んで require_once './js/JSON.php'; // json_encode()関数を定義する function json_encode($words) { $s = new Services_JSON(); return $s->encodeUnsafe($words); } // json_decode()関数を定義する function json_decode($json, $assoc = false) { $s = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0); return $s->decode($json); } } if ( !(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') && (!empty($_SERVER['SCRIPT_FILENAME']) && 'json.php' === basename($_SERVER['SCRIPT_FILENAME'])) ) { die ('このページは直接ロードしないでください。'); } include "./common/db/define.php"; include "./common/db/db_function.php"; try { // 入力情報を取得する。 $item_value = $_POST['arg1']; // 登録値 $item_col = $_POST['arg2']; // カラム名 $item_id = $_POST['arg3']; // 更新行番号 $item_value=mb_convert_kana($item_value, 'a'); //DBに接続 try { $dbh = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'].';charset=utf8',$db['user'],$db['pass'],array(PDO::ATTR_EMULATE_PREPARES => false)); } catch (PDOException $e) { echo "データベースへの接続に失敗しました。<br>"; die; } try{ if ($item_col =='pages'){ $sql="UPDATE mst_item SET ".$item_col." = :str WHERE id=:id"; }else{ $sql="UPDATE mst_item_price SET ".$item_col." = :str WHERE id=:id"; } $stmt = $dbh->prepare($sql); if ($debug_flag ==1){ sys_log_write($db,"upd_cost","3","販売強化表","SQL",$sql,""); } $stmt -> execute( array(':str'=>$item_value , ':id'=>$item_id )); }catch (PDOException $e) { echo "例外キャッチ:", $e->getMessage(), "<br>"; } // // パッケージをコールし、計算値をセットする。 // $sql = 'call update_cost(?,@value)'; $stmt = $dbh->prepare($sql); $stmt -> bindValue(1, $item_id, PDO::PARAM_INT); $stmt->execute(); $dbh=null; $stmt=null; // 計算値を取得する。 $sql='SELECT round(shipping_fee_blk,0) AS shipping_fee_blk,round(price1,0) AS price1,round(price2,0) AS price2,round(price3,0) AS price3,round(price4,0) AS price4,round(price5,0) AS price5 FROM mst_item_price WHERE id =:id'; $stmt = $dbh->prepare('SELECT round(shipping_fee_blk,0) AS shipping_fee_blk,round(price1,0) AS price1,round(price2,0) AS price2,round(price3,0) AS price3,round(price4,0) AS price4,round(price5,0) AS price5 FROM mst_item_price WHERE id =:id'); $stmt -> execute( array(':id'=>$item_id )); // execute the stored procedure while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { $rows[]=$row; } $dbh=null; $stmt=null; //JSON形式で出力する header('Content-Type: application/json'); echo json_encode($rows); } catch (PDOException $e) { //例外処理 sys_log_write($db,"upd_cost","3","","エラー",$e->getMessage,""); } ?>

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

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

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

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

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

m.ts10806

2017/09/12 00:01

ソースコードをご提示願います。現在の内容だけでは検証材料が全くありません。あと、開発環境と本番環境の環境情報も開示可能な範囲でいただけると助かります。
退会済みユーザー

退会済みユーザー

2017/09/12 00:39

ソースコードはマークダウン対応してください
m.ts10806

2017/09/12 00:50

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)
guest

回答3

0

<input>のHTMLの書式が正しくないのできちんと下記のように書きます。

html

1 <input type="number" onchange="isRegNum(this)" id="<?php 2echo htmlspecialchars($row['id']); ?>" name="<?php 3echo htmlspecialchars("pages|".$i); ?>" style="background-color: #77c1e8;text-align:right;width:60px;" value="<?php 4echo htmlspecialchars($row['pages'] ,ENT_QUOTES,'UTF-8'); ?>">

JavaScriptは下記なので、テキストボックスの値を変更する度にupd.phpにPOSTしています。POST先のPHPではDB UPDATESELECTしているので、その処理時間分だけ待たなければいけません。特に連続して変更した場合は負荷がかなり高くなると思われます。
ですので、JavaScriptのイベントonChangeではなく、ボタンを設置してonClickなどに変更したほうが良いと思います。

本番環境(XSERVER)のみ発生しております。

本番環境のパフォーマンスがよくないため発生している問題だと思います。本番環境ではデーターの数が多い可能性もあるかと思います。(件数を見ていないので何とも言えませんが)また、JSON処理も高負荷になっていると予想されます。

js

1function isRegNum(obj) 2{ 3 var obj_value = obj.value; /* 入力値 */ 4 var obj_name = obj.name; /* 更新カラム名 */ 5 var obj_id = obj.id; /* DB側の更新行番号 */ 6 7 result = obj_name.indexOf("|"); 8 obj_names = obj_name.substr(0, result); /* DB側の更新カラム名*/ 9 table_rows = Number(obj_name.substr(result + 1)); /* 画面側の更新行番号*/ 10 11 console.log(obj_value); 12 console.log(obj_names); 13 console.log(obj_id); 14 15 // 入力値のチェック 16 // 0から9 又は .(46) 17 18 /* カンマが入力されていたら抜き取る*/ 19 var obj_value = obj_value.replace(/,/g, ""); 20 21 if (obj_names != "spec") { 22 for (var i = 0; i < obj_value.length; i++) { 23 var code = obj_value.charCodeAt(i); 24 if ((48 > code || code > 57)) { 25 if (code != 46) { 26 /* 数値(0-9)と (.)以外の文字コード範囲 */ 27 swal({ 28 title: "エラー", 29 text: "半角数字とピリオド以外の文字が入力されています。" 30 }); 31 // 32 obj.value = ""; 33 return false; 34 } 35 } 36 } 37 } 38 39 $.ajax({ 40 type: "POST", 41 url: "upd.php", 42 datatype: "json", 43 data: { 44 arg1: obj_value, 45 arg2: obj_names, 46 arg3: obj_id 47 }, 48 }) 49 .done(function(data) { 50 /* 計算値をカンマ付きにさせる。 */ 51 var tables = document.getElementById("cost_tbl"); 52 var shipping_fee_blk = Number(data[0]['shipping_fee_blk']); 53 var price1 = Number(data[0]['price1']); 54 var price2 = Number(data[0]['price2']); 55 var price3 = Number(data[0]['price3']); 56 var price4 = Number(data[0]['price4']); 57 var price5 = Number(data[0]['price5']); 58 59 /* 計算値を表示させる。 */ 60 tables.rows[table_rows].cells[12].innerText = String(shipping_fee_blk).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 61 tables.rows[table_rows].cells[16].innerText = String(price1).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 62 tables.rows[table_rows].cells[17].innerText = String(price2).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 63 tables.rows[table_rows].cells[18].innerText = String(price3).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 64 tables.rows[table_rows].cells[19].innerText = String(price4).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 65 tables.rows[table_rows].cells[20].innerText = String(price4).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 66 67 /* 68 入力された値にもカンマを付けて再表示させる。 69 注意:ここは 70 */ 71 var values = String(obj_value).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'); 72 73 switch (obj_names) { 74 case "exchange": 75 tables.rows[table_rows].cells[9].value = values; 76 break; 77 case "ratio": 78 tables.rows[table_rows].cells[10].value = values; 79 break; 80 case "carriage": 81 tables.rows[table_rows].cells[11].value = values; 82 break; 83 case "rate": 84 tables.rows[table_rows].cells[13].value = values; 85 break; 86 case "lic_fee": 87 tables.rows[table_rows].cells[14].value = values; 88 break; 89 case "adjust": 90 tables.rows[table_rows].cells[15].value = values; 91 break; 92 case "retail_price": 93 tables.rows[table_rows].cells[21].value = values; 94 break; 95 } 96 }) 97 .fail(function(jqXHR, textStatus, errorThrown) { 98 $("#XMLHttpRequest").html("XMLHttpRequest : " + jqXHR.status); 99 $("#textStatus").html("textStatus : " + textStatus); 100 $("#errorThrown").html("errorThrown : " + errorThrown); 101 }); 102}

php

1<?php 2// ------------------------------------------------------------------ 3// テキストボックスよりマウスが離れたときの処理 4// 5// Ajax通信ではなく、直接URLを叩かれた場合はエラーメッセージを表示 6// ------------------------------------------------------------------ 7 8/* 本番サーバーではJSONが使えないので、代替えソースで対応する。 */ 9 10if (!function_exists('json_encode')) { 11 // JSON.phpを読み込んで 12 require_once './js/JSON.php'; 13 // json_encode()関数を定義する 14 function json_encode($words) 15 { 16 $s = new Services_JSON(); 17 return $s->encodeUnsafe($words); 18 } 19 // json_decode()関数を定義する 20 function json_decode($json, $assoc = false) 21 { 22 $s = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0); 23 return $s->decode($json); 24 } 25} 26 27if (!(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 28 strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') && 29 (!empty($_SERVER['SCRIPT_FILENAME']) && 'json.php' === basename($_SERVER['SCRIPT_FILENAME']))) 30{ 31 die('このページは直接ロードしないでください。'); 32} 33 34include "./common/db/define.php"; 35include "./common/db/db_function.php"; 36 37try { 38 // 入力情報を取得する。 39 $item_value = $_POST['arg1']; // 登録値 40 $item_col = $_POST['arg2']; // カラム名 41 $item_id = $_POST['arg3']; // 更新行番号 42 $item_value = mb_convert_kana($item_value, 'a'); 43 44 //DBに接続 45 try { 46 $dbh = new PDO('mysql:host='.$db['host'].';dbname='.$db['dbname'].';charset=utf8', $db['user'], $db['pass'], array( 47 PDO::ATTR_EMULATE_PREPARES => false 48 )); 49 } 50 catch (PDOException $e) { 51 echo "データベースへの接続に失敗しました。<br>"; 52 die; 53 } 54 55 try { 56 if ($item_col == 'pages') { 57 $sql = "UPDATE mst_item SET " . $item_col . " = :str WHERE id=:id"; 58 } else { 59 $sql = "UPDATE mst_item_price SET " . $item_col . " = :str WHERE id=:id"; 60 } 61 62 $stmt = $dbh->prepare($sql); 63 64 if ($debug_flag == 1) { 65 sys_log_write($db, "upd_cost", "3", "販売強化表", "SQL", $sql, ""); 66 } 67 68 $stmt->execute(array( 69 ':str' => $item_value, 70 ':id' => $item_id 71 )); 72 } 73 catch (PDOException $e) { 74 echo "例外キャッチ:", $e->getMessage(), "<br>"; 75 } 76 77 // 78 // パッケージをコールし、計算値をセットする。 79 // 80 $sql = 'call update_cost(?,@value)'; 81 $stmt = $dbh->prepare($sql); 82 $stmt->bindValue(1, $item_id, PDO::PARAM_INT); 83 $stmt->execute(); 84 85 $dbh = null; 86 $stmt = null; 87 88 // 計算値を取得する。 89 $sql = 'SELECT round(shipping_fee_blk,0) AS shipping_fee_blk,round(price1,0) AS price1,round(price2,0) AS price2,round(price3,0) AS price3,round(price4,0) AS price4,round(price5,0) AS price5 FROM mst_item_price WHERE id =:id'; 90 91 $stmt = $dbh->prepare('SELECT round(shipping_fee_blk,0) AS shipping_fee_blk,round(price1,0) AS price1,round(price2,0) AS price2,round(price3,0) AS price3,round(price4,0) AS price4,round(price5,0) AS price5 FROM mst_item_price WHERE id =:id'); 92 93 $stmt->execute(array( 94 ':id' => $item_id 95 )); 96 97 // execute the stored procedure 98 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 99 $rows[] = $row; 100 } 101 102 $dbh = null; 103 $stmt = null; 104 105 //JSON形式で出力する 106 header('Content-Type: application/json'); 107 echo json_encode($rows); 108} 109catch (PDOException $e) { 110 //例外処理 111 sys_log_write($db, "upd_cost", "3", "", "エラー", $e->getMessage, ""); 112} 113?>

投稿2017/09/12 21:14

Tomak

総合スコア1652

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

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

0

自己解決

回答ありがとう御座いました。

結論としてJSONを使って更新を行うのは辞めました。

途中まで調べましたら、upd.phpの戻りが60秒ほど掛かっているのが
分かりましたが、その先がわかりませんでしたので
更新ボタンを付けるように変更しております。

投稿2017/09/12 23:40

Kobi0927i

総合スコア8

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

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

0

ソースをほとんど読んでいませんが、同じソースで挙動がことなるなら環境の問題の可能性が高いです。

たとえば、DB接続とか。
ただ、コメント見ると

/* 本番サーバーではJSONが使えないので、代替えソースで対応する。 */

とあったので、こちらが怪しい感じます。
この部分を変更して遅延がなくなれば、問題箇所は代替えソースかと思います。

投稿2017/09/12 01:51

momon-ga

総合スコア4820

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問