PHP Form Handling


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 디렉터리에 저장합니다. 다양한 검사를 통해 파일의 유효성을 확인하고, 업로드가 성공하면 메시지를 출력합니다.


Leave a Reply

Your email address will not be published. Required fields are marked *