【问题标题】:Check row exists with PDO [duplicate]检查行是否存在 PDO [重复]
【发布时间】:2018-04-11 19:16:25
【问题描述】:

我想不通,我一直在阅读大量堆栈溢出线程,但我一直遇到问题,

现在,如果用户输入任何内容,无论是相同的用户名还是电子邮件,都会出现错误。请帮忙!

我希望在用户键入数据库中已有的用户名或电子邮件时显示错误消息。

$sql = "SELECT count(*) FROM users WHERE user_email = :email OR user_name = :username";
        $query1 = $DBH->prepare($sql);
        $query1->execute(array(':username'  => $username,':email' => $email));

        if ($query1->rowCount() > 0){
            // User Exists
            $error = "Username or E-Mail in Use";

        }   else{
            // User Does Not Exist
            //No errors - let’s create the account
            //Encrypt the password with a salt
            $encryptedPass = password_hash($_POST['password'], PASSWORD_DEFAULT);
            //Insert DB
            $query = "INSERT INTO users (user_email, user_password, user_forename, user_lastname, user_name, user_gender, user_country, user_number) VALUES (:email, :password, :firstname, :lastname, :username, :gender, :country, :mobile)";
            $result = $DBH->prepare($query);
            $result->bindParam(':username', $_POST['username']);
            $result->bindParam(':firstname', $_POST['firstname']);
            $result->bindParam(':lastname', $_POST['lastname']);
            $result->bindParam(':email', $_POST['email']);
            $result->bindParam(':gender', $_POST['gender']);
            $result->bindParam(':country', $_POST['country']);
            $result->bindParam(':mobile', $_POST['mobile']);
            $result->bindParam(':password', $encryptedPass);

            if($result->execute()){
                echo '<div class="alert alert-success" role="alert">Registration Successful!</div>';
                echo "<script> window.location.assign('index.php?p=login'); </script>";
            }
        }

编辑

        $stmt = $DBH->prepare("SELECT COUNT(*) FROM users WHERE user_email = :email OR user_name = :username");
        $stmt->execute(array(':username'  => $username,':email' => $email));
        $count = $stmt->fetchColumn();

        var_dump($count);

        if ($count > 0) {
            $error1 = "Username or E-Mail in Use. Please try another.";
        }

        if(!$error){

                //No errors - let’s create the account
                //Encrypt the password with a salt
                $encryptedPass = password_hash($_POST['password'], PASSWORD_DEFAULT);
                //Insert DB
                $query = "INSERT INTO users (user_email, user_password, user_forename, user_lastname, user_name, user_gender, user_country, user_number) VALUES (:email, :password, :firstname, :lastname, :username, :gender, :country, :mobile)";
                $result = $DBH->prepare($query);
                $result->bindParam(':username', $_POST['username']);
                $result->bindParam(':firstname', $_POST['firstname']);
                $result->bindParam(':lastname', $_POST['lastname']);
                $result->bindParam(':email', $_POST['email']);
                $result->bindParam(':gender', $_POST['gender']);
                $result->bindParam(':country', $_POST['country']);
                $result->bindParam(':mobile', $_POST['mobile']);
                $result->bindParam(':password', $encryptedPass);

                if($result->execute()){
                    echo '<div class="alert alert-success" role="alert">Registration Successful!</div>';
                    // echo "<script> window.location.assign('index.php?p=login'); </script>";
                }
            }

var dump = string(1) "0"

【问题讨论】:

  • 您正在计算行数,因此它将返回 1 rowvalue of 0。然后您询问有多少行,即 1。您可以做的是SELECT 1 FROM ...,如果找到记录,它将返回一行,如果找不到匹配记录,则返回一个空数据集。
  • $sql = "从用户中选择 1 个用户,其中 user_email = :email OR user_name = :username"; ?我试过它不起作用,对不起,如果我做错了我对 PHP 还很陌生
  • 为什么不使用SELECT id FROM ... 这将比计算所有列更快。还添加LIMIT 1 可能会有所帮助
  • 对不起,我根本不关注 ;(
  • 如果行数大于 1,我应该如何计算行数?

标签: php pdo row exists


【解决方案1】:

解决此问题的几种方法。正如@chris85 提到的,您需要实际获取结果而不是使用rowCount()

编辑:删除了第一个示例。

<?php
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE user_email = :email OR user_name = :username");
$stmt->execute(array(':username'  => $username,':email' => $email));
$count = $stmt->fetchColumn();

if ($count > 0) {
    $error = "Username or E-Mail in Use";
} else {
    ...

【讨论】:

  • 致命错误:在 null 上调用成员函数 prepare() 我在准备时收到此错误,我不知道我做错了什么
  • @HasnaatKhan $DBH 是您的联系人,而不是 $pdo。你改了吗?
  • @waterloomatt,啊,谢谢,但我仍然从一开始就收到同样的问题,即使有重复,它也只是提交:(
  • @HasnaatKhan 请使用您的新代码更新问题。也做一个var_dump($count); 并添加它的输出。
  • 你好,我更新了,谢谢你的帮助
猜你喜欢
  • 2012-08-12
  • 2012-08-19
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2011-07-13
相关资源
最近更新 更多