2014-10-28 160 views
3

我正在返回連接到用戶ID某個用戶的必填字段的功能,我當前的代碼是這樣的:mysqli的查詢返回錯誤的值

<?php 
    function getUserData($id = "current", $field = "username"){ 
     global $database; 
     if($id == "current"){ 
      $id = $_SESSION['userID']; 
     } 
     $query = $database->prepare("SELECT :field FROM `users` WHERE `ID` = :ID LIMIT 1;"); 
     $query->bindParam(":ID",$id); 
     $query->bindParam(":field",$field); 
     $query->execute(); 
     while($row = $query->fetch(PDO::FETCH_BOTH)){ 
      print_r($row); 
     } 
     //return $username; 
    } 
?> 

如果$id值保持空它看起來爲當前登錄的ID,這工作正常。同爲$field,如果是空的,它看起來只是連接ID的問題是在 $query->bindParam("field",$field);的用戶名..由於某種原因,這並不工作,並在使用這個的print_r返回此:

Array ([username] => username [0] => username)

而完全相同的查詢使用作品的時候這樣說:

$query = $database->prepare("SELECT $field FROM用戶WHERE ID = :ID LIMIT 1;");

我在做什麼錯?

+0

bindParam會將字段視爲變量並添加「around」值。你不能使用單引號來表示列名或表名。 – 2014-10-28 09:18:48

回答

4

要綁定字段名稱,所以您的查詢就會變成這個樣子:

SELECT 'username' FROM `users` WHERE `ID` = 'X' LIMIT 1; 

這樣可不行,你不能綁定字段名這樣的。你將不得不直接傳遞字段名稱作爲php變量,而不用綁定它們。

看看這個:Can PHP PDO Statements accept the table or column name as parameter?

它可以幫助你。

+0

如此基本''數據庫 - >準備(「選擇$字段從用戶WHERE ID =:ID限制1;」);'會是我的路要走嗎? – Azrael 2014-10-28 09:19:44

+0

@Azrael是的,這將是你的路要走,你可以添加一些PHP檢查,以確保收到的字段實際存在於表中,這不是面對錯誤的列名錯誤。 – CodeBird 2014-10-28 09:20:45

+0

該字段肯定存在;)感謝您的維護者!將標記一次,我可以;) – Azrael 2014-10-28 09:21:19