警告:PDO::exec() 要求参数 1 为字符串

Warning: PDO::exec() expects parameter 1 to be string

我正在开发需要登录页面的 Web 应用程序,一切正常,直到我尝试转换为 PDO 并使用准备好的查询,这里是我的代码:

$req=$idconnex->prepare("SELECT * FROM `enseignant` WHERE ens_cin=:cin AND ens_pass=:pass");
$req->bindParam(':cin',$_GET["login"]);
$req->bindParam(':pass',$_GET["password"]);
$res=$idconnex->exec($req);
if(!empty($res) AND $res->rowCount==1)          
    {echo 'SUCCESS';}
else
    {echo 'FAIL';}

出现警告:

Warning: PDO::exec() expects parameter 1 to be string, object given in...

结果 return 即使我插入正确的参数也失败了!

准备语句时,需要execute instead of exec并且需要使用准备时设置的对象:

$req=$idconnex->prepare("SELECT * FROM `enseignant` WHERE ens_cin=:cin AND ens_pass=:pass");
$req->bindParam(':cin',$_GET["login"]);
$req->bindParam(':pass',$_GET["password"]);
$req->execute();

另请注意 rowCount() is a method, not a property, and you cannot rely on its value when you use a SELECT query. See the manual page about rowCount() 以获取更多信息。

此外,当您发送密码等信息时,您不应使用 GET,而应使用 POST,并且您应该使用加盐哈希作为密码,绝不能使用纯文本密码。有关详细信息,请参阅 Secure hash and salt for PHP passwords

将此添加到 jeroen 的回答中

$status = $req->fetch(\PDO::FETCH_ASSOC);
if($status)          
{echo 'SUCCESS';}
else
{echo 'FAIL';}

$req->fetch(\PDO::FETCH_ASSOC);实际上是在查询查询结果。您可以通过 var_dump($status) 查看它包含的内容。 如果找到匹配项,它将 return 关联数组;如果未找到匹配项,它将为空。

PHP 会将非空变量评估为布尔值 true 并将空、空、零元素数组评估为布尔值 falseif($status)if($status == true) 几乎相同。您可以在 PHP 手册中找到它。