2017-02-06 18 views
1

フォームに入力せずに[送信]ボタンをクリックすると、IDを持つデータベースに新しいエントリが表示されますが、フォームは検証を続けてユーザーを表示しますが、このフィールドは必須ですが、空のフォームがデータベースに送信されていますか?

ここは私のコードです。親切に助けてください。私はPHPで新しく、このような問題を解決するのに疲れています。

<?php 
include 'dbc.php'; 

// define variables and set to empty values 
$name_error = $email_error = $phone_error = $url_error = $message_error = ""; 
$name = $email = $phone = $message = $url = $success = ""; 

//form is submitted with POST method 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (isset($_POST["name"])) { 
     $name_error = "Name is required"; 
    } else { 
     $name = test_input($_POST["name"]); 
     // check if name only contains letters and whitespace 
     if (!preg_match("/^[a-zA-Z ]*$/",$name)) { 
      $name_error = "Only letters and white space allowed"; 
     } 
    } 

    if (empty($_POST["email"])) { 
     $email_error = "Email is required"; 
    } else { 
     $email = test_input($_POST["email"]); 
     // check if e-mail address is well-formed 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
      $email_error = "Invalid email format"; 
     } 
    } 

    if (empty($_POST["phone"])) { 
     $phone_error = "Phone is required"; 
    } else { 
     $phone = test_input($_POST["phone"]); 
     // check if e-mail address is well-formed 

     } 


    if (empty($_POST["url"])) { 
     $url_error = "Website url is required"; 
    } else { 
     $url = test_input($_POST["url"]); 
     // check if URL address syntax is valid (this regular expression also allows dashes in the URL) 
     if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$url)) { 
      $url_error = "Invalid URL"; 
     } 
    } 

    if (empty($_POST["message"])) { 
     $message_error = "Message field is required"; 
    } else { 
     $message = test_input($_POST["message"]); 

    } 

    if ($name_error == '' and $email_error == '' and $phone_error == '' and $url_error == '' and $message_error == ''){ 
     $message = 'Hello Ladies'; 
     unset($_POST['submit']); 
     foreach ($_POST as $key => $value){ 
      $message .= "$key: $value\n"; 
     } 

     $to = '[email protected]'; 
     $subject = 'Contact Form Submit'; 
     if (mail($to, $subject, $message)){ 
      $success = "Message sent, thank you for contacting us!"; 

     } 

    } 


     $query = "INSERT INTO clients(name,email,phone,url,message) "; 
     $query .= "VALUES('$name', '$email', '$phone', '$url', '$message') "; 

     $create_user = mysqli_query($mysqli, $query); 

     if (!$create_user) { 
      die("QUERY FAILED. " . mysqli_error($mysqli)); 
     } 

} 


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

私はdownvoteを取得しないことを願っています。

+0

私は、コードのこの部分に気づくと、あなたはそれを使用しないでください。その下の機能は、ここであなたを助けません。さらに、これは「論理的」なものです。 –

答えて

0

クエリが実行される前に、実際に行われている唯一のチェックは、値を挿入するための唯一の要件は、フォームがPOST、他には何を介して送信されるということであることを意味

if ($_SERVER["REQUEST_METHOD"] == "POST") { 

です。これは適切なエディタを使って確認することができます。入力の検証とチェックを行うために、コードの初期段階でいくつかのチェックを行いますが、クエリを実行するかどうかはわかりません。

クエリが実行された後、それはすべてあなたの小切手を渡された場合、クエリはにのみ実行されますまで、あなたがあれば、ブロック

if ($name_error == '' and $email_error == '' and $phone_error == '' and $url_error == '' and $message_error == ''){ 

次の閉鎖ブラケット}を移動した場合。あなたのtest_input()(本当に)ごみで、他の発言では

if (!$create_user) { 
    die("QUERY FAILED. " . mysqli_error($mysqli)); 
} 

を(次のスニペットの後に配置)し、あなたはそれを使用しないでください。代わりにクエリをパラメータ化し、適切な関数で入力をフィルタリングします。 validation filterssanitation filtersがすでにPHPで実装されていますので、必要に応じて使用してください。

あなたが準備しmysqli::prepare()を使用して、クエリの値をバインドする必要があり、これは引用符を扱うすべての問題を処理し、SQLインジェクションに対するデータベースの保護を強化します。

参照

+0

ありがとう、仲間。私はPHPに新しいですので、コーディングでの行動のような種類が許容できない、私はあなたが言ったことに従わなければなりません。 1つの質問、本当に気にする必要があるかどうか($ _SERVER ["REQUEST_METHOD"] == "POST")? – user3465481

関連する問題