У меня есть этот код:

$sql=mysqli_query($con,"SELECT username, password, email FROM users WHERE username=$username");
    if(mysqli_num_rows($sql)>=1)
    {
        echo "<div class='form'>
        <h3>Username already in use.</h3></div>";
    }

При использовании этого кода он возвращает следующее предупреждение:

Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, логическим значением, заданным в ...

Почему отображается это предупреждение и как его исправить?

1
J.K. Harthoorn 13 Мар 2018 в 22:05

2 ответа

Лучший ответ

Вы неправильно выполняете свой запрос. Это подвержено ошибкам и всегда будет давать вам такие ошибки. Более того, он также подвержен SQL-инъекциям.

Когда вы добавляете переменную непосредственно в запрос, ее содержимое может мешать, что приведет к множеству проблем, от такой ошибки до SQL-инъекции. Чтобы избавиться от таких ошибок раз и навсегда, вы должны сначала подготовить свой запрос, добавив вопросительный знак вместо переменной, а затем отправить его отдельно. Так никогда не помешает.

Вы должны сначала подготовить свой запрос, затем привязать переменную, а затем выполнить:

$sql = "SELECT username, password, email FROM users WHERE username=?";
$stmt = $con->prepare($sql);
$stmt->bind_param("s", $username);
$stmt->execute();
$res = $stmt->get_result();
if($res->num_rows())
{
    echo "<div class='form'>
    <h3>Username already in use.</h3></div>";
}
2
Your Common Sense 14 Мар 2018 в 08:11

Если вы посмотрите документацию по методу mysqli_query, вы увидим, что при сбое запроса метод возвращает False. Это то, что происходит в вашем примере. Затем вы передаете это логическое значение в mysqli_num_rows, что объясняет сообщение об ошибке.

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

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

-1
Greg Kaleka 13 Мар 2018 в 19:40