是否可以将变量值添加到选择查询结果php pdo

时间:2017-09-27 00:59:38

标签: php mysql arrays select pdo

假设我有这个问题:

$stmt = $con->_con->prepare("Select id from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $rows[] =  array_map('utf8_encode', $selected_row);
} 

从此我得到:

[{
    "id": "000060000000000071964708\/17\/201309:55:00"
}]

我想添加另一个键值对,如:

[{
    "id": "000060000000000071964708\/17\/201309:55:00",
    "column": "code1"   
}]

从结果中我想添加一个值为column的键code1,这个值是动态的,我想通过select查询之外的条件设置它。 我尝试的是在while循环中手动添加列,如:

while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $rows[] =  array_map('utf8_encode', $selected_row);
    array_push($rows, array('column' => $column));
}

哪里$column = 'code1'取决于条件。但它给了我一个结果:

[{
    "id": "000060000000000071964708\/17\/201309:55:00"
}, {
    "column": "code1"
}]

这不是一个理想的输出。也尝试执行Select id,column AS 'code1'...我手动尝试将密钥对值作为选择查询的一部分返回,但它失败并在AS .....中给出错误。 / p>

  

如何从示例中获得所需的输出?   我愿意接受比我想到的想法更好的其他解决方案

1 个答案:

答案 0 :(得分:2)

您在SQL中尝试这样做几乎是正确的,但正确的形式是

SELECT 
  id,
  'code1' AS `column`
FROM...

将静态值作为带引号的字符串文字返回,并带有列别名。因此,您可以使用静态值查询它:

$stmt = $con->_con->prepare("Select id, 'code1' AS `column` from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

获取时,它将以所需格式返回结果。但是,由于该值是动态的,您可以而且应该使用PDO占位符。从PDO包装类中你不清楚你在哪里绑定参数,但prepare()调用将在SQL上

// Whatever the source of the dynamic value...
$your_dynamic_value = 'code1';
// Adds :column as a prepared statement placeholder
$stmt = $con->_con->prepare("Select id, :column AS `column` from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

我必须让你正确地调用bindParam()或者在这个不熟悉的PDO包装器类上执行带有[':column' => $your_dynamic_value]的param数组,其中prepare()方法似乎做得更多比正常PDO::prepare()

如果要在获取期间添加它,则需要在将它添加到$rows[]之前将其添加到iterator / fetch变量$selected_row中来执行此操作:

while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // Add an array key to the fetched row before calling array_map()
    // and appending to the $rows collection
    $selected_row['column'] = 'code1';
    $rows[] =  array_map('utf8_encode', $selected_row);
}