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

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

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

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

解決済

phpプログラムの安全性、パフォーマンスについて

nosonosolife
nosonosolife

総合スコア0

PHP

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

1回答

-1評価

2クリップ

1231閲覧

投稿2016/06/19 20:45

現在phpで掲示板スクリプトを制作しているのですが、
プログラムのセキュリティー面での対策や、処理速度などのパフォーマンス等について
修正したほうがいい部分などがあればご提示いただきたいと思っております。

以下、PHPコードです。

【書き込み投稿画面】

php

<\?php //接続文字列 \$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; \$user = 'ユーザー名'; \$password = 'パスワード'; try { \$pdo = new PDO\(\$dsn, \$user, \$password\); \$pdo->setAttribute\(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING\); mb_language\("uni"\); mb_internal_encoding\("utf-8"\); //内部文字コードを変更 mb_http_input\("auto"\); mb_http_output\("utf-8"\); date_default_timezone_set\('Asia/Tokyo'\); \$Date = date\("Y/m/d D H:i:s"\); \$Name = htmlspecialchars\(\$_POST\["Name"\]\); \$Title = htmlspecialchars\(\$_POST\["Title"\]\); \$Message = htmlspecialchars\(\$_POST\["Message"\]\); \$Message = str_replace\(array\('\\r\\n','\\r','\\n'\), '\\n', \$Message\); \$stmt = \$pdo->query\("SET NAMES utf8;"\); // この記述が必要 \$stmt = \$pdo -> prepare\("INSERT INTO bbs_data \(user_date, user_name, user_title, user_mes\) VALUES \(:date, :name, :title, :mes\)"\); \$stmt->bindParam\(':date', \$Date, PDO::PARAM_INT\); \$stmt->bindValue\(':name', \$Name, PDO::PARAM_STR\); \$stmt->bindValue\(':title', \$Title, PDO::PARAM_STR\); \$stmt->bindValue\(':mes', \$Message, PDO::PARAM_STR\); \$stmt->execute\(\); header\('Location: \./sendok\.html'\); exit; } catch \(PDOException \$e\) { //例外処理 die\('Error:' \. \$e->getMessage\(\)\); header\('Location: \./senderror\.html'\); } \?>

【書き込み表示画面】

php

<\?php //接続文字列 \$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; \$user = 'ユーザー名'; \$password = 'パスワード'; try { \$pdo = new PDO\(\$dsn, \$user, \$password\); \$pdo->setAttribute\(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING\); mb_language\("uni"\); mb_internal_encoding\("utf-8"\); //内部文字コードを変更 mb_http_input\("auto"\); mb_http_output\("utf-8"\); \$userData = null; \$page = empty\(\$_GET\["page"\]\)\? 1:\$_GET\["page"\];//ページ番号 \$pagemax = 100;//1ページあたりの表示数 \$start = \(\$page == 1\)\? 0 : \(\$page-1\) \* \$pagemax; // 全レコード数を取るSQL \$sql = "select count\(\*\) from bbs_data"; \$result = \$pdo->query\(\$sql\); \$count = \$result->fetchColumn\(\); \$count = intval\(\$count, 10\); \$limit = ceil\(\$count/\$pagemax\);//最大ページ数 //datasテーブルから日付の降順でデータを取得 \$sql = "select \* from bbs_data ORDER BY user_date DESC limit "\.\$start\.","\.\$pagemax; \$result = \$pdo->query\(\$sql\); while \(\$row = \$result->fetchObject\(\)\){ \$userData\[\]=array\( 'id' => \$row->user_id ,'date' => \$row->user_date ,'name' => \$row->user_name ,'title' => \$row->user_title ,'message' => \$row->user_mes \); } function paging\(\$limit, \$page, \$disp=10\){ //\$dispはページ番号の表示数 \$next = \$page\+1; \$prev = \$page-1; //ページ番号リンク用 \$start = \(\$page-floor\(\$disp/2\) > 0\) \? \(\$page-floor\(\$disp/2\)\) : 1;//始点 \$end = \(\$start > 1\) \? \(\$page\+floor\(\$disp/2\)\) : \$disp;//終点 \$start = \(\$limit < \$end\)\? \$start-\(\$end-\$limit\):\$start;//始点再計算 if\(\$page != 1 \) { //最初のページへのリンク if\(\$start >= floor\(\$disp/2\)\){ print '<li><a href="\?page=1">1</a></li>'; } } if\(\$limit > 0 \) { if\(\$page != 1 \) { print '<li><a href="\?page='\.\$prev\.'">&laquo; 前へ</a></li>'; }else{ print '<li><span>&laquo; 前へ</span></li>'; } } for\(\$i=\$start; \$i <= \$end ; \$i\+\+\){//ページリンク表示ループ if\(\$i <= \$limit && \$i > 0 \){//1以上最大ページ数以下の場合 if\(\$page == \$i\){ print '<li><span>'\.\$i\.'</span></li>';//ページ番号リンク表示 }else{ print '<li><a href="\?page='\.\$i\.'">'\.\$i\.'</a></li>';//ページ番号リンク表示 } } } if\(\$limit > 0 \) { if\(\$page < \$limit\){ print '<li><a href="\?page='\.\$next\.'">次へ &raquo;</a></li>'; }else{ print '<li><span>次へ &raquo;</span></li>'; } } if\(\$page != \$limit \) { //最後のページへのリンク if\(\$limit > \$end\){ print '<li><a href="\?page='\.\$limit\.'">'\.\$limit\.'</a></li>'; } } } require '\./template/index_temp\.php'; exit; } catch \(PDOException \$e\) { //例外処理 die\('Error:' \. \$e->getMessage\(\)\); } \?>

