PHP プロジェクト: 意見投票アプリケーションの作成

⚡ スマートサマリー

このPHPプロジェクトでは、これまでのレッスンで学んだことをすべて統合し、意見投票アプリケーションをゼロから構築します。アプリケーションはフロントコントローラー、ビジネスロジックモデル、ビューファイルに分割され、お気に入りの投票を保存して集計します。 Javaスクリプトライブラリ MySQL データベース。

  • 🧭 フロントコントローラー: 単一のindex.phpエントリポイントによってどのビューを読み込むかが決定され、アプリケーションはリクエストをルーティングするための制御された場所を1つ持つことができます。
  • 🧠 ビジネスロジック: モデルクラスはすべてのデータベース作業を処理します。ping メンテナンスを容易にするため、データアクセスとプレゼンテーションを分離しています。
  • 飲料衣<XNUMXxXNUMX><XNUMXxBC><XNUMXxBC> ファイルを表示する: .html.php ビューファイルには、アンケートフォームと結果ページが格納されており、HTML と小さな PHP 出力タグが混在しています。
  • 🗃️ データベーステーブル: 単一のjs_librariesテーブルには、各投票が選択番号とタイムスタンプとして格納され、自動インクリメントIDがキーとして使用されます。
  • 検証: 小さな Javaスクリプトチェック機能は、ライブラリを選択せず​​にフォームが送信された場合にユーザーに警告を表示します。
  • 📊 投票集計中: コントローラーは投票を挿入した後、オプションごとにCOUNTクエリを実行して結果テーブルを作成します。
  • 🤖 AIアシスト: AIツールを使えば、このアンケートを本格的な調査アプリに拡張したり、コードのバグやセキュリティ上の問題を検証したりすることができる。

PHPによる世論調査アプリケーション

PHPを使用して世論調査アプリケーションを作成する方法

このPHPプロジェクトでは、世論調査アプリケーションを作成します。

世論調査は、主に以下の3つの要素で構成されます。

フロントコントローラー これは、読み込むHTMLコードを決定するインデックスページです。これにより、アプリケーションのエントリポイントが1つに絞られ、アプリケーションをより詳細に制御できるようになります。

ビジネスの論理 ―ここにはデータベースとのやり取りを行うためのPHPコードが含まれます。これにより、ビジネスロジックとプレゼンテーションを分離できるため、アプリケーションの保守が容易になります。

ビュー ―ここにはHTMLコードが含まれます。ページは2つあります。具体的には以下のとおりです。

  • Opinion.html.php – これには、質問とオプションを含む HTML コードが含まれます
  • results.html.php – これには世論調査の結果を表示する HTML コードが含まれます

行われた仮定

世論調査では、「あなたの好きなものは何ですか?」という質問をします。 Javaスクリプト 図書館?

答えは以下のとおりです。

  • jQueryの
  • Mooツール
  • YUIライブラリ
  • グロー

アプリケーションを作成する手順は以下のとおりです。

ステップ 1) データベース接続

このセクションは、次の知識があることを前提としています。 MySQL そしてその投与方法について。 MySQL、私たちをチェックしてください SQL チュートリアル のセクションから無料でダウンロードできます。

私たちのアプリケーションには、3つのフィールドを持つテーブルが1つだけあります。具体的には以下のとおりです。

  • id – 主キーとして自動生成される番号
  • 選択肢 – 選択されたものを表す数字 Javaスクリプトライブラリ
  • ts – 投票のタイムスタンプ

以下のスクリプトは js_libraries テーブルを作成します。

