note 123531 added to function.pg-result-error

From: Date: Fri, 18 Jan 2019 19:19:23 +0000
Subject: note 123531 added to function.pg-result-error
Groups: php.notes 
Request: Send a blank email to php-notes+get-210078@lists.php.net to get a copy of this message
So considering pg_query and pg_query_params don't return results on error, and that this would be an extremely handy thing to have, I just ended up writing my own functions wrapping the pg_send_* ones to work like the aforementionned two <em>should</em>. There's not a whole lot of code to them, the comments are mostly references from the libPQ and PHP doc, to explain the behavior. <?php class PostgresConnectionError extends Exception { public function __construct($last_error) { parent::__construct($message); } } function pg_send_query_sync($connection, string $query) { // This function cannot work if any query is already running for that connection because the results may then get mixed up. assert(pg_get_result($connection) === false); $dispatch_ok = pg_send_query($connection, $query); // The *only* case where nothing can be returned, when the connection fails to dispatch the initial query. if (!$dispatch_ok) throw new PostgresConnectionError(pg_​last_​error($connection)); // From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done." // In the case of pg_query/PQExec, which we're trying to emulate: // "Note however that the returned PGresult structure describes only the result of the last command executed from the string." // "Should one of the commands fail, processing of the string stops with it and the returned PGresult describes the error condition." while ($result = pg_get_result($connection)) { // Drain all results on the connection and only return the last one. if ($last_result) pg_free_result($last_result); $last_result = $result; } assert(is_resource($result) && get_resource_type($result) === "pgsql result"); return $last_result; } function pg_send_query_params_sync($connection, string $query, array $params) { // This function cannot work if any query is already running for that connection because the results may then get mixed up. assert(pg_get_result($connection) === false); $dispatch_ok = pg_send_query_params($connection, $query, $params); // The *only* case where nothing can be returned, when the connection fails to dispatch the initial query. if (!$dispatch_ok) throw new PostgresConnectionError(pg_​last_​error($connection)); // From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done." // In the case of pg_query_params/PQExecParams, which we're trying to emulate: // "Unlike PQexec, PQexecParams allows at most one SQL command in the given string. (There can be semicolons in it, but not more than one nonempty command.)" while ($result = pg_get_result($connection)) { // Drain all results on the connection, although there should only be one. if ($last_result) pg_free_result($last_result); $last_result = $result; } assert(is_resource($result) && get_resource_type($result) === "pgsql result"); return $last_result; } ---- Server IP: 208.43.231.9 Probable Submitter: 82.199.157.35 (proxied: 207.96.202.138) ---- Manual Page -- http://php.net/manual/en/function.pg-result-error.php Edit -- https://master.php.net/note/edit/123531 Del: integrated -- https://master.php.net/note/delete/123531/integrated Del: useless -- https://master.php.net/note/delete/123531/useless Del: bad code -- https://master.php.net/note/delete/123531/bad+code Del: spam -- https://master.php.net/note/delete/123531/spam Del: non-english -- https://master.php.net/note/delete/123531/non-english Del: in docs -- https://master.php.net/note/delete/123531/in+docs Del: other reasons-- https://master.php.net/note/delete/123531 Reject -- https://master.php.net/note/reject/123531 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#210078) next »