2011-07-11 117 views
0

這是一件非常簡單的事情,但它由於某種原因不起作用。繼承人我的代碼。mysql_query()很奇怪地失敗

我在做功能(其類的一部分),它檢查是否一個用戶名或電子郵件存在:

public function exists ($what, $who) 
{ 
    $sql = "SELECT * FROM users WHERE $what = $who"; 
    $query = mysql_query($sql); 

    if (mysql_num_rows($query) != 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

該函數返回什麼。事實上,如果我通過普通的PHP運行該查詢,它也不會返回任何內容。我不明白爲什麼。

這下面這段代碼返回新聞條目完美:

function fetch($id = '') 
{ 
    if (empty($id)) 
    { 
     $query = 'SELECT * FROM news ORDER BY id desc'; 
    } 
    elseif (is_numeric($id)) 
    { 
     $query = "SELECT * FROM news WHERE id = $id"; 
    } 
    else 
    { 
     $route->to(SITE_URL); 
    } 
    $result = mysql_query($query); 

    if (mysql_num_rows($result) > 0) 
    { 
     return $result; 
    } 

} 

我很困惑。

+0

函數永遠不會返回任何結果。它將始終返回true或false,具體取決於查詢的結果。我建議你使用'mysql_error()' – phant0m

+1

你知道[Little Bobby Tables](http://xkcd.com/327/)嗎? – Jacob

回答

5

的問題是,你缺少在您的查詢報價:

$sql = "SELECT * FROM users WHERE $what = $who"; 
//SELECT * FROM users WHERE username = Mario is not a valid query 

應該是:

$sql = "SELECT * FROM users WHERE $what = '$who'"; 

其他查詢都是工作,因爲你正在檢查對一個ID,在這種情況下,一個字符串(在這種情況下,你需要引號)

+0

問題是,$可以指定一個字符串或一個id屬性。如果他檢查身份證會怎麼樣? – phant0m

+0

這不是問題,你可以做select * from table where id ='4' –

+0

你可能想用PDO參數化查詢(http://php.net/manual/en/pdo.prepared-statements.php) 。如果'$ id'由用戶提供,這也可以幫助你避免SQL注入。 –

0

也許查詢執行失敗,並且你的php.ini在屏幕上關閉了錯誤

嘗試在查詢的正確執行增加中間檢查:

$query = mysql_query($sql); 

if ($query === FALSE) { 

    // log error with mysql_errno($conn) and mysql_error($conn); 

} else { 

    if (mysql_num_rows($query) != 0) { 

     return true; 

etc. etc.