10

i have a problem making a SQL Query with an array in my WHERE clause.

For example:

My Array:

$myarray[1] = "hi";
$myarray[2] = "there";
$myarray[3] = "everybody";

My MySQL Statement:

SELECT * FROM myTable WHERE title='".$myarray[]."'

Is there any way to realize that? I solved it myself like this:

for(...) {
$where = $where." title='".$myarray[$count]."' OR ";
}
$where = substr($where , 0, -3);
.....
SELECT * FROM myTable WHERE ".$where."

But if i had thousands of entries in my array, the SQL Statement would be too big and slow, right?

Thanks

2
  • 2
    'OR' is the SQL equivalent of the devil and will slow down even a small request. Commented Mar 14, 2011 at 7:16
  • don't forget to foreach($myarray as $key => $val) $myarray[$key] = mysql_real_escape_string($val); Commented Mar 14, 2011 at 9:09

4 Answers 4

14

You can use mysql's IN-function

EDIT: As amosrevira said, you need to escape you strings in the array.

$myarray[1] = "'hi'";
$myarray[2] = "'there'";
$myarray[3] = "'everybody'";

$newarray = implode(", ", $myarray); //makes format 'hi', 'there', 'everybody' 

SELECT * FROM myTable WHERE title IN ($newarray);
Sign up to request clarification or add additional context in comments.

2 Comments

i think he needs to add quotes to the strings on the array though..
@njaknjak thats obviously wrong answer. you don't have to add quotes manually - it's job for PHP. and you have to escape strings
10
$myarray[1] = "hi";
$myarray[2] = "there";
$myarray[3] = "everybody";

//every quoted string should be escaped according to SQL rules
foreach($myarray as $key => $val) {
  $myarray[$key] = mysql_real_escape_string($val);
}

$in_str = "'".implode("', '", $myarray)."'"; //makes format 'hi', 'there', 'everybody' 

SELECT * FROM myTable WHERE title IN ($in_str);

Comments

3

You can try use of IN in your WHERE clause,

SELECT * FROM myTable WHERE title IN ('hi', 'there', 'everybody');

or

SELECT * FROM myTable WHERE title IN ('.implode(',', $myarray).');

Comments

2

You can us the IN operator. You want it to look like:

title IN ('hi', 'there', 'everybody')

So you'd do something like:

$sql = "SELECT * FROM myTable WHERE title IN '" . implode("','", $myarray) . "';"

Note that you need to filter your array for SQL injection issues first.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.