Re: pgsql and exception [message #178106 is a reply to message #178104] |
Mon, 14 May 2012 08:18 |
M. Strobel
Messages: 386 Registered: December 2011
Karma:
|
Senior Member |
|
|
Am 14.05.2012 09:45, schrieb "Álvaro G. Vicario":
> El 14/05/2012 8:39, Une Bévue escribió/wrote:
>> I have an INSERT generating an exception :
>> ERROR: value too long for type character varying(30)
>>
>> this error comes from try out usinf command line.
>>
>> I'd like to print-out this error when using this database from php.
>>
>> Then, i did :
>>
>> $ret=$db->query($sql);
>> try {
>> while($row=$ret->fetch()){ // line 492
>> $rowid=$row['rowid'];
>> }
>> // do something
>> } catch (Exception $e) {
>> echo $e->getMessage()."<br />\n";
>> }
>>
>> or using :
>> } catch (PDOException $e) {
>> echo $e->getMessage()."<br />\n";
>> }
>>
>> From php i get :
>> Fatal error: Call to a member function fetch() on a non-object in
>> /Users/yt/Sites/landp_public/landp.php on line 492
>>
>> line 492 being "while($row=$ret->fetch()){"
>>
>> obviously the best way is to avoid having a varchar column with a length
>> lower than 30.
>
> This isn't a database error, it's a PHP error. The line where you define $ret's
> current value:
>
> $ret=$db->query($sql);
>
> ... failed. Such function should return a object but it didn't (probably, because it
> returned FALSE instead).
>
> «Return Values: A query result resource on success or FALSE on failure.»
>
> http://es.php.net/pg_query
>
> Tips:
>
> - Always do error checking when opening a DB connection and running a SQL query: it's
> way more likely to get an error there than when retrieving rows.
>
> - You can inspect a variable with var_dump(), e.g.:
>
> var_dump($ret);
>
It is true you have to do error checking after every step, the query/execute
functions return a PDOStatement or FALSE.
But: with PDO::ERRMODE_EXCEPTION PDO does it for you, just take care to have every DB
operation in a try block.
One extra recommendation for the readers:
you should decide on which level you write the try-catch: inside your db helper
functions, or in the top level script. The savings in code using try-catch will be
more when writing one try block in your top level script.
/Str.
|
|
|