2013-02-10 45 views
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”,无论输入的用户名是什么!我只是感到沮丧,并且随处搜索示例代码,代码看起来没有问题。我究竟做错了什么?检查用户名可用性php

编辑:

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

这个工作!

+0

为什么投了下来... :( – DarrenVortex 2013-02-10 08:12:02

+0

1.避免SQL注入通过使用准备好的陈述2.添加错误消息,即'$ con> error',以获得有关错误性质的更多信息。 – 2013-02-10 08:20:47

+0

1.我使用转义字符串,因此不应该阻止SQLi? 2.没有错误,否则我会在这里发布。 – DarrenVortex 2013-02-10 08:43:42

回答

0

这为我工作:

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

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

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

+0

没有工作,请检查编辑。 – DarrenVortex 2013-02-10 08:17:25

+1

好的,这是一个Mysqli对象。不要使用它的mysql函数,使用mysqli方法来获取结果! – deceze 2013-02-10 08:20:50

+0

哦,这是正确的,我觉得如此倾倒! :/所以现在我得到未定义的索引。为检查索引0.我要检查行号... – DarrenVortex 2013-02-10 08:25:53

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

这也失败了...... – DarrenVortex 2013-02-10 08:12:56

+0

@Sudhir你是对的100%,很棒的工作 – humphrey 2013-02-10 09:01:46

+0

行数每次都为我返回1。 – DarrenVortex 2013-02-10 09:17:14

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; 
    } 
} 
+0

这失败了。检查编辑 – DarrenVortex 2013-02-10 08:17:42

+0

是使用这个只会失败。你必须将api的其余部分放在一起。如果你按照我给你的链接。它进入极端的细节。我用这个例子来创建我自己的android应用程序的api。它效果很好。 – Mark 2013-02-10 14:13:54

-1

你的代码是不是真的没有安全优化,任何人都可以在你的代码的SQL注入登录。

和你的代码是正确的,你正在检查塔尔(测试!= FALSE)这意味着它是真实的,这就是为什么你的代码OG usererror正在执行

这里是一些提示,并始终使用这种风格的安全和优化

做同样为$电子邮件

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

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

在谷歌检查SQL注入的,为什么我这样做

+0

即时通讯使用scape字符串,所以它应该是安全的...:/ – DarrenVortex 2013-02-10 08:18:17

+0

real_escape_string在此修复SQL注入。 – Johan 2013-02-10 09:19:41