检查数据库中是否存在用户

时间:2013-08-28 09:46:11

标签: php mysqli

我创建了一个用户类,用于验证通过表单传递的数据,然后更新数据库表用户。我想添加额外的功能,例如检查表中是否存在用户名和电子邮件,我添加了一个小脚本,但它似乎不起作用。

我插入了一个重复的电子邮件地址,但我没有收到错误消息“电子邮件存在”,而是收到了“插入1行”的成功消息:

我下面做错了吗?是否有更好的方法来解决这个问题?

 public function insert() {

if (isset($_POST['submit'])) {
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';

$result = $this->mysqli->prepare("SELECT * FROM users WHERE email='".$email."'");

if ($result->num_rows) {
echo "email exisits!";
} 
 else
 {
$stmt = $this->mysqli->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)");
        $stmt->bind_param('ssss', $username, $password, $name, $email); // bind strings to the paramater
        //escape the POST data for added protection

$username = isset($_POST['username']) ? $this->mysqli->real_escape_string($_POST['username']) : '';
$cryptedPassword = crypt($_POST['password']);
$password = $this->mysqli->real_escape_string($cryptedPassword);
    $name = isset($_POST['name']) ? $this->mysqli->real_escape_string($_POST['name']) : '';
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';
        /* execute prepared statement */
$stmt->execute();
    printf("%d Row inserted.\n", $stmt->affected_rows);
    /* close statement and connection */
$stmt->close();
            }

4 个答案:

答案 0 :(得分:1)

您需要在准备声明后使用此代码

$stmt->execute();
$stmt->store_result();

把这个

if ($result->num_rows > 0) {
echo "email exisits!";
} 

而不是

if ($result->num_rows) {
echo "email exisits!";
} 

答案 1 :(得分:1)

您正在使用您可以选择的最差API。

使用safeMysql,它将是

$exists = $this->db->getOne("SELECT 1 FROM users WHERE email=?s", $_POST['email']);
if ($exists) {
    echo "email exisits!";
} 

使用PDO稍长但可以使用

$stmt = $this->db->prepare("SELECT 1 FROM users WHERE email=?");
$stmt->execute(array($_POST['email']));
$exists = $stmt->fetchColumn();
if ($exists)
{
    echo "email exisits!";
} 

但是使用原始mysqli,您只需要屏幕代码来检查用户是否存在。

因此,使用safeMysql的整个函数将是

public function insert()
{
    if (!isset($_POST['submit'])) {
        return FALSE;
    }

    $sql    = "SELECT 1 FROM users WHERE email=?s";
    $exists = $this->db->getOne($sql, $_POST['email']);
    if ($exists)
    {
        echo "email exisits!";
        return FALSE;

    }
    $sql     = "INSERT INTO users SET ?u";
    $allowed = array('username', 'name', 'email');
    $insert  = $this->db->filterArray($_POST, $allowed);
    $insert['password'] = crypt($_POST['password']);
    $this->db->query($sql, $insert);
    return $this->db->afectedRows();
}

答案 2 :(得分:0)

首先,你正在使用prepare(太棒了!)但是你只是传递了电子邮件的价值,有效地破坏了准备好的陈述的好处。

其次,您永远不会执行查询,这就是num_rows中没有任何内容的原因。

public function insert() {

$result = $this->mysqli->prepare("SELECT COUNT(*) FROM users WHERE email=?");
$result->bind_param("s", $_POST['email']);
$result->execute();
$result->bind_result($email_count);

if ($email_count) {
    echo "email exisits!";
} else {
   # your other logic

答案 3 :(得分:-1)

从我可以看到你没有在使用if($ result-> num_rows)测试之前为num_rows赋值,所以它总是为0