Ошибка PHP: вызов функции-члена rowCount () для объекта без объекта

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

Проницательность:

Убедитесь, что вы действительно подключаетесь через 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'] в своей базе данных. Где я могу заключить, что вы храните пароль в своей базе данных без какого-либо хэширования или шифрования. Возможно, вы захотите пересмотреть это.