PHP 프로젝트: 여론 조사 애플리케이션 만들기

⚡ 스마트 요약

이 PHP 프로젝트는 이전 수업에서 배운 내용들을 통합하여 여론 조사 애플리케이션을 처음부터 구축하는 것을 목표로 합니다. 애플리케이션은 프런트 컨트롤러, 비즈니스 로직 모델, 뷰 파일로 분리되어 있으며, 선호하는 후보에 대한 투표를 저장하고 집계합니다. Java스크립트 라이브러리 MySQL 데이터 베이스.

  • 🧭 전면 컨트롤러: 단일 index.php 진입점을 통해 로드할 뷰를 결정하므로 애플리케이션은 요청을 라우팅할 수 있는 단일 제어 지점을 갖게 됩니다.
  • 🧠 비즈니스 로직: 모델 클래스는 모든 데이터베이스 작업을 처리합니다.ping 데이터 접근과 프레젠테이션을 분리하여 유지 관리를 용이하게 했습니다.
  • 🖼️ 파일 보기: .html.php 뷰 파일에는 설문 조사 양식과 결과 페이지가 포함되어 있으며, HTML과 작은 PHP 출력 태그가 혼합되어 있습니다.
  • 🗃️ 데이터베이스 테이블: js_libraries 테이블 하나에 각 투표가 선택 번호와 타임스탬프로 저장되며, 키는 자동 증가 ID입니다.
  • ✅ 확인: 작은 Java스크립트 검사 기능은 라이브러리를 선택하지 않고 양식을 제출할 경우 사용자에게 경고 메시지를 표시합니다.
  • 📊 개표 진행 중: 컨트롤러는 투표 결과를 입력한 다음, 각 옵션별로 COUNT 쿼리를 실행하여 결과 테이블을 생성합니다.
  • 🤖 AI 지원: AI 도구는 이 설문조사를 완전한 설문조사 앱으로 확장하고 코드에서 버그 및 보안 문제를 검토할 수 있습니다.

PHP 기반 여론조사 애플리케이션

PHP를 사용하여 여론 조사 애플리케이션을 만드는 방법

이 PHP 프로젝트에서는 여론 조사 애플리케이션을 만들 것입니다.

여론조사는 크게 세 가지 구성 요소로 이루어집니다.

전면 컨트롤러 – 이 페이지는 로드될 HTML 코드를 결정하는 인덱스 페이지입니다. 이를 통해 애플리케이션은 단일 진입점을 갖게 되어 애플리케이션에 대한 제어력을 높일 수 있습니다.

비즈니스 로직 이 영역에는 데이터베이스와 상호 작용하는 PHP 코드가 포함됩니다. 이를 통해 비즈니스 로직과 화면 표시를 분리하여 애플리케이션 유지 관리를 용이하게 할 수 있습니다.

조회수 – 여기에 HTML 코드가 포함됩니다. 페이지는 총 두 개이며, 내용은 다음과 같습니다.

  • 의견.html.php - 여기에는 질문과 옵션이 포함된 HTML 코드가 포함됩니다.
  • results.html.php – 여기에는 여론 조사 결과를 표시하는 HTML 코드가 포함됩니다.

가정된 내용

여론조사에서는 "가장 좋아하는 것은 무엇입니까?"라는 질문을 할 것입니다. JavaScript 도서관?

답변은 다음과 같습니다.

  • JQuery와
  • 무도구
  • YUI 라이브러리
  • 발광

다음은 신청서를 작성하는 단계입니다.

1단계) 데이터베이스 연결

이 섹션에서는 다음에 대한 지식이 있다고 가정합니다. MySQL 그리고 어떻게 투여하는지 알려드리겠습니다. 만약 익숙하지 않으시다면, MySQL, 우리를 확인 SQL 튜토리얼 안내

저희 애플리케이션은 3개의 필드를 가진 테이블 하나만으로 구성됩니다. 필드의 종류는 다음과 같습니다.

  • 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단계) 애플리케이션 코딩

이제 데이터베이스 연결을 처리할 비즈니스 로직 계층을 만들어 보겠습니다. 의견_poll_model.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);
}
 
}
 
