为什么以下代码无法将“name”列中的整个字符串存储到输出数组中?代码确实在某些方面起作用。
$contacts = "";
$sql = "SELECT * FROM s_issue.t_contact WHERE orgid='$orgid' ORDER BY id";
$results = db_query($db, $sql, "psql");
while($row = pg_fetch_assoc($results)){
$contacts[$row["id"]] = $row["name"];
}
return $contacts;
数据库列id
包含整数,name
列包含字符串。预期的输出是联系人姓名列表,但在我最初的试验中,我得到了一个空白列表。
我被要求查看一些非常古老的遗留代码。关于升级到PHP7的新近程度并不明显,当我开始寻找时,我甚至不确定它是否是PHP7。
答案 0 :(得分:2)
如果您遇到这样的遗留代码,并且发现自己想知道为什么输出数组不包含您期望的内容,您最近是否已升级到PHP7?因为那就是原因。
PHP7中的初始行现在强制(默认)键入$contacts
作为字符串。此外,可以用数字索引字符串以访问该字符串中的每个字符。那就是:
$foo = "abcde";
echo $foo[1]; // outputs 'b'
因此当$row["id"]
为数字时,$contacts[$row["id"]]
将成为带有数字索引的字符串。因此,只能在该位置存储一个字符,它是字符串$row["name"]
的第一个字符。
正确的解决方法是要么完全删除$contacts = ""
的错误类型的初始化行,要么正确地将其初始化为实际需要的类型,数组:
$contacts = array();
有问题的代码在PHP7之前运行良好。它将在PHP7中以神秘的方式失败。