php и mysql_num_rows не определяют, отсутствует ли что-либо в базе данных

#php #mysql #mysql-num-rows

#php #mysql #mysql-num-rows

Вопрос:

У меня есть форма на веб-сайте, которая нуждается в проверке перед вводом данных формы в базу данных.

Функция mysql_num_rows проверяет, существует ли имя пользователя пользователем. Но, похоже, я не могу заставить это работать. При тестировании не позволяет добавить новое имя пользователя.

Вот используемый полный код:

 <?php
session_start();

include("databaseConnect.php");
// Insert a row of information into the table "example"


// check if username is already in database
if(mysql_num_rows(mysql_query("SELECT userName FROM registeredUsers WHERE userName =     '$_POST[userName]'"))){
 echo "Username: ". $_POST[userName]." already exists in the Database<br><br>";
    echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);

//check if hemis is already in database
}elseif(mysql_num_rows(mysql_query("SELECT hemis FROM registeredUsers WHERE hemis = '$_POST[hemis]'"))){
echo "Student [Hemis] Number: ". $_POST[hemis]." already exists in the Database<br><br>";
echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);


// if all the conditions above are fine, it will insert the data to MySQL
}else{
  mysql_query("INSERT INTO registeredUsers
(firstName, lastName, hemis, userName, MAC) VALUES('$_POST[firstName]', '$_POST[lastName]', '$_POST[hemis]', '$_POST[userName]', '$_POST[mac]' ) ")
or die(mysql_error());

echo "Data Inserted! <br><br>";
}
  

Большое спасибо 🙂

Комментарии:

1. Предупреждение о таблицах Бобби !

2. ха-ха, это хорошо, но не слишком помогает, lol — Это система в разработке, поэтому в таблице не должно быть записей учащихся, пока они не зарегистрируются в этой онлайн-форме — но с помощью этого кода не распознается, если имя пользователя не существует…

3. Это не автономный фрагмент кода; вы } где-то не туда поместили. Проверьте, не в этом ли проблема.

4. Также обратите внимание, что HTTP_REFERER это довольно ненадежно, вы будете получать сообщения об ошибках бесконечного цикла перенаправления, поскольку некоторые браузеры вообще не отправляют это — лучше перенаправить на вашу форму явно.

5. Спасибо — я изменю HTTP_REFERER — но на данном этапе это не вызывает проблемы, насколько я знаю. Я добавил больший фрагмент кода, чтобы вы могли получить лучшее представление о том, что происходит

Ответ №1:

Я бы переписал это полностью. Это зависит от SQL-инъекции, неэффективно и немного слишком кратко. Кроме того, вам, как правило, лучше использовать расширение PHP mysqli

Кроме того, убедитесь, что вы заключили имена переменных $ _POST в кавычки. Вы записали их как константы, в отличие от строк. (Если вы не определили константы в другом месте кода, которые представляют строковые значения, это ошибка. Включите предупреждения PHP во время разработки.)

 $safe_username = mysqli_real_escape_string($_POST['userName']);
$sql = "SELECT userName FROM registeredUsers WHERE userName='$safe_username' LIMIT 1";
$result = mysqli_query($database_connection, $sql);
if (mysqli_num_rows($result))
{
    // username already found code
    mysqli_free_result($result);
}
else
{
    $safe_hemis = mysqli_real_escape_string($_POST['hemis']);
    $sql = "SELECT hemis FROM registeredUsers WHERE hemis='$safe_hemis' LIMIT 1";
    // Side note, LIMIT 1 tells the database engine to stop looking after it's found one hit. More efficient as you're only looking for a Boolean value anyway.
    $result = mysqli_query($database_connection, $sql);
    if (mysqli_num_rows($result))
    {
        // hemis found code
        mysqli_free_result($result);
    }
}
  

Остальное вы, вероятно, сможете выяснить из этого.

Пожалуйста, подтвердите и экранируйте все входные данные. Проверка включает в себя проверку работоспособности — находятся ли данные в пределах допустимых значений (длина строки, числовые границы и т.д.) и т.д. Весь ввод — зло!

Вы действительно также не хотите зависеть от HTTP_REFERER . Пользовательские агенты не всегда передают ссылки.

Кроме того, я знаю, что это не имеет большого значения, но используйте CSS вместо <br> . Если вы используете doctype XHTML, вы должны правильно закрыть все теги, чтобы <br> стать <br /> . В любом случае, это хорошая идея.

Комментарии:

1. 1 Я бы тоже выполнил некоторый тщательный рефакторинг, если не начинать с нуля. 🙂

Ответ №2:

Лучше всего также проверить результат mysql_query. Это может возвращать результирующий набор, для которого вы можете получить количество строк, но это может возвращать false при сбое запроса. В этом случае у вас не будет результирующего набора, и mysql_count_rows не сможет. Этот сбой вы интерпретируете как 0 строк.

Помимо всех замечательных предложений, которые дал вам Мэтти, я бы также провел дополнительную проверку и строгую проверку типов.

 if ($result = mysql_query('....') === false)
{
  die('Your query failed in the first place. Error: ' . mysql_error());
}
  

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

Комментарии:

1. Это одна вещь, которую я забыл написать в своем ответе. $result может быть NULL, а не «строгое» false, и это следует проверить. Лучший способ — проверить значения, которые принимают значение true, и поместить die() в else предложение.

2. Если вы обнаружили, что mysql_query возвращает значение NULL, вы, вероятно, обнаружили ошибку. Он должен возвращать ресурс false для операторов, которые возвращают данные (например, select), и он должен возвращать true или false для тычинок, которые этого не делают (например, update). Нигде в документации не говорится, что NULL является допустимым результатом.