直接在PHP中访问psql-array

时间:2012-02-07 00:03:48

标签: php postgresql

我通过PHP查询psql数据库以获取一个布尔值数组,其中索引是userid,例如userconfirm bool[]。当我做类似的事情时:

$query  = "select userconfirm from calendar where id = '%s'";
$result = $this->db->query($query, 2);
var_dump($result['userconfirm']);

我明白了:

array(1) { [0]=> array(1) { ["userconfirm"]=> string(20) "[256:258]={t,NULL,t}" } } 

这就是说我得到一个数组所在的字符串。好吧,如果我研究PHP,可能会解析这个问题,但这感觉不对。当然有一种方法可以直接获得阵列吗?

主要问题是:如何直接将此数组导入PHP?

次要问题:这是否适合跟踪用户出勤情况?还有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

(根据要求从评论中重新发布)

看一眼the documentation,似乎没有办法将PostgreSQL数组直接插入到PHP中的数组中。但是,如果向量的位置代表用户ID,那么最好将数据重构为user_idattended的列(后者应为boolean数据类型)

答案 1 :(得分:1)

PHP的本机PostgreSQL驱动程序支持高级数据类型。事实上,它甚至不能正确支持integersbooleans或其他任何内容! (引用:如“返回值”中所述,所有值都以字符串的形式返回,而不是正确的数据类型:http://www.php.net/manual/en/function.pg-fetch-assoc.php

为了帮助解决这个问题,您可能需要查看PHPG,这是一个专门用于将所有返回的PostgreSQL值转换为本机PHP数据类型的PHP库。支持任何数据类型,Hstores,Geometric数据类型等的数组:

数字/整数

如果您是numeric[]integer[]数据类型,它不可能包含NULL值,那么您可以简单地删除前导和尾随花括号,并将字符串分解为数组使用逗号分隔符:https://github.com/JDBurnZ/PHPG

<?php
$pg_intarr = '{1,2,3,4,5}';
$vals = substr($pg_intarr, 1, -1); // Remove curly brackets
$vals = explode(',',$vals); // Returns: array(1,2,3,4,5)

字符串

但是,在处理基于字符串的数据类型(例如character[]character varying[]text[]时,问题变得更加复杂,这就是原因:如果数组的值包含一个空格或一些其他特殊字符,然后PostgreSQL返回用双引号封装的特定值。如果值是一个没有特殊字符的单个单词,那么返回的该值没有任何引号。

以下是从PostgreSQL返回的示例character varying[]

{val1,"val 2",val3,"val-4","val,4"}

这里的挑战是:

  • 无法在","上明确爆炸,因为并非所有字符串都是双引号。
  • 无法在,上明确爆炸,因为某个值可能包含逗号,例如val,4

我在能够反复遇到这个问题的MONTHS之后能够得到的唯一方法是获取PostgreSQL提供的字符串,然后执行后续查询以将数组UNNEST到一个结果集中,然后读取并转换到本机PHP数组:

$grab_vals = pg_query("SELECT UNNEST('" . pg_escape_string('{val1,"val 2",val3,"val-4","val,4"}') . "') AS value");
$grab_vals = pg_fetch_all($grab_vals);
$array_vals = array();
foreach($grab_vals as $val) {
  $array_vals[] = $grab_vals['value'];
}

布尔

关于boolean[]值,您很可能采用与整数建议相同的方法。但是,因为您还预期NULL值,我们还有将字符串值NULL映射到PHP的本机NULL数据类型的附加任务:

function pgBool2Php($string) {
  if($string == 't') {
    return True;
  } else if($string == 'f') {
    return False;
  } else if($string == 'NULL') {
    return Null;
  } else {
    raise new Exception('Mal-formed PostgreSQL Boolean encountered. Expecting value of "t", "f" or "NULL", encountered "' . $string . '"');
  }
}

$pg_intarr = '{t,NULL,t,f}';
$vals = substr($pg_intarr, 1, -1); // Remove curly brackets
$vals = explode(',',$vals); // Returns: array('t','NULL','t','f')

$vals = array_map('pgBool2Php', $vals); // Returns: array(True, Null, True, False)

答案 2 :(得分:0)

继承了github上的pg_parse函数