0

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

这是我最终得到的代码

<?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] => 数组 ( [ID] => ID ) [1] => 数组 ( [ID] => ID ) [2] => 数组 ( [ID] => ID )

如果我将选择语句更改为

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

我得到了真正的结果

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

谁能看到我哪里出错了?

谢谢

4

1 回答 1

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";
}
于 2013-09-20T09:10:14.217 回答