At 03:21 AM 7/9/2008, Thodoris wrote:
>At 04:16 PM 7/8/2008, Philip Thompson wrote:
>>>On Jul 8, 2008, at 11:55 AM, TK wrote:
>>>>I'd like to use a PDO prepared statement to perform a MySQL query
>>>>that uses the IN function.
>>>>
>>>>I.e.:
>>>>$stmt = $pdo->prepare('
>>>> select *
>>>> from mytable
>>>> where myfield IN (:contents)
>>>>);
>>>>$stmt->bindValue(':contents', $contents);
>>>>$stmt->execute();
>>>>
>>>>Here's the problem:
>>>>
>>>>If $contents is set to a single value, everything's fine:
>>>> $contents = 'mystring';
>>>>
>>>>How can I include multiple values in here? If $contents is set to
>>>>an array, PHP throws an "Array to string conversion" notice.
>>>>i.e. $contents = array('mystring1', 'mystring2');
>>>>
>>>>If $contents is set to a comma-separated list, no matches are
>>>>returned (probably because the entire "list" is being passed to
>>>>MySQL as a single value, not multiple values).
>>>>I.e. $contents = 'mystring1,mystring2';
>>>>
>>>>What's the proper way to do this? Can it be done? (Note that I do
>>>>not know how many elements will be in $contents ahead of time, so
>>>>something like IN (:contents1, :contents2) wouldn't make sense.)
>>>>
>>>$contents = array('string1', 'string2', 'string3');
>>>$ins = implode (',', $contents);
>>>$sql = "SELECT * FROM `table` WHERE `field` IN ($ins)";
>>>
>>>I'm not sure if the IN function only works on numeric values or if it
>>>also works on strings as well. If contents contains strings, you may
>>>need to put single quotes around each item. If so, change the above
>>>to.....
>>>
>>>$ins = "'" . implode ("','", $contents) . "'";
>>>
>>>Hope that helps,
>>
>>Thanks. That's how to use the IN function in the first place, which I
>>already know. What I was asking about was how to do this using PDO and
>>prepared statements. It's the PDO prepared statement functionality that's
>>got me stuck. The issue is that I can't figure out how to bindParam or
>>bindValue in this situation, where there is potentially a list of values (of
>>arbitrary size).
>>
>Perhaps the implode suggested above is the solution for the prepared
>statement. I think that the problem is that you cannot bind a value with an
>array.
>So you have to implode the array into a string before binding it to a value.
>The other goes as you suggested:
>
>$stmt = $pdo->prepare('
>select *
>from mytable
>where myfield IN (:contents)
>);
>$stmt->bindValue(':contents', $contents);
>$stmt->execute();
>
>Where contents is:
>
>$pre_contents = array('mystring1', 'mystring2');
>
>$contents = implode(',',$pre_contents);
>
>or
>$contents = 'mystring';
As per my original question, that does not work:
>If $contents is set to a comma-separated list, no matches are
>returned (probably because the entire "list" is being passed to
>MySQL as a single value, not multiple values).
>I.e. $contents = 'mystring1,mystring2';
Binding a comma-separated list (i.e. what implode creates) does not do what is
wanted here - it appears instead to treat the whole "list" as one entry, i.e.
it's like doing this:
where myfield IN ('mystring1,mystring2')
which is obviously not achieving the desired result of:
where myfield IN ('mystring1','mystring2')
Hence, my original question! Is there a way to accomplish this with PDO and
prepared statements?
- TK
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php