2012-03-26 4 views
-1

В основном у меня есть форма, в которой вводится идентификатор studentID, тогда я хочу проверить идентификатор введенного studentID в базе данных, если он отправит форму на следующую страницу. Если нет, то выводится сообщение об ошибке на странице, где вы вводите studentIDphp stop form from posting

ли на самом деле не знаю, с чего начать Приветствия

+3

Вы ** широко открыты ** для SQL-инъекций и ** вы будете взломаны **, если вы еще не были. Научитесь делать подготовленные запросы с помощью PDO, чтобы полностью избежать этой проблемы. – Brad

+0

Вы слышали о mysql_num_rows? Вы можете использовать это, чтобы убедиться, что ваш запрос возвращает результат и действует соответственно, отображает ошибку, если она равна 0, а если нет, то разрешить пользователю продолжить. http://php.net/manual/en/function.mysql-num-rows.php – davidjwest

ответ

3

это то, что вы хотите?

<form id = "form" action = "./?page=markandfeedback" method = "post"> 

    <br> 
    Mark for: 
<INPUT id="stud" onkeypress="return isNumberKey(event)" type="text" name="stud" value="Enter Student Number"> 
<input type="submit" value = 'Continue'> 
<? 

$studID = $_POST['stud']; 
$module2 = $_SESSION['module']; 
$ex = $_POST['exer']; 
$studerr = array(); 

$sql = 'SELECT * FROM `student`, `modules` WHERE `studentID` = '.$studID.' AND `moduleCode` = '.$_SESSION['module']; 
$result = mysql_query ($sql); 
// echo $_SESSION['module']; 

if ($result == NULL) { // nothing found 
echo "the student id you entered is not in the database"; 
} 
else { 


$_SESSION['student'] = $studID; 

Header("Location: http://www.whereever.com/"); // send the browser where you want 
exit(); 
} 
?> 

EDIT: Подхожу другие ответы. Я предполагаю, что вы правильно проверяете инъекцию mysql. Я рекомендую использовать AJAX ПОСЛЕ того, как все работает и безопасно. Идея моего решения заключалась в том, чтобы решить проблему как можно проще. Если вы хотите сделать что-то фантазию из него можно:

  • порождает всю форму с помощью PHP и сообщить пользователю в поле ввода, что идентификатор не найден
  • сообщите Javascript представить информация каким-то причудливым способом
  • Использование AJAX. Все любят формы с AJAX.
  • Вы можете, как и предполагалось, предположить, что пользователь ввел действительный идентификатор. Вы проверили бы на странице «whereever», чтобы идентификатор действительно был действительным. Если бы это было не так, вы просто отправили бы пользователя обратно в форму и сказали php вывести сообщение об ошибке (возможно, через get). Эта возможность не обычна, я не уверен, есть ли у нее какие-либо преимущества.

подсказка mysql_num_rows тоже хороша, если вы не хотите получать какие-либо данные от пользователя. Я думал, что вы хотите что-то сделать с данными из-за SELECT *.

0

Вы можете сделать это двумя различными способами

  1. AJAX - сделать вызов Ajax на ваш сервер и проверьте идентификатор, если его существует, отобразите ошибку, перейдите на следующую страницу.
  2. PHP - введите скрытый ввод в свою форму и сделайте действие формы на той же странице и проверьте все их и сохраните значения полей ввода - $ _POST ['field_name'];

И вы можете сделать действие в другую страницу и вернуться обратно переменной или сделать сеанс для хранения сообщения об ошибке

1

Создайте отдельный контроллер, который проверяет имя пользователя.

Используйте ajax для проверки правильности ввода данных пользователем.

Таким образом, вы будете иметь что-то вроде этого:

<input id="stud" onchange="checkStudentId(this)" /> 

<script> 
function checkStudentId(inputElement) { 
var id = inputElement.value(); 

    $.ajax({ 
    url: "test.html", 
    context: {id:id} 
    }).done(function() { 
    // Check the return result 
    }); 
} 
</script> 

Вот ссылка на JQuery Ajax http://api.jquery.com/jQuery.ajax/

+0

Хороший ответ, но не пытаясь покровительствовать автору вопроса, используя Ajax, может быть немного выше их текущего уровня. – davidjwest

+0

Хорошее усовершенствование UX, но на самом деле не решает проблему валидации, как я указал в своем ответе. Есть несколько способов, которые могут потерпеть неудачу. – gregmac

