2016-03-25 5 views
-1
<!DOCTYPE html> 
<html lang="en-US"> 
<head> 
<title>Book A Table</title> 
</head> 
<body> 

<h1>Book A Table</h1> 



<?php 
// define variables and set to empty values 
$nameErr = $emailErr = $numErr=$dateErr = $timeErr = $personsErr=""; 
$name = $email = $num= $date = $time = $persons = $comment= ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["name"])) { 
    $nameErr = "Name is required"; 
    } else { 
    $name = test_input($_POST["name"]); 
    // check if name only contains letters and whitespace 
    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"; 
    } 
    } 
    if (empty($_POST["num"])) { 
    $numErr = "Number is required"; 
    } else { 
    $num = test_input($_POST["num"]); 
    if (!preg_match("([0-9])", $num)) { 
     $numErr = "Enter numbers only"; 
    } 
    } 



    if (empty($_POST["date"])) { 
    $dateErr = "Date is required"; 
    } else { 
    $date = test_input($_POST["date"]); 
    } 



    if (empty($_POST["time"])) { 
    $timeErr = "Time is required"; 
    } else { 
    $time = test_input($_POST["time"]); 
    } 
    if (empty($_POST["persons"])) { 
    $personsErr = "Number of persons is required"; 
    } else { 
    $persons = test_input($_POST["persons"]); 
    } 
} 

function test_input($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 
?> 

    <form action="DBInput.php" method="POST" /> 

    <p><span class="error">* required field.</span></p> 
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
    Full Name<br> <input type="text" name="name"> 
    <span class="error">* <?php echo $nameErr;?></span> 
    <br><br> 
    E-mail<br> <input type="text" name="email"> 
    <span class="error">* <?php echo $emailErr;?></span> 
    <br><br> 
    Contact Number<br> <input type="text" name="num"> 
    <span class="error">*<?php echo $numErr;?></span> 
    <br><br> 
    Reservation Date<br> <input type="date" name="date"> 
    <span class="error">*<?php echo $dateErr;?></span> 
    <br><br> 
Reservation Time<br>(Mon - Thur: 18:00 - 23:00 Fri - Sun: 12:00 - 00:00)<br> <input type="time" name="time"> 
<span class="error">*<?php echo $timeErr;?></span> 
    <br><br> 
Number of Persons<br> <input type="text" name="persons"> 
<span class="error">*<?php echo $personsErr;?></span> 
    <br><br> 
Comments<br><textarea name="comment" rows="5" cols="40"></textarea><br><br> 

    <input type="submit" name="submit" value="Submit"> 
</form> 





</body> 
</html> 

То, что я делаю в приведенном выше коде, создает форму и вводит ее в базу данных. Это прекрасно работает. Однако я хотел бы добавить подтверждение, чтобы, если пользователь не вводит все обязательные поля, он не будет храниться в базе данных.Проверка базы данных PHP

На этой неделе я только начал писать PHP и поэтому стал нищим. Есть идеи как это сделать ?

+0

Поскольку вы не используете рамки и даже не объектно-ориентированный подход, что вы сделали достаточно. Почему ты не доволен этим? –

+0

его для проекта – chris

+3

Вы просите нас дать вам «лучший» способ сделать это? Если это так, как бы вы определили «лучше»? Более многоразовые? Быстрее? Комментарии к лучшим практикам?Я не совсем уверен, в чем ваш вопрос, что вы выглядите функционально, и что вы делаете, достаточно основательно, чтобы контекст был очень важен для определения того, что может быть лучшим подходом. Есть ли определенный раздел вашего кода, который вы недовольны? – GentlemanMax

ответ

1

Я могу предложить вам что-то другое:

Создайте файл, который хранит массив с правилами проверок всех полей, которые есть в вашей базе данных, таблицы по таблице:

fields.php

return [ 
    'users' => [ // Let's say your table is called `users` 
     'name' => [ 
      'required', // This means the field is required 
     ], 
     'email' => [ 
      'email' // email validator 
     ] 
     // etc... 
    ] 
    // etc... 
]; 

Затем создайте другой файл с функциями валидатора:

validator.php

function requireValidator($value) { 
    if (empty($value)) { 
     return 'Required value' 
    } 
    return true; 
} 

function emailValidator($value) { 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     return 'This is not a valid email'; 
    } 

    return true; 
} 

