7. 폼 처리 및 사용자 입력 (Form Handling and User Input)
폼 처리 기초 (Basics of Form Handling)
HTML 폼을 통해 사용자의 입력을 받아 PHP로 처리할 수 있습니다. 폼 데이터를 전송하기 위해 <form> 태그를 사용합니다.
<!DOCTYPE html> <html> <body> <form method="post" action="process.php"> Name: <input type="text" name="name"><br> Email: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html>
이 예제에서, 사용자가 폼을 제출하면 process.php 파일이 실행됩니다.
GET과 POST 메서드 (GET and POST Methods)
GET과 POST는 두 가지 주요 HTTP 요청 방법입니다. 둘 다 폼 데이터를 서버로 전송하는 데 사용됩니다.
GET 메서드
GET 메서드는 URL에 데이터가 포함되어 전송됩니다. URL에 데이터가 노출되므로 보안이 필요한 데이터 전송에는 적합하지 않습니다.
<form method="get" action="process.php"> Name: <input type="text" name="name"><br> <input type="submit"> </form>
POST 메서드
POST 메서드는 데이터를 HTTP 요청 본문에 포함하여 전송합니다. 데이터가 URL에 노출되지 않으므로 보안이 더 높은 방법입니다.
<form method="post" action="process.php"> Name: <input type="text" name="name"><br> <input type="submit"> </form>
PHP에서 GET과 POST 데이터 처리
$_GET과 $_POST 슈퍼 글로벌 배열을 사용하여 각각 GET과 POST 메서드로 전송된 데이터를 접근할 수 있습니다.
<?php
// process.php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST['name'];
$email = $_POST['email'];
echo "Name: " . $name . "<br>";
echo "Email: " . $email;
}
?>
폼 데이터 검증 (Form Data Validation)
폼 데이터 검증은 사용자가 입력한 데이터를 처리하기 전에 유효성을 검사하는 과정입니다.
예제
<?php
$nameErr = $emailErr = "";
$name = $email = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
}
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
}
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<!DOCTYPE html>
<html>
<body>
<h2>PHP Form Validation Example</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name">
<span><?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email">
<span><?php echo $emailErr;?></span>
<br><br>
<input type="submit">
</form>
</body>
</html>
파일 업로드 (File Uploads)
사용자가 파일을 업로드할 수 있도록 하려면 HTML 폼과 PHP 스크립트를 사용합니다.
HTML 폼
<!DOCTYPE html> <html> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> Select file to upload: <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="Upload File" name="submit"> </form> </body> </html>
PHP 파일 업로드 처리
<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// 파일이 실제 이미지인지 확인
if (isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if ($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
// 파일이 이미 존재하는지 확인
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// 파일 크기 제한 (예: 500KB)
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// 특정 파일 형식 허용 (예: JPG, JPEG, PNG, GIF)
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// 업로드가 가능한지 확인
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
?>
이 예제에서는 사용자가 선택한 파일을 서버의 uploads 디렉터리에 저장합니다. 다양한 검사를 통해 파일의 유효성을 확인하고, 업로드가 성공하면 메시지를 출력합니다.