?>

이리,

  • "공용 함수 __construct()"는 데이터베이스 연결을 설정하는 데 사용되는 클래스 생성자 메서드입니다.
  • “공개 함수 execute_query(…)”는 삽입, 업데이트, 삭제와 같은 쿼리를 실행하는 메서드입니다.
  • “공개 함수 select(…)”는 해당 객체에서 데이터를 검색하는 메서드입니다. 데이터베이스 배열을 반환합니다.
  • "공용 함수 삽입(...)"은 Execute_query 메서드를 호출하는 삽입 메서드입니다.
  • "공용 함수 __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에는 제출 항목만 포함됩니다. 도서관이 선택된 경우 $_POST 배열에는 제출 항목과 투표 항목, 두 개의 요소가 포함됩니다. 이 코드는 또한 새로운 투표 기록을 삽입한 후 결과 페이지를 표시합니다.
  • "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/

여론조사 애플리케이션 테스트

자바스크립트 라이브러리를 선택하지 않고 확인 버튼을 클릭하면 다음과 같은 메시지 상자가 나타납니다.

여론조사 애플리케이션 테스트

원하는 자바스크립트 라이브러리를 선택한 다음 확인 버튼을 클릭하세요. 아래와 같은 결과 페이지가 나타납니다.

여론조사 애플리케이션 테스트

여론조사 앱을 개선하는 방법

이 프로젝트는 탄탄한 기반을 갖추고 있습니다. 상용화 단계로 나아가기 위해서는 다음과 같은 개선 사항을 고려해 보세요.

  • 미리 준비된 명세서를 사용하십시오. 이 모델은 연결된 쿼리로 인한 SQL 인젝션 위험을 제거하기 위해 만들어졌습니다.
  • 이중 투표 방지 쿠키, 세션 플래그를 사용하거나 투표자의 IP 주소와 타임스탬프를 기록하는 방식으로 확인할 수 있습니다.
  • 백분율과 막대 그래프를 표시하세요 결과 페이지에서는 원시 집계 대신 결과를 보다 명확하게 보여주기 위해 관련 정보를 표시합니다.
  • 설문조사를 역동적으로 만드세요 질문과 선택지를 데이터베이스에 저장함으로써, 어떤 설문조사에도 동일한 코드를 재사용할 수 있습니다.

자주 묻는 질문

프런트 컨트롤러는 모든 요청을 단일 진입점(일반적으로 index.php)을 통해 전달하고, 해당 진입점에서 적절한 로직과 뷰를 로드합니다. 프런트 컨트롤러는 라우팅, 인증 및 공유 설정을 중앙 집중화하며, 대부분의 PHP 프레임워크의 기반이 됩니다.

일반적인 접근 방식으로는 투표 후 쿠키를 설정하거나, 세션을 투표 완료로 표시하거나, 투표자의 IP 주소와 타임스탬프를 데이터베이스에 저장하는 방법이 있습니다. 하지만 어느 방법도 완벽하지 않으므로, 여러 방법을 조합하거나 로그인을 요구하여 더욱 엄격한 제어를 시행해야 합니다.

연결된 쿼리를 mysqli 또는 PDO의 준비된 문으로 대체하고 투표 값을 매개변수로 바인딩하십시오. 또한 선택 값이 쿼리에 도달하기 전에 예상되는 숫자 중 하나인지 검증하십시오.

네. AI는 여러 질문, 데이터베이스에서 가져온 동적 옵션, 차트를 사용한 백분율 결과, 관리자 페이지 등을 추가할 수 있습니다. 원하는 기능을 설명하신 후, 생성된 코드를 검토하고 테스트한 다음 배포하세요.

네. 모델, 컨트롤러, 뷰를 붙여넣으면 AI가 정의되지 않은 변수, 누락된 연결 인자, 인젝션 위험, 이스케이프되지 않은 출력 등을 감지하여 테스트할 수 있는 수정되고 더 안전한 버전을 제안합니다.

이 게시물을 요약하면 다음과 같습니다.