PHP error: Call to a member function rowCount() on a non-object
PHP error: Call to a member function rowCount() on a non-object
我正在开发需要登录页面的网络应用程序,一切正常,但我注意到当用户尝试连接并且他的密码包含他不能连接的字符时,出现了一个丑陋的错误 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';}
当我试图在 if()
中添加 !empty($result)
时,事情变得最糟糕了.. 它考虑了所有那些在他们的通行证中如何具有特征的用户作为未登录的用户!!但没有出现错误..
感谢您的帮助,抱歉我的英语不好。
query()
函数返回了一些不是对象的东西。
您应该始终检查错误。
$res = $idconnex->query($req);
if ( ! $res) {
echo 'This is not an object:<br>';
var_dump($res);
die;
}
当您 运行 遇到问题时,您也应该始终 read the manual:
Return Values
PDO::query() returns a PDOStatement object, or FALSE on failure.
像您那样将参数传递给查询是不安全的。您遇到的问题可能是由一些不安全的字符引起的。您可能需要转义它。
您的实现对 SQL 注入是开放的。
请改用准备好的语句。它更安全,可以避免您遇到此类问题。
还有一件事,我注意到您正在尝试直接在数据库中搜索 $_GET['password']
。我可以得出结论,您将密码存储在数据库中而没有任何散列或加密。您可能需要重新考虑一下。
我们很可能在这里处理字符串,因此需要引用您的值中的变量。
WHERE ens_cin='$login' AND ens_pass='$password'";
此外,仅单独使用 PDO 并不意味着您可以安全地抵抗 SQL 注入。
一个见解:
确保您确实是通过 PDO 而不是 mysqli_
进行连接。我经常看到这类问题。
如果是这样,那些不同的 MySQL API 不会相互混合。
现在这个:
$password=$_GET["password"];
通过 GET 传递密码也不安全;你不知道 "listening in" 可能是谁。你应该使用 POST。我还希望您使用哈希而不是纯文本来存储密码。
旁注:确保您确实在使用 GET 而不是与 POST 混淆,这应该来自 HTML 形式。
"but no error appear"
您可能没有检查错误。
连接打开后立即添加$idconnex->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
。
将 error reporting 添加到您的文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告只能在试运行中进行,绝不能在生产中进行。
我正在开发需要登录页面的网络应用程序,一切正常,但我注意到当用户尝试连接并且他的密码包含他不能连接的字符时,出现了一个丑陋的错误 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';}
当我试图在 if()
中添加 !empty($result)
时,事情变得最糟糕了.. 它考虑了所有那些在他们的通行证中如何具有特征的用户作为未登录的用户!!但没有出现错误..
感谢您的帮助,抱歉我的英语不好。
query()
函数返回了一些不是对象的东西。
您应该始终检查错误。
$res = $idconnex->query($req);
if ( ! $res) {
echo 'This is not an object:<br>';
var_dump($res);
die;
}
当您 运行 遇到问题时,您也应该始终 read the manual:
Return Values
PDO::query() returns a PDOStatement object, or FALSE on failure.
像您那样将参数传递给查询是不安全的。您遇到的问题可能是由一些不安全的字符引起的。您可能需要转义它。
您的实现对 SQL 注入是开放的。 请改用准备好的语句。它更安全,可以避免您遇到此类问题。
还有一件事,我注意到您正在尝试直接在数据库中搜索 $_GET['password']
。我可以得出结论,您将密码存储在数据库中而没有任何散列或加密。您可能需要重新考虑一下。
我们很可能在这里处理字符串,因此需要引用您的值中的变量。
WHERE ens_cin='$login' AND ens_pass='$password'";
此外,仅单独使用 PDO 并不意味着您可以安全地抵抗 SQL 注入。
一个见解:
确保您确实是通过 PDO 而不是 mysqli_
进行连接。我经常看到这类问题。
如果是这样,那些不同的 MySQL API 不会相互混合。
现在这个:
$password=$_GET["password"];
通过 GET 传递密码也不安全;你不知道 "listening in" 可能是谁。你应该使用 POST。我还希望您使用哈希而不是纯文本来存储密码。
旁注:确保您确实在使用 GET 而不是与 POST 混淆,这应该来自 HTML 形式。
"but no error appear"
您可能没有检查错误。
连接打开后立即添加$idconnex->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
。
将 error reporting 添加到您的文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告只能在试运行中进行,绝不能在生产中进行。