2016-03-25 11 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> 

Was ich in dem oben genannten Code mache, ist ein Formular erstellen und in eine Datenbank eingeben. Das funktioniert perfekt. Ich möchte jedoch eine Validierung hinzufügen, so dass, wenn der Benutzer nicht alle erforderlichen Felder eingibt, er nicht in der Datenbank gespeichert wird.PHP-Datenbank Validierung

Ich habe erst diese Woche PHP gestartet und bin damit ein Anfänger. Irgendeine Idee, wie man das macht?

+0

Da Sie keine Rahmen verwenden und auch nicht objektorientierten Ansatz, was Sie getan haben, ist genug. Warum bist du nicht glücklich damit? –

+0

es ist für ein Projekt – chris

+3

Sie bitten uns, Ihnen einen "besseren" Weg zu geben, dies zu tun? Wenn das der Fall ist, wie würdest du "besser" definieren? Mehr wiederverwendbar? Schneller? Kommentare zu Best Practices?Ich bin nicht wirklich sicher, was deine Frage ist, was du funktionstüchtig siehst und was du tust, ist grundlegend genug, dass der Kontext ziemlich wichtig ist, um zu bestimmen, was ein besserer Ansatz sein könnte. Gibt es einen bestimmten Abschnitt Ihres Codes, mit dem Sie nicht zufrieden sind? – GentlemanMax

Antwort

1

kann ich Ihnen etwas anderes bieten:

Erstellen Sie eine Datei, die ein Array mit Validierungsregeln aller Felder hält Sie in Ihrer Datenbank, Tabelle nach Tabelle:

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... 
]; 

dann eine andere Datei mit Validator Funktionen erstellen:

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; 
} 

Und dann in Ihrem Code:

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

$userInput = $_POST; 

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

Im Grunde, was ich zu zeigen versuche, ist, dass Sie Validierungsregeln an einem centrelized Platz schaffen können, und Validatoren an einem anderen Ort centrelized. Auf diese Weise, wenn Sie eine Änderung vornehmen müssen, tun Sie es an einem Ort. Was ich in der Validator() Funktion zu tun ist:

  • die Regeln übernehmen und die Benutzereingabe
  • Traverse durch alle Validierungsregeln
  • Build jede Validierungsfunktion, indem Sie den Namen der Regel verketten und das Wort 'Validator' (Ich setze das Wort 'Validator', um die Funktion als Validator zu markieren und einzigartig zu machen. Dies ist wie eine Konvention).
  • Rufen Sie jeden Validator $ Validator()
  • Und dann die Fehlermeldung, wenn es einen gibt.

Dies ist eine Basis, auf die Sie treten können. Sie können mehr Validatoren und Regeln erstellen und verfeinern.

Wenn Sie nichts verstehen, fragen Sie bitte. Du machst einen wirklich guten Job, denn für eine Woche PHP kennst du ziemlich viel.

Viel Glück!

+1

Das ist eine komplette Antwort! Ich denke, Sie sollten '$ result! = True' auf '$ result! == true' aktualisieren, weil die Fehlermeldung in diesem Vergleich nicht als 'wahr' betrachtet wird. – Technoh

+0

Danke! Es ist eine gute Übung, aber in diesem Fall nicht. Hauptsächlich weil true und die Fehlermeldung nicht gleich sind. –

+0

Sind Sie sicher? Denn '('test string' == true)' gibt 'true' zurück. – Technoh

0

Ich hoffe, dass dies hilft, habe ich nur dies für den Namen getan, aber Sie können mehr hinzufügen, um Ihren Bedürfnissen gerecht zu werden.

// 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); 
} 

Und dann Ihre Funktion ...

function doDataBaseStuff($name) { 
    // do database stuff.... 
}