1
<?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");

这行得通!

4

5 回答 5

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 
}
于 2013-02-10T08:01:06.507 回答
1

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

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

于 2013-02-10T08:00:17.477 回答
0

我最近为一个 android 应用程序做了类似的事情。你真的应该看看这个网站。它极大地帮助了我。这是一个为应用程序提供 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;
    }
}
于 2013-02-10T08:03:12.203 回答
0

这对我有用:

$test = $test->fetch_assoc();
if(!empty($test)) die("usererror");
于 2013-02-10T20:22:16.657 回答
-1

您的代码确实不安全,没有经过优化,任何人都可以在您的代码中使用 sql 注入登录。

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

这里有一些提示,始终使用这种风格进行安全和优化

对 $email 做同样的事情

第三次运行查询后不检查是真还是假,但在查询后再次检查

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

在谷歌上检查 sql injections 为什么我这样做

于 2013-02-10T08:05:03.530 回答