In _db_query(), when a query error happens, the error messages are displayed twice. First at the point of the pg_query()/mysql_query() call and then at the track_errors() call. Since there is an error handling/reporting process in place, the query calls should suppress error output by placing @'s in front of them. The attached patch does that for both the database.mysql.inc and database.pgsql.inc files.

CommentFileSizeAuthor
database.silence.query.diff1.2 KBdanielc
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

danielc’s picture

Can this please be applied to 4-6 and HEAD?

Dries’s picture

How can we reproduce this? No matter what I do, I only see each error reported once.

(We try to avoid the use of @ to surpress errors.)

danielc’s picture

Ah! It's just happening with PostgreSQL. I noticed it there and assumed the same issue existed with MySQL. Sorry for the confusion. Please commit to database.pgsql.inc only.

danielc’s picture

Title: _db_query() shows each query error twice » pgsql _db_query() shows each query error twice

Add "pgsql" to title.

Test script:

<?php
// so we don't need to include bootstrap
function variable_get($name, $default) {
return $default;
}

ini_set('include_path', 'd:/webroot/drupal/includes');
require_once 'database.pgsql.inc';
$db_url = 'pgsql://usr:pw@localhost/drupal';
$active_db = db_connect($db_url);
_db_query('a REALLY bad query');

danielc’s picture

The test script got ripped out. Perhaps because I used an opening PHP tag w/o a closing one. Let's try again:

// so we don't need to include bootstrap
function variable_get($name, $default) {
  return $default;
}

ini_set('include_path', 'd:/webroot/drupal/includes');
require_once 'database.pgsql.inc';
$db_url = 'pgsql://dropper:ak17q8l10@localhost/drupal';
$active_db = db_connect($db_url);
_db_query('a REALLY bad query');
Dries’s picture

We're not fond of using '@'. I'll await feedback from Adrian, who maintains the PostgreSQL port. He might be able to suggest an alternative/better fix.

danielc’s picture

Judicious use of @ is important. For example, they're a bad idea when including files. At the same time, there is no downside to suppressing error messages for function calls when failures of the given function are handled -- which they are in this case.

Cvbge’s picture

To test this I've created simple block:

<?php
echo "This is a test";
db_query("HELLO WORLD");
?>

When the block was displayed the error was logged and displayed too:

warning: pg_query(): Query failed: ERROR:  syntax error at or near "HELLO" at character 1 in ..../includes/database.pgsql.inc on line 45.

user error: 
query: HELLO WORLD in ..../includes/database.pgsql.inc on line 62.

But prefixing pg_query() with @ didn't change anything, the error was still displayed on the page.

killes@www.drop.org’s picture

Priority: Normal » Minor
Status: Needs review » Needs work

Downgrading to minor and setting to "needs work".

Jaza’s picture

Version: x.y.z » 6.x-dev

Moving to 6.x-dev.

klando’s picture

db_query("set client_min_messages=FATAL");

will remove part of the message (there is other level of error messages)

warning: pg_query() [function.pg-query]: Query failed: in /usr/share/drupal6/includes/database.pgsql.inc on line 155.
user warning: query: HELLO WORLD in /usr/share/drupal6/includes/common.inc(1478) : eval()'d code on line 4.

I hope it can be set on pg_connect or around

dpearcefl’s picture

Status: Needs work » Postponed (maintainer needs more info)

Is this still a problem in current D6?

dpearcefl’s picture

Status: Postponed (maintainer needs more info) » Needs work
aspilicious’s picture

Status: Needs work » Closed (cannot reproduce)

I'm going to close this as it is rly rly rly old and nobody reported back.
Please reopen if needed :)