php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #51742 A non well formed numeric value encountered
Submitted: 2010-05-04 21:29 UTC Modified: 2015-06-06 14:49 UTC
Votes:16
Avg. Score:4.1 ± 0.9
Reproduced:16 of 16 (100.0%)
Same Version:7 (43.8%)
Same OS:9 (56.2%)
From: mike at mikegerwitz dot com Assigned: cmb (profile)
Status: Not a bug Package: PDO Core
PHP Version: 5.3.2 OS: All
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: mike at mikegerwitz dot com
New email:
PHP Version: OS:

 

 [2010-05-04 21:29 UTC] mike at mikegerwitz dot com
Description:
------------
PDOException extends RuntimeException which in turn extends Exception. The 
Exception class has the following constructor:

public __construct ([ string $message = "" [, int $code = 0 [, Exception 
$previous = NULL ]]] )

The $code parameter is to be of type integer. However, when using pdo_odbc or 
pdo_dblib, the error code returned by the server may be a string, rather than an 
integer. So, for example, calling $e->getCode() may yield a value of "12X34". 
This is inconsistent with the method definition as well:

final public int getCode ( void )

PHP's own internal library should not produce outcomes that are in conflict with 
PHP's definitions.

Test script:
---------------
try
{
    $pdo->query( 'BAD QUERY' );
}
catch ( PDOException $e )
{
    throw new Exception( $e->getMessage(), $e->getCode() );
}

Expected result:
----------------
// Just a thrown exception, nothing important

Actual result:
--------------
PHP Notice:  A non well formed numeric value encountered in [...] on line 7

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-09-17 13:46 UTC] mpartio at gmail dot com
I agree to Mike: PHP should allow non-numeric exception codes. I think this should be pretty easy to fix?
 [2011-04-25 18:35 UTC] bandy dot chris at gmail dot com
Related to bug 39615.
 [2014-01-01 12:49 UTC] felipe@php.net
-Package: PDO related +Package: PDO Core
 [2014-04-29 08:02 UTC] hanskrentel at yahoo dot de
PDOException violates the interface here to be able to use the SQLSTATE as code which is not necessarily an integer, but merely a string which might contain a non-numeric value.

Take note that this does not strictly violate the interface, as this has been solved by documenting in the interface that Exception::;getCode() might return a string:

http://www.php.net/manual/en/exception.getcode.php

So if you want to deal with this, you need to extend from Exception, override the constructor, save code as a private member and add the getter for it.
 [2014-04-29 08:07 UTC] hanskrentel at yahoo dot de
Here is some working example code, Excpetion::getCode() is final, however Exception::$code protected.


/**
 * Class PDOStatementException
 */
class PDOStatementException extends PDOException
{
    /**
     * @var string
     */
    private $statement;

    /**
     * @var string
     */
    protected $code;

    public static function createFrom(PDOException $PDOException, $statement) {

        if (!is_string($statement)) {
            throw new InvalidArgumentException(
                sprintf('Statement must be stirng, %s given', gettype($statement))
            );
        }

        $message  = $PDOException->getMessage() . " in statement '" . $statement . "'";
        $sqlstate = $PDOException->getCode();

        if (!is_string($sqlstate)) {
            throw new LogicException(
                sprintf('Expected type of PDOException::getCode() to be string, %s given', gettype($sqlstate))
            );
        }

        $exception = new PDOStatementException($message, 0, $PDOException);
        $exception->code = $sqlstate;
        $exception->statement = $statement;
        return $exception;
    }

    /**
     * @return string
     */
    public function getStatement()
    {
        return $this->statement;
    }
}
 [2015-06-06 14:49 UTC] cmb@php.net
-Status: Open +Status: Not a bug -Assigned To: +Assigned To: cmb
 [2015-06-06 14:49 UTC] cmb@php.net
I agree that the situation is somewhat unfortunate, but it is
documented that PDOException does not inherit a public
constructor, and that the return type of Exception::getCode() is
mixed.[1]

So this is not a bug, but rather a deliberate design decision.
FWIW, there's already request #39615 to allow strings as Exception
codes.

[1] <http://php.net/manual/en/class.pdoexception.php>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Oct 27 16:01:27 2024 UTC