【问题标题】:PDO prepared statement not returning correct results (returns array filled with the variable name)PDO 准备好的语句没有返回正确的结果(返回用变量名填充的数组)
【发布时间】:2013-09-25 14:26:59
【问题描述】:

多年来一直在寻找如何让这个准备好的语句同时使用?占位符和命名占位符,但没有乐趣。

这是我最终得到的代码

<?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 ) 

谁能看出我哪里出错了?

谢谢

【问题讨论】:

  • 您需要了解占位符是什么以及它的用途。还要决定,如果你真的需要占位符

标签: php mysql pdo


【解决方案1】:

使用 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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2015-07-13
    • 2019-07-16
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多