2014-10-28 147 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