【書き込み検索画面】

php

<\?php //接続文字列 \$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; \$user = 'ユーザー名'; \$password = 'パスワード'; try { \$pdo = new PDO\(\$dsn, \$user, \$password\); \$pdo->setAttribute\(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING\); mb_language\("uni"\); mb_internal_encoding\("utf-8"\); //内部文字コードを変更 mb_http_input\("auto"\); mb_http_output\("utf-8"\); \$searchword = empty\(\$_GET\["searchword"\]\)\? null:\$_GET\["searchword"\];//検索ワード \$searchData = null; \$page = empty\(\$_GET\["page"\]\)\? 1:\$_GET\["page"\];//ページ番号 \$pagemax = 100;//1ページあたりの表示数 \$start = \(\$page == 1\)\? 0 : \(\$page-1\) \* \$pagemax; \$end = \(\$page \* \$pagemax\); // 全レコード数を取るSQL \$sql = "select count\(\*\) from bbs_data where \(user_name like '%\$searchword%'\) or \(user_title like '%\$searchword%'\) or \(user_mes like '%\$searchword%'\)"; \$result = \$pdo->query\(\$sql\); \$count = \$result->fetchColumn\(\); \$count = intval\(\$count, 10\); \$limit = ceil\(\$count/\$pagemax\);//最大ページ数 //datasテーブルから日付の降順でデータを取得 \$sql = "select \* from bbs_data where \(user_name like '%\$searchword%'\) or \(user_title like '%\$searchword%'\) or \(user_mes like '%\$searchword%'\) ORDER BY user_date DESC limit "\.\$start\.","\.\$pagemax; \$result = \$pdo->query\(\$sql\); while \(\$row = \$result->fetchObject\(\)\){ \$searchData\[\]=array\( 'id' => \$row->user_id ,'date' => \$row->user_date ,'name' => \$row->user_name ,'title' => \$row->user_title ,'message' => \$row->user_mes \); } function paging\(\$limit, \$page, \$disp=10\){ //\$dispはページ番号の表示数 \$next = \$page\+1; \$prev = \$page-1; //ページ番号リンク用 \$start = \(\$page-floor\(\$disp/2\) > 0\) \? \(\$page-floor\(\$disp/2\)\) : 1;//始点 \$end = \(\$start > 1\) \? \(\$page\+floor\(\$disp/2\)\) : \$disp;//終点 \$start = \(\$limit < \$end\)\? \$start-\(\$end-\$limit\):\$start;//始点再計算 if\(\$page != 1 \) { //最初のページへのリンク if\(\$start >= floor\(\$disp/2\)\){ print '<li><a href="\?page=1">1</a></li>'; } } if\(\$limit > 0 \) { if\(\$page != 1 \) { print '<li><a href="\?page='\.\$prev\.'">&laquo; 前へ</a></li>'; }else{ print '<li><span>&laquo; 前へ</span></li>'; } } for\(\$i=\$start; \$i <= \$end ; \$i\+\+\){//ページリンク表示ループ if\(\$i <= \$limit && \$i > 0 \){//1以上最大ページ数以下の場合 if\(\$page == \$i\){ print '<li><span>'\.\$i\.'</span></li>';//ページ番号リンク表示 }else{ print '<li><a href="\?page='\.\$i\.'">'\.\$i\.'</a></li>';//ページ番号リンク表示 } } } if\(\$limit > 0 \) { if\(\$page < \$limit\){ print '<li><a href="\?page='\.\$next\.'">次へ &raquo;</a></li>'; }else{ print '<li><span>次へ &raquo;</span></li>'; } } if\(\$page != \$limit \) { //最後のページへのリンク if\(\$limit > \$end\){ print '<li><a href="\?page='\.\$limit\.'">'\.\$limit\.'</a></li>'; } } } require '\./template/search_temp\.php'; exit; } catch \(PDOException \$e\) { //例外処理 die\('Error:' \. \$e->getMessage\(\)\); } \?>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

PHP

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