我刚刚开始玩PDO,我正在尝试创建一个显示给定表名的所有数据的函数。在这里阅读了几篇文章后,我找到了一个可以解决的解决方案(如下图所示,带有硬编码的select语句)。但是,当我绑定我的字段名时,我无法使我的execute语句工作(我得到一个类似于以下的异常:Undefined index:person_id)。我应该提一下我的课程扩展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();
}
}
}
就像我说硬编码的选择字符串有效但当我注释掉硬编码并用绑定取消注释执行时它会抛出异常。
答案 0 :(得分:1)
您不能以这种方式插入标识符或关键字。
PDOStatement :: execute()会将转义形式的值放在单引号内。您的查询将如下所示:
SELECT 'col1, col2' FROM person
什么是无效的MySQL语法。
一个有效的例子:
$stmt = $this->prepare('SELECT col FROM person WHERE name = :name');
$stmt->execute(array(':name' => $name));
它有效,因为它是你在这里插入的一个值;而不是关键字或标识符。