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 <cr...@craigfrancis.co.uk> 
Sent: Sunday, March 22, 2020 6:34 PM
To: Levi Morrison <levi.morri...@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.morri...@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.morri...@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

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to