【问题标题】:Why a query on PostgreSQL (on PHP) return an array of strings instead of an assoc array?为什么对 PostgreSQL(在 PHP 上)的查询返回字符串数组而不是 assoc 数组?
【发布时间】:2015-05-01 21:07:26
【问题描述】:

这是一个非常常见的操作,但我不知道为什么我有一个字符串数组。

$res=$queryHelper->ExecuteQuery("
        SELECT (food.id,stores.name) 
        FROM food, stores 
        WHERE food.id_stores=stores.id");

查询助手类

    public function ExecuteQuery($queryRec,$executeRec=array())
    {
        $sql = $this->db->prepare($queryRec);
        $sql->execute($executeRec);
        $this->res=$sql->fetchAll();
        return $this->res;
    }  

餐桌食物

id| name  | id_stores  
0 | PASTA | 0  
1 | FISH  | 0

表店

id  |name  
0   | MARKET0  
1   | MARKET1  

$res 是

Array ( [0] => Array ( [row] => (0,MARKET0) ) [1] => Array ( [row] => (1,MARKET0) ) )  

但我期待

Array ( [0] => Array ( [0] => (0), [1] => ["MARKET0"] ) [1] => Array ([0] => (1), [1] => ["MARKET0"] ) )  

或类似的东西。
如果查询中只有一个表,一切都很好。

【问题讨论】:

    标签: php sql postgresql


    【解决方案1】:

    SELECT 中的括号:

    SELECT (food.id,stores.name) 
    

    实际上是在构造一个 ROW 类型,因此从您的查询中出来的每一行都有一个单独的列,其中包含一个具有两个值的 ROW。你可以想象你的查询产生了一个行数组,你得到的东西看起来像这样:

    [
        [ [ food.id, stores.name ] ],
        ...
    ]
    

    当你期待时:

    [
        [ food.id, stores.name ],
        ...
    ]
    

    解决办法是把括号扔掉:

    SELECT food.id,stores.name
    FROM food, stores 
    WHERE food.id_stores=stores.id
    

    这种行为可能有点奇怪,但它是documented

    4.2.13。行构造函数

    行构造函数是一个表达式,它使用其成员字段的值来构建行值(也称为复合值)。行构造函数由关键字ROW、左括号、行字段值的零个或多个表达式(用逗号分隔)以及最后的右括号组成。例如:

    SELECT ROW(1,2.5,'this is a test');
    

    当列表中有多个表达式时,关键字ROW是可选的。

    强调我的。您的列表中有两个表达式,因此 (food.id, stores.name)food.id, stores.name 是不同的东西,即使 (food.id)food.id 是等价的(但 row(food.id) 会不同)。

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2012-02-08
      • 2011-10-06
      相关资源
      最近更新 更多