Re: PDO prepared statements and value list for MySQL "IN"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux