检查用户名可用性php

时间:2013-02-10 07:54:55

标签: php mysql

<?php
$con = mysqli_connect('localhost','root','[mypassword]','dbhwsource');

if(isset($_GET['username'])){
$username = $con->real_escape_string($_GET['username']);
$test = $con->query("SELECT username FROM users WHERE username='$username'");
if($test!=false) die("usererror");
}

if(isset($_GET['email'])){
$email = $con->real_escape_string($_GET['email']);
$test = $con->query("select * from users where email='$email'");
if($test!=false) die("emailerror");
}

$con->close();
echo "ok";
?>

所以我只是想检查用户名/电子邮件是否可用,但无论输入用户名是什么,我得到的都是“usererror”!我很沮丧,并且到处搜索示例代码,代码看起来没有任何问题。我做错了什么?

修改

$test = $test->fetch_assoc();
if(!empty($test)) die("usererror");

这很有用!

5 个答案:

答案 0 :(得分:2)

由于您的查询返回true,因此执行此行if($test!=false) die("usererror");, 应该像

$test = $con->query("SELECT username FROM users WHERE username='$username'");
$row_cnt = $test->num_rows;
if( $row_cnt > 0 ) { 
  //you already have user with this name, do something 
}

答案 1 :(得分:1)

如果查询成功

$con->query会返回结果对象。这并没有说明找到的行数或查询是否匹配任何内容,只是表示查询已成功执行。因此,$test!=false测试始终成功;只有在数据库错误的情况下它才会失败。

将查询作为SELECT COUNT(*) FROM ...,然后获取结果的第一行,并查看计数是否为> 0

答案 2 :(得分:0)

我最近为Android应用做了类似的事情。你应该真的检查一下this site。它帮了我很大的忙。这是为应用程序提供PHP API的详细示例。特别是登录。

具体来说,这是PHP页面的一个片段

/*
 * Check user is existed or not
 */
public function isUserExisted($email) {
    $result = mysql_query("SELECT email from users WHERE email = '$email'");
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        // user existed
        return true;
    } else {
        // user not existed
        return false;
    }
}

答案 3 :(得分:0)

这对我有用:

$test = $test->fetch_assoc();
if(!empty($test)) die("usererror");

答案 4 :(得分:-1)

您的代码实际上并不安全,没有优化任何人都可以在您的代码中使用sql注入进行登录。

你的代码是正确的,因为你正在检查thar(test!= false)这意味着你的代码og usererror正在执行的原因是正确的

这里有一些提示,并始终使用此样式进行安全性和优化

  

为$ email

执行相同操作      运行查询后第三个不检查是否为true或false,但在查询后再次检查

if($test->username === $_GET['username']) { do something }
  

检查Google上的sql注入为什么我这样做