我正在处理需要登录页面的网络应用程序,一切正常但我注意到当用户尝试连接并且他的密码包含字符时他不能出现并显示一个丑陋的错误{{ 1}}。 这是我的代码:
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)
时,情况变得最糟糕......它将所有那些因为没有登录用户而在通行证中加工的人更加坚定!但没有出现错误..
感谢您的帮助,抱歉我的英语不好。
答案 0 :(得分:2)
我们很可能在这里处理字符串,因此需要引用值中的变量。
WHERE ens_cin='$login' AND ens_pass='$password'";
另外,仅仅使用PDO,并不意味着您可以安全地防止SQL注入。
洞察力:
确保您确实通过PDO而不是mysqli_
进行连接。我经常看到这些类型的问题。
如果是这种情况,那些不同的MySQL API不会相互混合。
现在这个:
$password=$_GET["password"];
通过GET传递密码既不安全也不安全;你不知道谁可能会在"聆听"。你应该使用POST。我也希望您使用哈希而不是纯文本来存储密码。
旁注:如果这是来自HTML表单,请确保您确实使用了GET并且没有与POST混在一起。
"但没有出现错误"
您可能没有检查错误。
在打开连接后立即添加$idconnex->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
。
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
答案 1 :(得分:0)
query()
函数返回的不是对象。
您应始终检查错误。
$res = $idconnex->query($req);
if ( ! $res) {
echo 'This is not an object:<br>';
var_dump($res);
die;
}
遇到问题时,您也应始终read the manual:
返回值
PDO :: query()返回PDOStatement对象, 或失败时为FALSE 。
答案 2 :(得分:0)
将参数传递给查询是不安全的。您遇到的问题可能是由一些不安全的字符引起的。你可能需要逃避它。
您的实现对SQL注入非常开放。 请改用预备语句。它更安全,可以帮助您避免此类问题。
还有一件事,我注意到您正试图直接在数据库中搜索$_GET['password']
。我可以断定您将密码存储在数据库中而不进行任何散列或加密。你可能想重新考虑一下。