Re: Fix the inconsistent behavior of PDO::PARAM_XXX
| From: | Kentaro Takeda via internals | Date: | Sat, 04 Nov 2023 10:46:28 +0000 |
| Subject: | Re: Fix the inconsistent behavior of PDO::PARAM_XXX | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-121580@lists.php.net to get a copy of this message | ||
Hi, internals.
> As shown in the following issue, the behavior of
>
PDO::PARAM_XXXX is
> inconsistent and I would like to fix this.
> https://github.com/php/php-src/issues/12603
I consider the current behavior a bug.
And some of them contain behaviors that are very confusing to users.
> It may be an xkcd/1172 case, but these kinds of cases are very hard
> to spot from static analyzers, and are often only surfaced
> in production only if someone spent enough time to dig deep.
As previously discussed by Ayesh, assessing
the users' impact of a fix for this issue might be a little challenging,
but I think it's important to address it to prevent confusion.
Taking PostgreSQL as an example, let's consider the following PHP code:
```php
$pdo = new PDO('pgsql:');
$pdo->exec('create temp table t(boolean_column bool, text_column text)');
$stmt = $pdo->prepare('insert into t values (:v1, :v2)');
$stmt->bindValue(':v1', false, PDO::PARAM_BOOL);
$stmt->bindValue(':v2', false, PDO::PARAM_BOOL);
$stmt->execute();
$result = $pdo->query('select * from t');
var_export($result->fetchAll(PDO::FETCH_ASSOC));
````
The result should look like this:
````
array (
0 =>
array (
'boolean_column' => false,
'text_column' => 'f', // HERE!!!
),
)
````
Even if we insert false, it will change to 'f' when we select
it.
This is fundamentally a user mistake. However, the big problem in this case is
that the value 'f' after the change is *truthy*. Who could have predicted
that even though you entered false, it ended up being true ?
I've seen a lot of pointless code to deal with problems
like this where types are not uniformly formatted.
As Saki says, we need to think carefully about whether
we can accurately treat this as bool.
However, regarding the above problem:
* Fix *truthy* / *falsy* such as int(1) / int(0) to a form that
can be correctly determined.
* Make this behavior consistent across as many drivers as possible.
Even this small fix would eliminate much of the confusion that is
currently occurring.
(Of course, it should ultimately be treated as bool.)
I look forward to a resolution that will be satisfactory to all.
Thank you for your attention.
2023年11月4日(土) 17:56 Saki Takamachi <saki@sakiot.com>:
>
> Hi, Ayesh,
>
> I forgot to tell you one important thing.
>
> Binding of parameters is not actually done in the ÷£‘ÍS1Dçœ>Uí
> ïbindXXXXmethod, but in the execute() method.
> Therefore, when preparing a new method, a slightly larger mechanism is required to determine which
> method the parameter was set through.
>
> Regards.
>
> Saki
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>