+0

Не пытаясь решить все. Автор выглядит так зелёно на программировании, что я действительно не хочу усложнять ситуацию. Попросить его понять, что XSS или SQLInjection, вероятно, немного зависит от того, что он пытается сделать. Как и выражение, до тех пор, пока дерьмо не ударит по вентилятору, они не поймут, что вы пытаетесь ему сказать, но когда это произойдет, он научится и не забудет. – Churk

1

Вы на самом деле нужно подключиться к серверу каким-то образом выяснить студента существует. То, что вы обычно делали в этой ситуации, - это отправить форму на сервер и выполнить проверку на стороне сервера. Если ученик существует, вы возвращаете «следующую» страницу. Если ученик не существует, вы снова возвращаете (или перенаправляете на использование заголовка местоположения) ту же форму с сообщением об ошибке.


Другой популярный метод будет использовать запрос AJAX для проверки асинхронно (который я вижу многие другие люди рекомендуют). Я бы рекомендовал этот метод, только если вы действительно выполняете проверку правильности, поскольку они закончили ввод идентификатора студента и показывают сообщение об ошибке в режиме реального времени. Таким образом, AJAX - это хорошая возможность обеспечить быструю обратную связь с пользователем, но не реальное решение. Имейте в виду, что независимо от этого вам необходимо проверить и обработать это, когда форма отправлена ​​в любом случае или, по крайней мере, подумайте о том, что произойдет, когда форма будет отправлена ​​с недопустимым идентификатором.

  • Люди могут обойти эту проверку (каждый запрос со стороны клиента считается враждебным, вы не можете полностью доверять ничего)
  • Другой пользователь может удалить идентификатор студента между временем проверки было сделано, и форма была отправлена ​​
  • Там может быть ошибка в коде, который вызывает проверку ложно передать или не признавать отрицательный ответ

Выполнение AJAX onsubmit не имеет смысла, так как эффективно вы удваивая объем работы заставив сервер обрабатывать два отдельные запросы в строке. Это просто неправильный ответ на проблему.


Самая большая проблема с этой реализации код PHP может быстро получить довольно волосатый и трудно следовать, как вы все смешаны вместе.

Это то, где вы, вероятно, начинаете опрокидывать PHP, как язык шаблонов (смешанный PHP-код и html-разметку), и начинаете использовать фреймворк, где ваши представления (HTML) отделяются от вашего PHP-кода (если вы При использовании очень заполненного MVC pattern этот код называется вашим контроллером - именно потому, что он контролирует реакцию сервера). Так будет работать любой профессиональный разработчик. Kohana, CakePHP и Zend - все примеры довольно популярных фреймворков MVC, все из которых используются профессионально.

0

Попробуйте это:

<? 
     if(isset($_POST['stud'])){ 
      $studID = $_POST['stud']; 
      $module2 = $_SESSION['module']; 
      $ex = $_POST['exer']; 
      $studerr = array(); 
    $host="hostname";//your db host 
    $user="user";//your db user 
    $pass="pass";//your db pass 
    $conn=mysql_connect($host,$user,$pass); 

      $sql = 'SELECT * FROM `student`, `modules` WHERE `studentID` = '.$studID.' AND `moduleCode` = '.$_SESSION['module']; 
      $result = mysql_query ($sql,$conn); 

     if(mysql_num_rows($result)>0){//the id was found in the DB, do whatever here... 

     echo $_SESSION['module']; 

     $_SESSION['student'] = $studID; 

    Header("Location: http://www.whereever.com/");//redirect to wherever 
     $error=false; 
     } 

     else{//id was not found 
$error=true;} 



     }//end of isset 
     ?> 



     <? if($error===true){?> <div> The id was not found.... </div> <?}?> 
     <form id = "form" action = "<? echo $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; ?>" method = "post"> 

       <br> 
       Mark for: 
     <INPUT id="stud" onkeypress="return isNumberKey(event)" type="text" name="stud" value="Enter Student Number"> 
     <input type="submit" value = 'Continue'> 

Так что это делает: Когда пользователь нажимает представить, conects в БД, и проверяет, является ли идентификатор существует ... если это произойдет, то он перенаправляет его на wherever.com (см. комментарии), и если это не ошибка, сообщение messege появится. Обязательно измените значения переменной db на свои собственные ($host, $user, $pass).