我通过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?
次要问题:这是否适合跟踪用户出勤情况?还有更好的方法吗?
答案 0 :(得分:1)
(根据要求从评论中重新发布)
看一眼the documentation,似乎没有办法将PostgreSQL数组直接插入到PHP中的数组中。但是,如果向量的位置代表用户ID,那么最好将数据重构为user_id
和attended
的列(后者应为boolean
数据类型)
答案 1 :(得分:1)
PHP的本机PostgreSQL驱动程序不支持高级数据类型。事实上,它甚至不能正确支持integers
,booleans
或其他任何内容! (引用:如“返回值”中所述,所有值都以字符串的形式返回,而不是正确的数据类型: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函数