一直在寻找年龄如何让这个准备好的声明同时使用?占位符和命名占位符但没有欢乐。
这是我最终的代码
<?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 )
谁能看到我哪里出错了?
由于
答案 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";
}