Please note that a very old bug (#76548) has been fixed in 7.2.8.
Previously, pg_fetch_result did not fetch the next row if $row was omitted.
It is now well the case, so bad use of the function can now cause some bugs in your codes.
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_fetch_result — Retourne les valeurs d'un résultat
pg_fetch_result() retourne la valeur d'une ligne et d'un champ (colonne) en particulier à partir d'une instance PgSql\Result.
Note:
Cette fonction peut s'appeler pg_result().
result
Une instance PgSql\Result, retourné par pg_query(), pg_query_params(), ou pg_execute() (entre autres).
row
Numéro de la ligne à récupérer. Les lignes sont numérotées de 0 en montant. Si l'argument est omis, la ligne suivante est récupérée.
field
Une chaîne de type string représentant le nom du champ (colonne) à récupérer, sinon un entier de type int représentant le numéro du champ à récupérer. Les champs sont numérotés de 0 en montant.
Les booléens sont retournés comme des "t" ou "f". Tous les autres types, y compris les tableaux, sont retournés sous forme de chaînes formatées, de la même manière que PostgreSQL vous les afficherait dans le client psql. Les valeurs NULL de la base de données sont retournées NULL.
false
est retournée si row
excède le nombre de lignes dans le jeu de
résultats, n'a plus de ligne disponible ou tout autre erreur.
Version | Description |
---|---|
8.3.0 |
row est désormais nullable.
|
8.1.0 |
Le paramètre result attend désormais une instance de
PgSql\Result ; auparavant, une resource était attendu.
|
Exemple #1 Exemple avec pg_fetch_result()
<?php
$db = pg_connect("dbname=users user=me");
$res = pg_query($db, "SELECT 1 UNION ALL SELECT 2");
$val = pg_fetch_result($res, 1, 0);
echo "Premier champ dans la deuxième ligne est : ", $val, "\n";
?>
L'exemple ci-dessus va afficher :
Premier champ dans la deuxième ligne est : 2
Please note that a very old bug (#76548) has been fixed in 7.2.8.
Previously, pg_fetch_result did not fetch the next row if $row was omitted.
It is now well the case, so bad use of the function can now cause some bugs in your codes.
Comment on boolean fields:
If you retrieve a boolean value from the PostgreSQL database, be aware that the value returned will be either the character 't' or the character 'f', not an integer. So, the statement
if (pg_fetch_result($rsRecords,0,'blnTrueFalseField')) {
echo "TRUE";
} else {
echo "FALSE";
}
will echo "TRUE" in either case (True or False stored in the field). In order to work as expected, do this instead:
if (pg_fetch_result($rsRecords,0,'blnTrueFalseField') == 't') {
echo "TRUE";
} else {
echo "FALSE";
}
See bug #33809 http://bugs.php.net/bug.php?id=33809
Whether this really is a bug or a feature is not clear.
However, it is probably best to always put your column names in extra quotes.
$res = pg_query(...);
$colname = pg_field_name($res, $j);
pg_fetch_result($res, $i, "\"$colname\"");
In order to use upper case in pg_fetch_result column names, it is apparently necessary to include explicit quotation marks.
Thus when I do this sort of thing:
$res = pg_query(...);
$ncols = pg_num_fields($res);
for ($j = 0; $j < $ncols; ++$j) {
$colname[$j] = pg_field_name($res, $j);
$name = htmlspecialchars($colname[$j]);
print("Column $j name = \"$name\"\n");
$value = htmlspecialchars(pg_fetch_result($res, 0, $colname[$j]));
print("Column \"{$colname[$j]}\" value = \"$value\"\n");
}
I get this sort of thing:
[....]
Warning: pg_fetch_result() [function.pg-fetch-result]: Bad column offset specified in /.../view.php on line 247
Column 8 name = "VEC index"
Column "VEC index" value = ""
But if I change the $value line to this:
$value = htmlspecialchars(pg_fetch_result($res, 0, "\"$colname[$j]\""));
I get this:
[...]
Column 8 name = "VEC index"
Column "VEC index" value[0] = "47"
In my opinion, pg_fetch_result(...) should use the quotes already. In other words, this may be a bug in the PHP postgres library. It does not seem to be a documented feature of pg_fetch_result() although the postgresql manual documents it under "SQL syntax", "Lexical structure".
PHP version 5.1.4.
psql version 8.1.4.
Use can use pg_fetch_result when getting a value (like a smallint as in this example) returned by your stored procedure
<?php
$pgConnection = pg_connect("dbname=users user=me");
$userNameToCheckFor = "metal";
$result = pg_query($pgConnection, "SELECT howManyUsersHaveThisName('$userNameToCheckFor')");
$count = pg_fetch_result($result, 0, 'howManyUsersHaveThisName');
?>