2013-08-28 85 views
0

我刚开始玩PDO,我试图创建一个函数来显示给定表名的所有数据。在阅读了几篇文章后,我发现了一个解决方案,我可以开始工作(下面用硬编码的select语句显示)。然而,当我绑定我的字段名称时,我无法让我的execute语句正常工作(我得到的异常类似于:Undefined index:person_id)。我应该提及我的类扩展PDO:PHP - (PDO)使用绑定变量执行

/********************************************************************* 
*Function showTable 
*Purpose Display all information for a given table. 
*Params $sTable -> Table name 
********************************************************************/ 
public function showTable($sTable) 
{ 
    $result; 

    try 
    { 
     if(isset($sTable)) 
     { 
      //create a result in a table format 
      $result = "<table>"; 
      //$stmt = $this->prepare('DESCRIBE :sTable'); 
      $stmt = $this->prepare('DESCRIBE ' . $sTable); 

      //$stmt->bindParam(':sTable', $sTable); 
      $stmt->execute(); 

      //array version of the column names 
      $aCols = $stmt->fetchAll(PDO::FETCH_COLUMN); 
      //string version of the column names 
      $sCols = implode (", ", $aCols); 

      //$stmt = $this->prepare('SELECT :fields FROM :sTable'); 
      //$stmt = $this->prepare('SELECT :fields FROM person'); 
      $stmt = $this->prepare('SELECT person_id, first_name, last_name FROM person'); 

      //$stmt->execute(array(':fields'=>$sCols, 'stable'=>$sTable)); 
      //$stmt->execute(array(':fields'=>$sCols)); 
      $stmt->execute(); 

      while($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
      { 
       var_dump($row); 
       $result = $result . "<tr>"; 
       foreach($aCols as $col) 
       { 
        //var_dump($row); 
        $result = $result . " <td>" . $row[$col]. "</td>"; 
       } 
       $result = $result . "</tr>"; 
      } 
      $result = $result . "</table>"; 
     } 
     return $result; 
    } 
    catch(PDOException $e) 
    { 
     if($this->bDebug) 
     { 
      echo $e->getMessage(); 
     } 
    } 
} 

就像我说的硬编码的选择string作品,但是当我注释掉硬编码,并取消它引发异常绑定的执行。

回答

1

您不能以这种方式插入标识符或关键字。

PDOStatement :: execute()会将转义形式的值放在单引号内。您的查询如下所示:

SELECT 'col1, col2' FROM person 

什么是无效的MySQL语法。

有效例如:

$stmt = $this->prepare('SELECT col FROM person WHERE name = :name'); 
$stmt->execute(array(':name' => $name)); 

它的工作原理,因为它是你在这里插入一个值;而不是关键字或标识符。

+0

哦,我现在明白了。非常感谢你。我会尽快设置为可接受的答案。 – Travis

+0

有了这些信息,我按照我想要的方式工作,再次感谢 – Travis