2014-10-15 4 views
0

У меня есть код для этой гостевой книги из учебника, но я решил добавить к ней некоторую безопасность и проверку ip. Я изучаю php, делая это. Проблема, с которой я столкнулась, заключается в том, что инструкции «If else» ничего не проверяют и просто добавляют в базу данных. Вот код:Гостевая книга, добавляющая запись без полей проверки

  if ($_POST['postbtn']) { 
       $name  = strip_tags($_POST['name']); 
       $email = strip_tags($_POST['email']); 
       $message = strip_tags($_POST['message']); 
       $answer = 'abcdefg'; 
       $response = strtolower(strip_tags($_POST['answer'])); 

       // Check if all fields were filled out 
       if ($name && $email && $message && $response) { 

        $time = date("h:i A"); 
        $date = date("m/d/Y"); 
        $ip = $_SERVER['REMOTE_ADDR']; 
       } 

       else { 

        echo "<p style='color:red;'>You didn't fill out all of the fields.</p>"; 

       } 

       // Check if security answer was correct 
       if ($response === $answer) { 
        echo "<p style='color:red;'>Security answer was incorrect.</p>"; 
       } else { 

        // Check ip address 
        $checkIP = mysql_query("SELECT ip FROM guestbook WHERE ip = '$ip'"); 

       } 
       if (mysql_num_rows($checkIP) > 0) { 

        echo "<p style='color:red;'>You already signed.</p>"; 

       } else { 

        // add to the database 
        mysql_query("INSERT INTO guestbook VALUES (
             '', '$name', '$email', '$message', '$time', '$date', '$ip' 
             )"); 

        // refresh page 
        header('Location: http://www.example.com/guestbook'); 
       } 
      } 
+0

Первый - отступы ваш код. –

+0

Обучение сэр, обучение. –

+0

Если isset будет лучше здесь. В ходе проверки вы фактически проверяете, созданы ли переменные, а не пустые. В вашем чеке для строк num вы должны добавить это в оператор else, поэтому он должен быть другим, если .. Я нахожусь на своем планшете, но я увижу, могу ли я переписать код, когда я доберусь до компьютера – Dorvalla

ответ

0
if (isset($_POST['postbtn'])) { 

// define variables after the check if the postbtn is pressed 

    $name  = strip_tags($_POST['name']); 
    $email = strip_tags($_POST['email']); 
    $message = strip_tags($_POST['message']); 
    $answer = 'abcdefg'; 
    $response = strtolower(strip_tags($_POST['answer'])); 

// Check if all fields were filled out, I turned it arround for you, it checks now if it's empty, if so, process an error, else continue 

    if (empty($name) || empty($email) || empty($message) || empty($response)) { 
     echo "<p style='color:red;'>You didn't fill out all of the fields.</p>"; 

// Check if security answer was correct, you check here if its correct and state incorrect answer. 

    }else if ($response != $answer) { 
     echo "<p style='color:red;'>Security answer was incorrect.</p>"; 

// so now we have all errors out of the way, lets go deeper 

    }else{ 
     $time = date("h:i A"); 
     $date = date("m/d/Y"); 
     $ip = $_SERVER['REMOTE_ADDR']; 

     $checkIP = mysql_query("SELECT ip FROM guestbook WHERE ip = '$ip'"); 

// check if we get anything back from the query 
     if (mysql_num_rows($checkIP) > 0) { 
      echo "<p style='color:red;'>You already signed.</p>"; 
     } else { 
      mysql_query("INSERT INTO guestbook VALUES ('', '$name', '$email', '$message', '$time', '$date', '$ip')"); 
// refresh page 
      header('Location: http://www.example.com/guestbook'); 
     } 
    } 
} 

Я делаю это из головы, так что не стреляйте меня на него. Я попытался указать, где ваши недостатки. Например, у вас был недостаток в проверке ваших переменных, у вас был недостаток вашей безопасности (на самом деле вы получите сообщение об ошибке при вводе правильного ответа на безопасность)

Итак, чтобы объяснить все это, если вы должны зайти глубоко в отверстие кролика, как они говорят это красиво. Иногда вам требуется инструкция else для продолжения и углубления. Таким образом вы можете лучше поймать свои ошибки. Например. В любом случае ваш код будет вводиться в базу данных, потому что даже если бы у вас была ошибка, она просто дошла бы до ввода его в базу данных. (ваши ответы будут проигнорированы, так как переменные, установленные внутри оператора if else, не могут использоваться вне этого цикла. См. его как localized variable)

Но если вы продолжаете копать глубже в выражениях if else, вы можете взять их с помощью вы.

редактировать

Кроме того, я выравнивал код для вас, так что вы видите, насколько глубоко мы идем и сколько если-иначе заявления там на самом деле. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь;)

edit2

я фактически заменил ответ и ответ чек 1, если другое заявление вниз и сделал еще, если сохранить все ошибки рядом друг с другом. Вы также можете сделать это с переменной, чтобы проверить num_rows, но я не сделал этого. Вы также можете бросить это в заявлении else if после проверки безопасности. Это также должно работать, но чтобы сделать его красивее, вы можете пойти так, как я описал.

Теоретически это должно работать нормально.

+0

Спасибо, что нашли время, чтобы помочь мне. Я получаю синтаксическую ошибку, неожиданную '&&' (T_BOOLEAN_AND) здесь: 'if (empty ($ name)) && (empty ($ email)) && empty ($ message)) && empty ($ response))' –

+0

Ах да, это из-за оператора 'AND' в вашем' if', вы должны сделать это или, заменив их '||', я только что обновил код. – Dorvalla

+0

Теперь я получаю: синтаксическая ошибка, неожиданная '||' –

0

Он проверяет все, но выполнение не блокируется ошибками. Оберните свой код в блок try-catch и создайте исключение при каждой ошибке.

try { 
    if ($_POST['postbtn']) { 
     $name = strip_tags($_POST['name']); 
     $email = strip_tags($_POST['email']); 
     $message = strip_tags($_POST['message']); 
     $answer = 'abcdefg'; 
     $response = strtolower($_POST['answer']); 

     // Check if all fields were filled out 
     // Invert condition 
     if (!$name || !$email || !$message || $response) { 
      throw new Exception("You didn't fill out all of the fields."); 
     } 

     $time = date("h:i A"); 
     $date = date("m/d/Y"); 
     $ip = $_SERVER['REMOTE_ADDR']; 

     // And so on... 
    } 
} 
catch (Exception $e) { 
    echo "<p style='color:red;'>" . $e->getMessage() . "</p>"; 
} 
+0

Я не могу понять, как вставить остальную часть кода в это. –