0
$query = "SELECT :option FROM `site`.`fish` WHERE `fishid`=:fishid";
    if ($stmt = $connect->prepare($query)){
        $stmt->bindValue(':option', $option, PDO::PARAM_INT);
        $stmt->bindValue(':fishid', $fishid, PDO::PARAM_INT);
        $stmt->execute();
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo '<pre>', print_r($rows, true), '</pre>';
    }

以下返回

Array
(
    [0] => Array
        (
            [id] => id
        )

) 

我希望它返回 [id]=>7 它与我的 BindValues 有关...它们不被识别为数字吗?

4

3 回答 3

2

使用准备好的语句,您尝试做的事情是不可能的。

您不能将要选择的列作为参数传递给准备好的语句。该语句将评估为如下内容:

SELECT 'id' ...

什么会给你一个字符串'id'而不是列的值。

于 2013-04-13T16:34:53.120 回答
1

这源于对预准备语句中的占位符如何工作的常见误解:它们不是简单地替换为字符串,而是执行生成的 SQL。相反,要求“准​​备”语句的 DBMS 会针对如何执行该查询提出完整的查询计划,包括它将使用哪些表和索引,无论您如何填写占位符,这都是相同的。

SELECT name FROM my_table WHERE id = :value无论您替换什么,计划都是相同的:value,但SELECT name FROM :table WHERE id = :value无法计划看似相似的计划,因为 DBMS 不知道您实际上要从哪个表中选择。

您的表单查询SELECT :value FROM my_table只能是因为占位符表示文字值而不是列名 - 设置:value为字符串'hello'将等效于SELECT 'hello' FROM my_table并且只返回'hello'结果集中每一行的字符串。

于 2013-04-13T16:47:50.953 回答
0

The column name is not a SQL variable (SQL does not support having variables at that place), but it is just a string in PHP:

$option = (string) $option;

switch ($option) 
{
    case "id": 
        break;

    default:
        throw new InvalidArgumentException(
        sprintf("Invalid identifier: '%s'", $option)
    );
}


if (false !== strpos($option, "`")) 
{
    throw new InvalidArgumentException(
        sprintf("Invalid column name: '%s'", $option)
    );
}

$query = sprintf("SELECT `%s` FROM `site`.`fish` WHERE `fishid`=:fishid", $option);

if ($stmt = $conn->prepare($query))
{
    $stmt->bindValue(':fishid', $fishid, PDO::PARAM_INT);
    $stmt->execute();
    ...
于 2013-04-13T17:14:27.273 回答