2013-02-10 115 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