Я работаю над веб-приложением, для которого требуется страница входа в систему, все работает нормально, но я заметил, что когда пользователь пытается подключиться, а его пароль содержит caracter, он не может и появляется уродливая ошибка: FATAL ERROR:Call to a member function rowCount() on a non-object
. вот мой код:
$password=$_GET["password"]; $req="SELECT * FROM `enseignant` WHERE ens_cin=$login AND ens_pass=$password"; $res=$idconnex->query($req); if($res->rowCount() > 0) {echo 'SUCCESS CONNECT';} else {echo 'FAIL CONNECT';}
когда я пытался добавить !empty($result)
в if()
, вещь идет хуже .. она conseder всех тех, как имеет caracteres в его пройти, как не подписан в пользователь! но ошибки не появляется .. спасибо за помощь и извините за мой плохой английский.
Мы более чем вероятно имеем дело со строками здесь, поэтому переменные в ваших значениях должны быть указаны.
WHERE ens_cin='$login' AND ens_pass='$password'";
Плюс, просто используя PDO самостоятельно, не означает, что вы в безопасности от SQL-инъекции.
Проницательность:
Убедитесь, что вы действительно подключаетесь через PDO, а не mysqli_
. Я часто вижу эти типы вопросов.
Если это так, эти разные API-интерфейсы MySQL не смешиваются друг с другом.
Теперь это:
$password=$_GET["password"];
Передача пароля через GET небезопасна; вы не знаете, кто может «слушать». Вы должны использовать POST. Я также надеюсь, что вы используете хэш, а не обычный текст для хранения паролей.
Sidenote: Убедитесь, что вы действительно используете GET и не смешиваете с POST, если это происходит из HTML-формы.
"но ошибки не возникает"
Вероятно, вы не проверяете наличие ошибок.
Добавить $idconnex->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
сразу после открытия соединения.
Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.
<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code
Sidenote: Сообщение об ошибках должно выполняться только в стадии постановки и никогда не выпускаться.
Функция query()
возвращает то, что не является объектом.
Вы всегда должны проверять наличие ошибок.
$res = $idconnex->query($req); if ( ! $res) { echo 'This is not an object:<br>'; var_dump($res); die; }
Вы также должны всегда читать руководство при возникновении проблем:
Возвращаемые значения
PDO :: query () возвращает объект PDOStatement или FALSE при сбое .
Небезопасно передавать параметры в запрос, как вы это делали. Проблема, с которой вы столкнулись, может быть вызвана некоторыми небезопасными символами. Вам может потребоваться избежать этого.
Ваша реализация широко открыта для SQL Injection. Вместо этого используйте подготовленную инструкцию. Это безопаснее и избавит вас от таких проблем.
И еще одно: я заметил, что вы пытаетесь напрямую искать $_GET['password']
в своей базе данных. Где я могу заключить, что вы храните пароль в своей базе данных без какого-либо хэширования или шифрования. Возможно, вы захотите пересмотреть это.