【问题标题】:is it possible to add variable value to a select query result php pdo是否可以将变量值添加到选择查询结果 php pdo
【发布时间】:2018-03-08 08:28:33
【问题描述】:

假设我有这个查询:

$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 这个值是动态的,我想通过选择查询之外的条件来设置它。 我尝试的是在 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 ..... 中给出错误。

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

【问题讨论】:

    标签: php mysql arrays select pdo


    【解决方案1】:

    您在 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] 的参数数组,其中prepare() 方法似乎比普通的PDO::prepare() 做得更多.

    如果要在获取期间添加它,则需要在将其附加到 $rows[] 之前通过将其添加到迭代器/获取变量 $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);
    }
    

    【讨论】:

    • 我想澄清哪个是最好的解决方案?第一个还是第二个?
    • 我个人更喜欢将code1 添加到SELECT,因为您将其视为查询结果的一部分。它对数据库查询的开销很小。当您稍后回溯并忘记它来自哪里时,将值添加到输出数组可能会使它的起源不太清楚。但另一方面,也许某天有人会查看数据库源表,并为为什么该列不存在感到困惑。这两种解决方案显然都不是更好的,但我发现SELECT 更整洁。如果需要,您也可以使用它在应用程序代码之外的 SQL 中复制相同的查询结果。
    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2019-03-23
    • 2017-12-24
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多