달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'분류 전체보기'에 해당되는 글 49건

  1. 2010.10.23 Chapter09. 일반적인 프로그래밍 테크닉 - 3 ('10.10.23)

<?php # Script 9.3 - edit_user.php

$page_title = 'Edit a User';
include ('includes/header.html');

echo '<h1>Edit a User</h1>';

// 이전 페이지에서 받은 id 변수를 검증한다
if ( (isset($_GET['id'])) && (is_numeric($_GET['id'])) ) {
    $id = $_GET['id'];
} elseif ( (isset($_POST['id'])) && (isset($_POST['id'])) ) {
    $id = $_POST['id'];
} else {
    echo '<p class="error">This page has been accessed in error.</p>';
    include ('includes/footer.html');
    exit();
}

require_once('../mysqli_connect.php');

if (isset($_POST['submitted'])) { // 제출된 데이터를 처리하는 조건절 시작
    $errors = array();

    if (empty($_POST['first_name'])) {
        $errors[] = 'You forgot to enter your first name.';
    } else {
        $fn = mysqli_real_escape_string($dbc, trim($_POST['first_name']));
    }

    if (empty($_POST['last_name'])) {
        $errors[] = 'You forgot to enter your last name.';
    } else {
        $ln = mysqli_real_escape_string($dbc, trim($_POST['last_name']));
    }

    if (empty($_POST['email'])) {
        $errors[] = 'You forgot to enter your email address.';
    } else {
        $e = mysqli_real_escape_string($dbc, trim($_POST['email']));
    }

    if (empty($errors)) { // 앞서 행한 변수 검증에서 에러가 발생했는지를 검증한다
        $q = "SELECT user_id FROM users WHERE email='$e' AND user_id != $id"; // 다른 유저에게 이미 등록된 email 주소인지 확인해보는 쿼리문
        $r = @mysqli_query($dbc, $q);
        if(mysqli_num_rows($r) == 0) {
            $q = "UPDATE users SET first_name='$fn', last_name='$ln', email='$e' WHERE user_id=$id LIMIT 1";
            $r = @mysqli_query($dbc, $q);

            if (mysqli_affected_rows($dbc) == 1) {
                echo '<p>The user has been edited.</p>';
            } else {
                echo '<p class="error">The user could not be edited due to a system error. We apologize for any inconvenience.</p>';
                echo '<p>' . mysqli_error($dbc) . '<br />Query: ' . $q . '</p>';
            }
        } else {
            echo '<p class="error">The email address has already been registered.</p>';
        }
    } else {
        echo '<p class="error">The following error(s) occurred:<br />';
        foreach ($errors as $msg) {
            echo " - $msg<br />\n";
        }
        echo '</p><p>Please try again.</p>';
    }
}

// edit 페이지. submit 하기 전의 페이지 모습이다
$q = "SELECT first_name, last_name, email FROM users WHERE user_id=$id";
$r = @mysqli_query ($dbc, $q);

if (mysqli_num_rows($r) == 1) {
    $row = mysqli_fetch_array($r, MYSQLI_NUM);

    echo '<form action="edit_user.php" method="post">
    <p>First Name: <input type="text" name="first_name" size="15" maxlength="15" value="' . $row[0] . '" /></p>
    <p>Last Name: <input type="text" name="last_name" size="15" maxlength="30" value="' . $row[1] . '" /></p>
    <p>Eamil Address: <input type="text" name="email" size="20" maxlength="40" value="' . $row[2] . '" /></p>
    <p><input type="submit" name="submit" value="Submit" /></p>
    <input type="hidden" name="submitted" value="TRUE" />
    <input type="hidden" name="id" value="'. $id . '" />
    </form>';
} else {
    echo '<p class="error">This page has been accessed in error.</p>';
}

mysqli_close($dbc);

include ('includes/footer.html');
?>




#Error Comment

작동을 테스트하는 과정에서 공백인 상태로 submit을 해보았는데,
에러 발생없이 쿼리문까지 작동하는 현상을 보였다.
각 데이터를 검증하는 if문이 잘못 코딩된 것으로 생각하고 살펴보았으나,
이렇다할 오류를 찾지 못하였다.

하지만 실제 오류를 발생한 부분은 바로 여기다.

if(empty($errors)) {


코딩 과정에서 오타가 발생하여 if(empty($erros)) { 로 입력되었다.
empty($erros)은 $erros 라는 변수가 생성되고 그곳에 null값이 들어있었을 것이므로
리턴값은 True가 되었을 것이다. 그 결과 if문을 통과하여 쿼리문이 수행된 것이다.


Posted by CloudySky
|