PDO准备语句没有返回正确的结果(返回数组填充变量名)

时间:2013-09-20 09:00:34

标签: php mysql pdo

一直在寻找年龄如何让这个准备好的声明同时使用?占位符和命名占位符但没有欢乐。

这是我最终的代码

<?php

require_once ("connection.php");

global $db;

$one = 'ID';
//$two = "QA-A";

$st = $db->prepare('select ? from EXECUTION_HISTORY');
//$array = array("ID", "QA-A");

 $st->bindParam(1, $one, PDO::PARAM_STR);
 //$st->bindParam(':two', $two);


 $st ->execute();

$data = $st->fetchAll(PDO::FETCH_ASSOC);

print_r($data);

这是打印出来的结果

数组([0] =&gt;数组([ID] =&gt; ID)[1] =&gt;数组([ID] =&gt; ID)[2] =&gt;数组([ID] =&gt; ; ID)

如果我将select语句更改为

$st = $db->prepare('select ID from EXECUTION_HISTORY');

我得到了真实的结果

Array ( [0] => Array ( [ID] => 4 ) [1] => Array ( [ID] => 52 ) [2] => Array ( [ID] => 53 ) 

谁能看到我哪里出错了?

由于

1 个答案:

答案 0 :(得分:0)

使用bindParam您(意外)将参数绑定到查询中的占位符,而不是字段。您准备好的陈述实际上是为此准备的:

SELECT 'ID' FROM EXECUTION_HISTORY

了解这一点,你获得的结果并不奇怪。

所以你不需要这里的起搏器。但是你确实需要在查询中构建一些清理和检查。

我做这些事的方式主要是:

$field = 'ID'; // Or from $_GET or something
$good = array('ID'); //holding every allowed field

$field = (in_array($field, $good)) ? $field : false;

if($field){
    $sql = "SELECT $field FROM EXECUTION_HISTORY WHERE someOtherField = :value";
    $stm = $dbConn->prepare($sql);
    $stm->bindParam(':value', $value, PDO::PARAM_STR);
    $stm->execute();

    print_r($stm->fetchAll());
}else{
    echo "Field is not allowed";
}