PHP предотвратить повторяющийся пост - PullRequest
1 голос
/ 05 июля 2011

У меня есть код ниже, который обновляет информацию о пользователе. Мне нужно выполнить запрос ТОЛЬКО для полей, которые заполнены, поэтому вам не нужно добавлять всю информацию каждый раз, когда вы хотите немного отредактировать пользователя. Я хочу игнорировать пустые поля формы

Я не могу понять, какой метод для достижения этой цели:

 if(isset($_POST['do_edit'])) {


    $id = mysql_real_escape_string($_POST['user_id']);
    $company_name = mysql_real_escape_string($_POST['company_name']);
    $contact = mysql_real_escape_string($_POST['contact']);
    $username = mysql_real_escape_string($_POST['username']);
    $phone = mysql_real_escape_string($_POST['phone']);
    $address = mysql_real_escape_string($_POST['address']);
    $email = mysql_real_escape_string($_POST['email']);
    $password = mysql_real_escape_string($_POST['password']);
    $password2 = mysql_real_escape_string($_POST['confirm']);
    $level = mysql_real_escape_string($_POST['user_level']);
    $restrict = mysql_real_escape_string($_POST['restrict']);

    $delete = mysql_real_escape_string($_POST['delete']);

    // Ticked the 'delete user' box? If so, delete and echo message.    
    if($delete == 'delete_uid' && $error == '') {

    $sql = "DELETE FROM login_users WHERE user_id='$id'";
    $query = mysql_query($sql) or die("Fatal error: ".mysql_error());

    echo "<h3>Deleted</h3>";
    echo "<div class='success_message'>User <b>$company_name $contact</b> has been removed from the database.</div>";

    echo "<h2>What to do now?</h2><br />";
    echo "<a href=''>&laquo; Back to Admin Panel</a> | Go to the <a href='user_edit.php'>edit users</a> page.</li>";

    } else {

    // Validate the submitted information

        if(trim($id) == '1') {
            $error = '<div class="error_message">Attention! You cannot edit the main Administrator, use database.</div>';
        } else if(trim($company_name) == '') {
            $error = '<div class="error_message">Attention! You must enter a company name.</div>';
        } else if(trim($contact) == '') {
            $error = '<div class="error_message">Attention! You must enter a contact name.</div>';
        } else if(!isEmail($email)) {
            $error = '<div class="error_message">Attention! You have entered an invalid e-mail address, try again.</div>';
        } else if(trim($level) == '') {
            $error = '<div class="error_message">Attention! No user level has been selected.</div>';
        }

    // Password been entered? If so, validate and update information.

        if($password != '') {

            if($password != $password2) {
                $error = '<div class="error_message">Attention! Your passwords did not match.</div>';
            }

            if(strlen($password) < 5) {
                $error = '<div class="error_message">Attention! Your password must be at least 5 characters.</div>';
            }

            if($error == '') {

            $sql = "UPDATE login_users SET restricted='$restrict', company_name='$company_name', contact='$contact', email='$email', user_level='$level', password = MD5('$password') WHERE user_id = '$id'";
            $query = mysql_query($sql) or die("Fatal error: ".mysql_error());

            echo "<h2>Updated</h2>";
            echo "<div class='success_message'>User information (and password) updated for User ID <b>$id ($company_name)</b>.</div>";

            echo "<h2>What to do now?</h2><br />";
            echo "<a href=''>&laquo; Back to Admin Panel</a> | Go to the <a href='user_edit.php'>edit users</a> page.</li>";

            }

    // Password has not been entered don't update password fields.

        } else {

            if($error == '') {

            $sql = "UPDATE login_users SET restricted='$restrict', company_name='$company_name', contact='$contact', username='$username', email='$email', user_level='$level' WHERE user_id = '$id'";
            $query = mysql_query($sql) or die("Fatal error: ".mysql_error());

            echo "<h2>Updated</h2>";
            echo "<div class='success_message'>User information updated for <b>$company_name</b>.</div>";

            echo "<h2>What to do now?</h2><br />";
            echo "<a href=''>&laquo; Back to Admin Panel</a> | Go to the <a href='user_edit.php'>edit users</a> page.</li>";

            }

        }

    }
}

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Проверьте список полей и динамически создайте запрос UPDATE, основываясь на тех из них, которые соответствуют критериям.Настоятельно рекомендуем написать одну или две функции, которые помогут построить запрос без повторяющейся логики, но подсказка должна содержать следующее:

$sql = "UPDATE login_users SET ";
$first = 1;
if ($restrict != '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "restricted='$restrict'";
}

if ($company_name != '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "company_name='$company_name'";
}

if ($contact != '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "contact='$contact'";
}

if ($username != '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "username='$username'";
}

if ($email != '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "email='$email'";
}

if ($level!= '') {
    if ($first) {
        $first = 0;
    } else {
        $query += ", ";
    }
    $query += "user_level='$level'";
}

$query += " WHERE user_id = '$id'";

if (! $first) {
    // do query, since we know something was changed
}
0 голосов
/ 05 июля 2011

Вы можете попробовать что-то вроде этого:

$sql = "UPDATE login_users SET ";
foreach ($_POST as $fieldname=>$value) {
    if ($value) {
        $sql .= "$fieldname='$value', ";
    }
}
$sql = substr($sql, 0, -2); // to remove the last ", "
$sql .= " WHERE user_id = '$id';";

Остерегайтесь двух вещей:

  1. $ fieldname должно совпадать с фактическим именем поля в вашей базе данных (если нет, вы должны сделать что-то, чтобы переименовать его).
  2. Вы должны сделать md5 для паролей где-то посередине.

РЕДАКТИРОВАТЬ: Еще две вещи!

  1. Не забудьте выполнить экранирование MySQL.
  2. Это можно сделать красивее, используя sprintf
0 голосов
/ 05 июля 2011

Два способа сделать это:

  • Обычно я использую только поля базы данных (кроме пароля ...) для предварительного заполнения полей формы.Они не должны быть пустыми.
  • Начните с пустого запроса UPDATE (UPDATE login_users SET ? WHERE user_id=$id) и создайте строку field = 'value', ... для замены?.

Второй вариант кажется более громоздким, чем просто предварительное заполнение формы.

...