【问题标题】:Check if this is duplicate检查这是否重复
【发布时间】:2018-12-21 19:27:32
【问题描述】:

我想检查username 是否已经存在,如果存在则抛出错误消息,我该怎么做? 我已经尝试过搜索,但只找到了mysql_errno,但它对我不起作用。

  if ($valid) {
        $pdo = Database::connect();
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        //$password = md5($password);
        $sql = "INSERT INTO users (username,password,role) values(?, ?, ?)";
        $q = $pdo->prepare($sql);
        $q->execute(array($username,$password,$role));
        Database::disconnect();
        header("Location: index.php");
    }

sd

【问题讨论】:

  • 您应该先运行SELECT 来检查用户名是否存在,如果不存在,请运行INSERT
  • 但是在SELECT username FROM users之后我该怎么办?
  • @AndréMiguel,我认为您应该先阅读这些教程。 www.mysqltutorial.orghttps://www.tutorialspoint.com/mysql/
  • @Shibon mysql_ 功能不再使用...

标签: php mysql


【解决方案1】:

如果您想检查username 是否已被使用:

SELECT * FROM users WHERE username = :username

如果你返回一行:你抛出你的错误,否则你做你的INSERT

所以你的代码应该是这样的:

if ($valid) {
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql_check = "SELECT * FROM users WHERE username = :username";
    $test = $pdo->prepare($sql_check);
    $test->bindParam(':username', $username); 
    $test->execute;

现在这里有两个解决方案来检查你是否有一行:

    if($test->rowCount() > 0) {
        // error
    }      

    $user = $test->fetch();

    if (!empty($user)) {
        // error
    }

现在如果你没有错误,你插入:

    else {
        //$password = md5($password);
        $sql = "INSERT INTO users (username,password,role) values(?, ?, ?)";
        $q = $pdo->prepare($sql);
        $q->execute(array($username,$password,$role));
        Database::disconnect();
        header("Location: index.php");
    }
}

【讨论】:

  • 但是如何检查返回的行?
  • @AndréMiguel 与 ->fetch
  • 为了显示错误我只需要echo一些错误信息对吗?还是我错过了其他东西?
  • 我不知道你的代码,但是你可以使用 echo,显示一些 flash 消息,如果是 ajax 调用,你可以返回一个错误消息并使用 js 显示它......你只是告诉我们请求部分,不知道你的项目看起来如何!
  • 它现在给了我这个错误Notice: Undefined property: PDOStatement::$execute in C:\xampp\htdocs\gestao\Colaboradores\create_user.php on line 68
【解决方案2】:

两种解决方案:

您可以使用户名字段唯一,这样,如果您尝试使用现有用户名插入一行,MYSQL 会抛出错误。

$sql = "INSERT INTO users (username,password,role) values(?, ?, ?)";
$q = $pdo->prepare($sql);
$result = $q->execute(array($username,$password,$role));
if(!$result) {
    // print out your error message
}

否则,使用想要的用户名进行选择,看看是否返回了一行(= 已使用)或不返回(= 可用)。

$sql = "SELECT COUNT(*) as count FROM users WHERE username = ?";
$q = $pdo->prepare($sql);
$q->execute(array($username));
$result = $q->fetchAll();
// test result, if 1 > print error, etc

【讨论】:

  • 我已经将该字段设置为“唯一”,但我想在 php 页面上显示错误消息,而不是来自 MySQL 的通常错误消息
  • @AndréMiguel execute 查询成功与否返回true或false,您可以在其上设置条件以显示您自己的错误信息
  • 我试过这个$sql2 = "SELECT COUNT(*) as count FROM users WHERE username = ?"; $q2 = $pdo->prepare($sql2); $q2->execute(array($username)); $result = $q2->fetchAll(); if ($result >1){ echo '<h2>ERROR</h2>'; } else{ $sql = "INSERT INTO users (username,password,role) values(?, ?, ?)"; $q = $pdo->prepare($sql); $q->execute(array($username,$password,$role)); } 但它会跳过错误消息
  • 结果是否直接包含计数? (提示:print_r 查看内容)
  • Array ( [0] => Array ( [count] => 1 [0] => 1 ) )
【解决方案3】:
SELECT * FROM users WHERE username = $username

如果发现显示错误,则插入

【讨论】:

    【解决方案4】:
     <?php
         $getUniqueUsername=$con->query("select * from user where name='$user_name");
         $rowCount=$getUniqueUsername->num_rows;
    
         if($rowCount) {          
              $insertQuery=$con->query("insert into table_name (field_name) Values('".$values."'));
         }
    ?>
    

    【讨论】:

    • 这对 SQL 注入开放
    • 另外,只有代码的答案不是 IMO 的答案——添加解释,以便 OP/未来的读者可以理解手头的解决方案/问题
    猜你喜欢
    • 2014-03-24
    • 2016-09-12
    • 1970-01-01
    • 2015-03-17
    • 2021-07-14
    • 2019-02-27
    • 2021-03-23
    • 2011-02-25
    • 2013-05-11
    相关资源
    最近更新 更多