php и mysql_num_rows не обнаруживают, если что-то отсутствует в базе данных - PullRequest
1 голос
/ 29 мая 2011

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

Проверка того, существует ли имя пользователя пользователем в функции 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>";
}

Большое спасибо:)

Ответы [ 2 ]

1 голос
/ 29 мая 2011

Лучше также проверить результат 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 голос
/ 29 мая 2011

Я бы переписал это полностью. Он подвержен внедрению 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>. Если вы используете тип документа XHTML, вам нужно правильно закрыть все теги, чтобы <br> стал <br />. В любом случае, это хорошая идея.

...