Hey Craig, I think this might be in the same vein as something I'd love to see done (PDO already does this). Proposed it a while back and have talked to a few internals folks about it off and on
https://externals.io/message/107857#107857
Either way, mysqli lacks any proper way to do dynamic binds on a single basis. This seems like low hanging fruit to make mysqli easier to use
-----Original Message-----
From: Craig Francis <craig@craigfrancis.co.uk>
Sent: Sunday, March 22, 2020 6:34 PM
To: Levi Morrison <levi.morrison@datadoghq.com>
Cc: PHP internals <internals@lists.php.net>
Subject: Re: [PHP-DEV] Making mysqli easier to use with parameters
On 22 Mar 2020, at 15:28, Levi Morrison <levi.morrison@datadoghq.com> wrote:
> applying the ids array as `...` will handle the by-reference passing.
That does help, thanks.
But I still wonder if the ability to pass in a single array of parameters to `$statement->execute()` would remove a step, and be a bit easier to use for all queries.
If this was for a search form, where it dynamically creates a SELECT with a variety of different parameters, it gets tricky again.
And there was the thing I tacked onto the end, where I would like to use a `$statement->result` property to skip the use of `$statement->get_result()`:
while ($row = mysqli_fetch_assoc($statement->result)) {
}
Craig
> On 22 Mar 2020, at 15:28, Levi Morrison <levi.morrison@datadoghq.com> wrote:
>
>> <?php
>>
>> $in_sql = implode(',', array_fill(0, count($ids), '?'));
>>
>> $sql = 'SELECT id, name FROM user WHERE id IN (' . $in_sql . ')';
>>
>> if ($statement = $db->prepare($sql)) {
>>
>> $params = [str_repeat('i', count($ids))];
>> foreach ($ids as $key => $value) {
>> $params[] = &$ids[$key]; // Must be a reference, not ideal.
>> }
>> call_user_func_array(array($statement, 'bind_param'),
>> $params);
>>
>> $statement->execute();
>>
>> $result = $statement->get_result();
>>
>> while ($row = mysqli_fetch_assoc($result)) {
>> print_r($row);
>> }
>>
>> }
>>
>> ?>
>
> Written in my email client without error handling code, so apologies
> if it's not quite correct:
>
> $in = join(',', array_fill(0, count($ids), '?'));
> $select = "SELECT id, name FROM user WHERE id IN ({$in});";
> $statement = $mysqli->prepare($select);
> $statement->bind_param(str_repeat('i', count($ids)), ...$ids);
> $statement->execute();
>
> This is part of my [highest score answer on StackOverflow][1].
> Critically, applying the ids array as `...` will handle the
> by-reference passing.
>
> I don't think we need to improve the ergonmics of mysqli for this case
> specifically, as it's always going to require some dynamic SQL
> generation because of the variable number of parameters to bind.
>
> [1]: https://stackoverflow.com/a/23641033/538216
--
PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php