CREATE TABLE `js_libraries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`choice` tinyint(4) NOT NULL DEFAULT '0',
`ts` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

ステップ 2) アプリケーションをコーディングする

それでは、データベース接続を処理するビジネスロジック層を作成しましょう。 意見投票_モデル.php

<?php
 
class Opinion_poll_model {
 
private $db_handle;
private $host = 'localhost';
private $db = 'opinion_poll';
private $uid = 'root';
private $pwd = 'melody';
 
public function __construct() {
$this->db_handle = mysqli_connect($this->host, $this->uid, $this->pwd); // connect to MySQL server
if (!$this->db_handle) die("Unable to connect to MySQL: " . mysqli_connect_error());
if (!mysqli_select_db($this->db_handle, $this->db)) die("Unable to select database: " . mysqli_error($this->db_handle));
}
 
private function execute_query($sql_stmt) {
$result = mysqli_query($this->db_handle, $sql_stmt); // execute SQL statement
return !$result ? FALSE : TRUE;
}
 
public function select($sql_stmt) {
$result = mysqli_query($this->db_handle, $sql_stmt);
if (!$result) die("Database access failed: " . mysqli_error($this->db_handle));
$rows = mysqli_num_rows($result);
$data = array();
if ($rows) {
while ($row = mysqli_fetch_array($result)) {
$data = $row;
}
}
return $data;
}
 
public function insert($sql_stmt) {
return $this->execute_query($sql_stmt);
}
 
public function __destruct(){
mysqli_close($this->db_handle);
}
 
}
 
?>

ここに、

  • 「public function __construct()」は、データベース接続を確立するために使用されるクラス コンストラクター メソッドです。
  • 「public function execute_query(…)」は、挿入、更新、削除などのクエリを実行するためのメソッドです。
  • 「public function select(…)」は、データ取得のためのメソッドです。 データベース そして配列を返します。
  • 「public function insert(…)」は、execute_queryメソッドを呼び出すinsertメソッドです。
  • 「public function __destruct()」は、データベース接続を閉じるクラス デストラクターです。

それでは、フロントコントローラーを作成しましょう。 index.phpを

<?php
 
require 'opinion_poll_model.php';
 
$model = new Opinion_poll_model();
 
if (count($_POST) == 1) {
echo "<script>alert(1);</script>";
}
 
if (count($_POST) > 1) {
$ts = date("Y-m-d H:i:s");
$option = $_POST['vote'][0];
$sql_stmt = "INSERT INTO js_libraries (`choice`,`ts`) VALUES ($option,3)";
$model->insert($sql_stmt);
$sql_stmt = "SELECT COUNT(choice) choices_count FROM js_libraries;";
$choices_count = $model->select($sql_stmt);
$libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
$table_rows = '';
for ($i = 1; $i < 5; $i++) {
$sql_stmt = "SELECT COUNT(choice) choices_count FROM js_libraries WHERE choice = $i;";
$result = $model->select($sql_stmt);
$table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $result[0] . "</b> votes</td></tr>";
}
require 'results.html.php';
exit;
}
 
require 'opinion.html.php';
 
?>

ここに、

  • 「'opinion_poll_model.php' が必要です;」 ビジネスロジッククラスをロードします
  • 「$model = 新しい Opinion_poll_model();」 ビジネス ロジック クラスのインスタンスを作成します
  • 「if (count($_POST) == 1)…」はデータの検証を実行し、 Java候補者に投票がなかった場合にメッセージボックスを表示するスクリプト。
  • 「if (count($_POST) > 1)…」は、$_POST配列内の項目数を数えることで、投票が選択されたかどうかを確認します。項目が選択されていない場合、$_POSTにはsubmit項目のみが含まれます。図書館が選択されている場合、$_POST配列にはsubmit項目とvote項目の2つの要素が含まれます。このコードは、新しい投票記録を挿入し、結果ページを表示します。
  • 「exit;」は、結果が表示された後、スクリプトの実行を終了するために使用され、意見調査フォームが表示されないようにします。
  • 「'opinion.html.php' が必要です;」 何も選択されていない場合は、意見調査フォームが表示されます。

それでは、ビューを作成しましょう。 意見.html.php

<html>
<head>
<title>JavaScript Libraries - Opinion Poll</title>
</head>
<body>
 
<h2>JavaScript Libraries - Opinion Poll</h2>
 
<p><b>What is your favorite JavaScript?</b></p>
 
<form method="POST" action="index.php">
 
<p> <input type="radio" name="vote" value="1" />JQuery
 
<br /><input type="radio" name="vote" value="2" />MooTools
 
<br /><input type="radio" name="vote" value="3" />YUI Library
 
<br /><input type="radio" name="vote" value="4" />Glow
 
</p>
 
<p><input type="submit" name="submitbutton" value="OK" /></p>
 
</form>
 
</body>
 
</html>

結果.html.php

<html>
 
<head>
 
<title>JavaScript Libraries Poll Results</title>
 
</head>
 
<body>
 
<h2>Opinion Poll Results</h2>
 
<p><b>What is your favorite JavaScript Library?</b></p>
 
<p><b><?php echo $choices_count[0]; ?></b> people have thus far taken part in this poll:</p>
 
<p>
<table>
 
<?php echo($table_rows); ?>
</table>
</body>
</html>

ステップ 3) アプリケーションをテストする

ファイルを opinionpoll フォルダーに保存したと仮定して、 URL http://localhost/opinionpoll/

世論調査アプリケーションのテスト

JavaScriptライブラリを選択せず​​に「OK」ボタンをクリックすると、次のメッセージボックスが表示されます。

世論調査アプリケーションのテスト

JavaScriptライブラリを選択し、「OK」ボタンをクリックしてください。すると、以下のような結果ページが表示されます。

世論調査アプリケーションのテスト

世論調査アプリを改善する方法

このプロジェクトは確固たる基盤を築いています。本番運用に向けて、以下の改善点を検討してください。

  • 準備されたステートメントを使用する 連結されたクエリからSQLインジェクションのリスクを排除するために、モデル内で。
  • 二重投票を防止する クッキー、セッションフラグ、またはタイムスタンプとともに投票者のIPアドレスを記録することによって。
  • パーセンテージと棒グラフを表示する 結果ページでは、生のカウント数ではなく、より明確な結果表示を実現します。
  • 投票を動的にする 質問と選択肢をデータベースに保存することで、どのアンケートにもそのコードを再利用できます。

よくあるご質問

フロントコントローラーは、すべてのリクエストを単一のエントリポイント(通常はindex.php)にルーティングし、そこから適切なロジックとビューを読み込みます。ルーティング、認証、および共有設定を一元管理し、ほとんどのPHPフレームワークの基盤となっています。

一般的な方法としては、投票後にクッキーを設定する、セッションを投票済みとしてマークする、投票者のIPアドレスとタイムスタンプをデータベースに保存するなどがあります。しかし、いずれも万全ではないため、複数の方法を組み合わせるか、より厳格な制御のためにログインを必須にする必要があります。

連結されたクエリを、mysqliまたはPDOのプリペアドステートメントに置き換え、投票値をパラメータとしてバインドしてください。また、クエリに到達する前に、選択肢が想定される数値のいずれかであることを検証してください。

はい。AIは、複数の質問の追加、データベースからの動的な選択肢、グラフ付きのパーセンテージ表示、および管理ページを作成できます。必要な機能を記述し、デプロイ前に生成されたコードを確認してテストしてください。

はい。モデル、コントローラー、ビューを貼り付けると、AIが未定義の変数、接続引数の欠落、インジェクションのリスク、エスケープされていない出力などを検出し、修正されたより安全なバージョンを提案してテストできます。