2013-08-09 4 views
1

Я довольно новичок в php-сцене, но поскольку я искал несколько часов о том, что может быть неправильно с этим кодом, я в недоумении. По какой-то причине FILTER_VALIDATE_EMAIL и уникальная проверка электронной почты в db не работают, их пропускают полностью. Я знаю это, потому что, когда форма отправлена, она выдает ошибку на последнем catch(PDOExceptions $ex) (не показана, но после последнего блока кода ниже) вместо любой другой ошибки, установленной для показа прежде (показано здесь). Ошибок не возникает (или показывается) до тех пор, пока не будет предпринята попытка вставить данные формы в db. Поскольку индекс электронной почты уникален, он не позволяет дублировать вставку. Таким образом, запрос не запускается и die(). Я пытаюсь опубликовать сообщение о том, что письмо недействительно или что оно уже используется в самой форме без die().FILTER_VALIDATE_EMAIL и уникальная проверка электронной почты в db не работает

Сначала я установил условия для подачи пустых входов и повторил обработку ошибок для всех других входов, как показано для «fname».

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

     if(empty($_POST['fname']) || 
      empty($_POST['lname']) || 
      empty($_POST['email']) || 
      empty($_POST['password'])) 
     { 
      if(empty($_POST['fname'])) 
     { 
      $fnamerr = "<font color=\"red\">Please enter your first name</font>"; 
     } 

Тогда я проверить пустой:

} 
    else if (!empty($_POST['fname']) && 
     !empty($_POST['lname']) && 
     !empty($_POST['email']) && 
     !empty($_POST['password'])) 
    { 

     if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
     { 
      $emailerr = "<font color=\"red\">Please enter a valid email address</font>"; 
     }  

     $query = " 
      SELECT 
       1 
      FROM users 
      WHERE 
       email = :email 
     "; 

     $query_params = array( 
      ':email' => $_POST['email'] 
     ); 

     try 
     { 
      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
     } 
     catch(PDOException $ex) 
     { 
      die ("Failed to run query: " . $ex->getMessage());   
     } 

     $row = $stmt->fetch(); 

     if($row) 
     { 
      $emailerr = "<font color=\"red\">This email address is already registered</font>"; 
     } 

Что не так с этим кодом? Или может быть причиной того, что FILTER_VALIDATE_EMAIL и уникальная проверка электронной почты в db полностью пропущены? Спасибо заранее.

+2

Я не вижу нигде, что вы пытаетесь остановить скрипт на основе '$ emailerr' или даже эха, возвращаемого пользователю. – Mike

+0

Майк. Я вставляю '$ fnamerr' в html над вводом формы как' ', А остальные в свои собственные (т.е.' $ emailerr' в '') , – impromptu

+0

Похоже, вам нужно изучить некоторые основные принципы отладки. Вставьте комбинации 'echo',' print_r' или 'var_dump' в ключевые места вашего скрипта, чтобы увидеть, действительно ли эта часть выполняется, а если нет, то почему. Возможно, заявление 'elseif', которое у вас здесь, терпит неудачу, но я не могу сказать. Попробуйте повторить некоторую случайную строку сразу после нее. Появляется ли оно на выходе? Если нет, попробуйте повторить различные переменные, используемые там, и работать с логикой вручную. Например, возможно, '$ _POST ['lname']' пуст. – Mike

ответ

0

я, наконец, понял это, для тех, кто может быть ищет ту же информацию.

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

     if(empty($_POST['fname']) || 
      empty($_POST['lname']) || 
      empty($_POST['email']) || 
      empty($_POST['password'])) 
     { 
      if(empty($_POST['fname'])) 
      { 
       $fnamerr = "<font color=\"red\">Please enter your first name</font>"; 
      } 

Снова, я сделал то же самое для фамилии, имени и пароля, если они пусты. Затем:

 } else if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
     { 
      $emailerr = "<font color=\"red\">Please enter a valid email address</font>"; 
      $submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8'); 
      $submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8'); 
      $submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8'); 
     } else if (!empty($_POST['fname']) && 
       !empty($_POST['lname']) && 
       !empty($_POST['email']) && 
       !empty($_POST['password'])) 
     {          
      $query = " 
       SELECT 
        1 
       FROM users 
       WHERE 
        email = :email 
      "; 

      $query_params = array( 
       ':email' => $_POST['email'] 
      ); 

      try 
      { 
       $stmt = $db->prepare($query); 
       $result = $stmt->execute($query_params); 
      } 
      catch(PDOException $ex) 
      { 
       die ("Failed to run query: " . $ex->getMessage()); 
      } 

      $row = $stmt->fetch(); 

      if ($row) 
      { 
       $emailerr2 = "<font color=\"red\">This email address is already registered</font>"; 
       $submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8'); 
       $submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8'); 
       $submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8'); 

      } else 
      { 

Затем я запускаю код для вставки информации в таблицу db. Это прекрасно работало. Надеюсь, ничего больше не придет. Спасибо за комментарии и помощь.

0

http://php.net/manual/en/function.filter-var.php действительно возвращает отфильтрованное значение, так

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); 
if(false !== $email) { 
     $query = " 
      SELECT 
       1 
      FROM users 
      WHERE 
       email = :email 
     "; 

     $query_params = array( 
      ':email' => $email 
     ); 

     try 
     { 
      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
     } 
     catch(PDOException $ex) 
     { 
      die ("Failed to run query: " . $ex->getMessage());   
     } 

     $row = $stmt->fetch(); 

     if($row)   { 
      $emailerr = "<font color=\"red\">This email address is already registered</font>"; 
     } 
     else { 
      // ...insert record... 
     } 
} 
else { 
      $emailerr = "<font color=\"red\">Please enter a valid email address</font>"; 
} 
+0

@cske ... спасибо за сообщение, но я включил его, и проверки еще не произошло. Весь этот блок пропускается так же, как и раньше. – impromptu

Смежные вопросы