- ベストアンサー
自作サンプル問題箇所アドバイス
- apache2.4でphp5.2とmysql5.0の勉強をしています。手直しを繰り返してサンプルを作ったのですが、読み込みが重い感じがします。
- もっと効率的な方法で動作させることができます。
- セキュリティに問題がある可能性もありますので、注意が必要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
自分はPHP&MySQLは初心者でリファレンス首っ引きで回答しているため、セキュリティ上のポカをしているかもしれませんが…… ページ制御の全件数を求める処理は、 $mysql_W = mysql_query("SELECT count(*) FROM infotable WHERE name='$kisetsu' AND kudamono='$kudamono'",$mysql); // ...(中略)... $allrows = mysql_fetch_row($mysql_W)[0]; というようにcount(*)を使ったほうがMySQLとやり取りするデータ量が少なくなって結果スピードアップすると思います。
その他の回答 (2)
- kosukejlampnet
- ベストアンサー率44% (126/282)
htmlspecialchars は出力のときに使うもの。 http://php.net/manual/ja/function.htmlspecialchars.php ユーザーが入力した値をエスケープするのは mysql_real_escape_string http://php.net/manual/ja/function.mysql-real-escape-string.php
お礼
再度の回答ありがとうございます。 アドバイスを元に改善しました。 改善後のファイルは https://box.yahoo.co.jp/guest/viewer?sid=box-l-co4ivitvpdo32iqddqwd3piwfi-1001&uniqid=6e4f1d6c-f7ec-4e9b-afd6-b7834f1252fa&viewtype=detail https://box.yahoo.co.jp/guest/viewer?sid=box-l-co4ivitvpdo32iqddqwd3piwfi-1001&uniqid=d90fa395-21a2-4e23-a155-f4b9f3d88bda&viewtype=detail データベースは検索対象のnameとkudamonoにインデックスキーを追加しました。 正規化を試みたのですが、適当に入れたカラム同士に関連性がないので正規化できませんでした。 phpファイルの修正箇所は、 htmlspecialchars($_GET['page']); ↓ htmlspecialchars($_GET['page'], ENT_QUOTES, 'UTF-8'); 第二引数と第三引数を追加 49:$kisetsu = "春"; 50:$kudamono = "りんご"; ↓ 49:$kisetsu_mysql = $kisetsu = "春"; 50:$kudamono_mysql = $kudamono = "りんご"; 70行目から下記を追加しDBやテーブルへの接続も変更 70:$filename = "../../../../MySQL/idpass.ini"; 71:if(!file_exists($filename)){ 72: die("idpass.iniファイルが存在しません。"); 73:}else{ 74: $fp = fopen($filename,"r"); 75: if(!$fp){ 76: die("idpass.iniファイルが存在しません。"); 77: }else{ 78: $HostName = trim(fgets($fp)); 79: $UserName = trim(fgets($fp)); 80: $Password = trim(fgets($fp)); 81: $Database = trim(fgets($fp)); 82: } 83: fclose($fp); 84:} 95行目から下記を追加 htmlspecialcharsをした後にmysql_real_escape_stringや mysql_real_escape_stringをした後にhtmlspecialcharsは 問題があるそうなので、それぞれ変数を作り処理を分けています。 95:if(isset($_GET['kisetsu']) && isset($_GET['kudamono'])){ 96: $kisetsu_mysql = mysql_real_escape_string($_GET['kisetsu']); 97: $kudamono_mysql = mysql_real_escape_string($_GET['kudamono']); 98:} 85:$mysql_Code = "SELECT * FROM infotable"; 86:$mysql_Code_Where = $mysql_Code." WHERE name='$kisetsu' AND kudamono='$kudamono'"; ↓ 102:$mysql_Code_Count = "SELECT COUNT(*) AS CNT FROM infotable WHERE name='$kisetsu_mysql' AND kudamono='$kudamono_mysql'"; 103:$mysql_Code_Where = "SELECT * FROM infotable WHERE name='$kisetsu_mysql' AND kudamono='$kudamono_mysql'"; そして、それに関わるクエリの作成 107:$allrows = mysql_num_rows($mysql_W); 108:$pagelist_num = ceil($allrows / $kensuu); ↓ 125:$allrows = mysql_fetch_assoc($mysql_C); 126:$pagelist_num = ceil($allrows['CNT'] / $kensuu); 重さを感じると質問文に書きましたが、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1061677045 直前に処理すると書いてありますが、ページ全体でいろいろ使っているので極力ということですね。参考書でも最初にhtmlspecialcharsをまとめて処理してましたし…
- kosukejlampnet
- ベストアンサー率44% (126/282)
htmlspecialchars の使い方間違ってますね。 あと、DBの正規化とインデックスの使い方も勉強しましょうね。
お礼
>htmlspecialchars >の使い方間違ってますね。 htmlspecialcharsはこの場合使う必要がない、ということでしょうか。 inputのtextなどユーザーが入力したものを扱う場合には すべて必要と参考書に書いてありましたが、 他の参考書にはfiddlerを使えば input系のデータを書き換えて悪さができるとあったので、念のためにつけていました。 ユーザーが入力したものを扱わないものには付けないようにします。 >あと、DBの正規化とインデックスの使い方も勉強しましょうね。 検索対象になっているカラムにインデックスを全部追加するのを忘れていました。 インデックスを追加していないから、テキストが表示された後に、 マウスポインタがすぐ変化しないなどの重さが出てしまうのですか。 追加して重さが改善されるか試してみます。 調べてみたのですが、 データベースの正規化は ・種類の違うデータは違うテーブルに入れる ・同じデータは複数のテーブルに存在させない が重要で、 1.データ項目の洗い出し 2.第一正規化 3.第二正規化 4.第三正規化 5.テーブルの実装、作成 の手順で行う。ですね。 こういったことを勉強してみます。 アドバイスありがとうございました。 とても助かります。
お礼
ありがとうございます。 http://ma-bank.com/item/998 こちらのサイトによると私は最悪なやり方をしているようです。 さっそく試してみました。 修正後のサンプルは#3さんのお例文にのせてありますので、 もしもう一度見て頂けるならお願いいたします。 試してみた感想ですが、count(*)の方が早いというのは理解していますが、 前以上に重くなったような感じがします? 私のサンプルページだけでなく、他のどのサイトでも、フォルダの操作など パソコンの操作自体が重くなっているように思います。 もしかして私のサンプルコードを開きっぱなし(=mysqlが動き続けている)で mysqlに負荷が大きくパソコン自体が重くなっていると思ったのですが、 CPU2.40GH、メモリ4GB(2GB*2)… アパッチの起動(コマンドプロンプトを開きっぱなし)、mysqlの起動、8つのサイト開いている、エディタを1つ、フォルダ2つ開いています。 勘違いでしょうか。