|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-04-19 11:20 UTC] blackmagic at computer dot org
Description:
------------
A Postgresql query returns an array. If the array is imploded each
value in the original array appears twice in the implosion.
Assume a Postgresql result array contains $array[0], $array[1],
$array[2];
$x=implode ('|', $array) puts
$array[0]|$array[0]|$array[1]|$array[1]|$array[2]|$array[2] into $x.
$x=$array[0]. '|' . $array[1]. '|' . $array[2]; works fine.
Why is there a difference?
Reproduce code:
---------------
<?php
$company; $details; $index;
require_once('../functions/sql_functions.inc'); database_connect(); $db_query = "SELECT * FROM company ORDER BY id ";
database_query(__FILE__, __LINE__); if ($db_rows == 0) echo $DB_EMPTY_FILE;
else {
for ($index=0; $index<$db_rows; $index++) { $details = pg_fetch_array($db_result, $index); $company[$index] = implode('|', $details); } //THE BUG IS HERE// $details = implode('^', $company); echo "$details"; }
Expected result:
----------------
I expected to see:
$company[$index] = $details[0]|$details[1]|$details[2].
Actual result:
--------------
Actual result:
$company[$index] =
$details[0]|$details[0]|$details[1]|$details[1]|$details[2]|$details[
2].
This program was working fine until I changed
$company[$index] = $details[0]. '|' . $details[1]. '|' . $details[2];
to
$company[$index] = implode('|', $details);
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 00:00:02 2025 UTC |
The scripts in which this implode problem is occurring are remote scripts which are called from a browser by AJAX. AJAX sends the result of 'echo $details' back to the browser. If an error occurs during the running of a script 'echo $details' will return an appropriate error message. Debugging these scripts is more difficult than debugging PHP code that's embedded in HTML code. Since var_dump doesn't return any value I can't see how var_dump($company) is going to help me with scripts of this type. I tried 'echo "var_dump($company)"' and the answer was 'var_dump Array'. This script snippet works: for ($index=0; $index<$db_rows; $index++) { $details = pg_fetch_array($db_result, $index); $company[$index] = $details[0] . '|' . $details[1] . '|' . $details[2]; } $details = implode('^', $company); echo "$details"; 'echo "$details"' returns "1|2|3". This script snippet doesn't work: for ($index=0; $index<$db_rows; $index++) { $details = pg_fetch_array($db_result, $index); $company[$index] = implode('|', $details); } $details = implode('^', $company); echo "$details"; 'echo "$details"' returns "1|1|2|2|3|3". The only difference between the two scripts is the third line, where the array returned by pg_fetch_array() is imploded in the script that doesn't work. This suggests to me that there's something unusual about arrays returned by pg_fetch_array(), ie, they are treated differently by implode().I understand that the array contains the column names and the corresponding key values. The problem is I'm not getting back the column names and the key values, I'm getting the key values twice. I thought I would try something else: foreach($details as $value) $result .= ($value . '|'); instead of $company[$index] = implode('|', $details); The results are the same for the implode() method and the foreach() method: The key values are doubled up in the result the script sends back to the browser. I've captured the result with a window.alert, but can't paste it into this reply. I'm sending it to you as a separate e-mail with an Word attachment. Thanks for your assistance. MJR