function numberValidator() and so on 
... 

function validate($fields, $input) { // And here is where the validation happens 
    $errors = []; 
    foreach ($userInputArray as $inputField => $inputValue) { 
     foreach ($userInputField as $rule) { 
      $validator = "{$rule}Validator"; 
      $result = $validator($inputValue); 
      if ($result !== true) { 
        $errors[$inputField][] = $result; 
      } 
     } 
    } 

    return $errors; 
} 

И тогда в вашем коде:

require('validator.php'); 
$fields = require('fields.php'); 

$userInput = $_POST; 

$errors = validate($fields['users'], $userInput); 
if (!empty($errors)) { 
    // Show errors to the user 
} 

В общем, что я пытаюсь показать вам, что вы можете создать правила проверки на одном месте centrelized и валидаторы на другом centrelized месте. Таким образом, если вам нужно внести изменения, вы делаете это в одном месте. Что делать в функции валидатора() является:

  • принимает правила и ввод данные пользователя
  • пройдены через все правила проверки
  • сборку каждой функцию проверки по сцеплению имени правила и слова «Validator» (я помещаю слово «Validator», чтобы отметить функцию как валидатор и сделать ее уникальной. Это похоже на соглашение).
  • Вызвать каждый валидатор $ validator()
  • И затем возьмите сообщение об ошибке, если оно есть.

Это основа, на которую вы можете вмешаться. Вы можете создать больше валидаторов и правил и сделать их более сложными.

Если вы ничего не поняли, пожалуйста, спросите. У вас действительно хорошая работа, потому что за одну неделю PHP вы знаете очень много.

Удачи вам!

+1

Это один полный ответ! Я думаю, вы должны обновить '$ result! = True' до' $ result! == true', хотя из-за того, что сообщение об ошибке не будет считаться «истинным» в этом сравнении? – Technoh

+0

Спасибо! Это хорошая практика, но в этом случае нет. В основном потому, что true и сообщение об ошибке не равны. –

+0

Вы уверены? Потому что '('test string' == true)' возвращает 'true'. – Technoh

0

Надеюсь, это поможет, я сделал это только для имени, но вы можете добавить больше к этому в соответствии с вашими потребностями.

// Array to store any input validation errors 
$errorArray = []; 
$nameErr = "Name is required"; 

// test to see if the $_POST variable is set 
if(isset($_POST['submit'])) { 
    // test to see if the $_POST variable contains the key name 
    if(isset($_POST['name'])) { 
    if($_POST['name'] == "") { 
     // error message for name is required. 
     $errorArray[] = $nameErr; 
    } else { 
     // there is a value for name do your regex here 
    } 
    } 
} 
// Use print_r function to see if there are any items in the errorArray for yourself  
// print_r($errorArray); 
// * count the values in the errorArray... this is where it will ensure that if there are any errors found it will not set the $name variable and will not call you other database functions. 
if(count($errorArray > 0)) { 
    // loop through the errorArray and display the errors you can customize this as you see fit. 
    for($i = 0; $i < count($errorArray); $i++) { 
    echo $errorArray[$i]; 
    } 
} else { 
    // Your form has been submitted. 
    // no errors you can do database calls here. 
    $name = test_input($_POST['name']); 
    //<form action="DBInput.php" method="POST" /> 
    // try not using the form action DBInput and make a function call instead passing in each value you need. 
    doDataBaseStuff($name); 
} 

И тогда ваша функция ...

function doDataBaseStuff($name) { 
    // do database stuff.... 
} 
Смежные вопросы