2012-08-03 109 views
1

我在這裏有點困惑。我有以下代碼:PHP PDO查詢不能使用變量?

class Users { 
    function count_matched_rows($needle, $haystack){ 
     global $userdb; 

     $query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE ? = ?"); 
     $query->execute(array($haystack, $needle)); 

     return $query->fetchColumn(); 
    } 
} 

$users = new Users(); 
print_r($users->count_matched_rows("jeremyfifty9", "username")); 

與爲1的預期值打印0,所以我改成了這樣:

class Users { 
    function count_matched_rows($needle, $haystack){ 
     global $userdb; 

     $query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE `username` = 'jeremyfifty9'"); 
     $query->execute(array($haystack, $needle)); 

     return $query->fetchColumn(); 
    } 
} 

$users = new Users(); 
print_r($users->count_matched_rows("jeremyfifty9", "username")); 

預期它打印1。有誰知道爲什麼第一個代碼打印0而第二個打印1?

(順便說一句 - 我試圖讓這個模擬mysql_num_rows

+2

您不能使用佔位符/可變的變量名,只爲值。 – jeroen 2012-08-03 02:16:49

+2

強制性的「不要使用'全局'(特別是在一個類中,但是,真的,從來沒有在任何地方使用它)註釋使$ userdb成爲一個私有成員,並通過構造函數傳遞它 – 2012-08-03 02:18:06

+0

謝謝凱文。代碼)。@ jeroen,是否可以做我想做的事情? – jeremy 2012-08-03 02:23:44

回答

2

您不能使用佔位符/變量作爲變量名稱,只能使用該值。

您可以在查詢中發送變量名稱和硬編碼用戶名。

另一種方法是檢查的變量名稱對一個白名單,並直接在查詢中使用一個有效的名稱作爲變量:

$whitelist = array('username', ....); // add all valid column names 

// check for variable in whitelist 
if (in_array($haystack, $whitelist)) 
{ 
    $query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE `$haystack` = ?"); 
    $query->execute(array($needle)); 
    // etc. 
} 
+0

我看到了,讓我試試。 – jeremy 2012-08-03 02:32:54

+0

它的工作,謝謝。我必須使用白名單嗎? – jeremy 2012-08-03 02:42:50

+1

@Nile你需要確保你的查詢安全的從sql注入。 – jeroen 2012-08-03 02:44:29

3

不能使用變量作爲列名。您只能將其用於列值。

您已經完成的方式,您將選擇所有記錄,其中字符串值$haystack等於字符串值$needle。這幾乎不會是真的。如果它是真的,你將只返回表中的所有行。無論如何,這當然不是你想要的,並希望解釋爲什麼它返回0結果。

+0

這是否意味着它是不可能做我想做的事嗎? – jeremy 2012-08-03 02:23:09