$dbc
возвращает false. У вашего запроса есть ошибка:
SELECT users.*, profile.* --You do not join with profile anywhere.
FROM users
INNER JOIN contact_info
ON contact_info.user_id = users.user_id
WHERE users.user_id=3");
Исправление для этого вообще описано Raveren.
i думаю, что соулмердж прав. вам нужно будет построить строку запроса.
<?php
$ids = array(1, 2, 3, 7, 8, 9);
$inQuery = implode(',', array_fill(0, count($ids), '?'));
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN(' . $inQuery . ')'
);
// bindvalue is 1-indexed, so $k+1
foreach ($ids as $k => $id)
$stmt->bindValue(($k+1), $id);
$stmt->execute();
?>
fix: dan, вы были правы. исправлен код (хотя не тестировал)
edit: chris (comments) и somethingisintrouble предположили, что цикл foreach ...
(...)
// bindvalue is 1-indexed, so $k+1
foreach ($ids as $k => $id)
$stmt->bindValue(($k+1), $id);
$stmt->execute();
... может быть избыточным, поэтому цикл foreach
и $ stmt-> execute
могут быть заменены просто ...
<?php
(...)
$stmt->execute($ids);
?>
(опять же, я не тестировал его)
Глядя на PDO: Предопределенные константы , нет необходимого вам PDO :: PARAM_ARRAY, как указано в PDOStatement-> bindParam
bool PDOStatement: : bindParam (смешанный параметр $, смешанный & $ переменная [, int $ data_type [, int $ length [, смешанный $ driver_options]]])
Так что я не думаю, что это достижимо.
Какую базу данных вы используете? В PostgreSQL мне нравится использовать ЛЮБОЙ (массив). Итак, чтобы повторно использовать ваш пример:
<?php
$ids=array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id = ANY (:an_array)'
);
$stmt->bindParam('an_array',$ids);
$stmt->execute();
?>
К сожалению, это довольно непереносимо.
В других базах данных вам нужно будет создать свою собственную магию, как уже упоминали другие. Вы, конечно, захотите поместить эту логику в класс / функцию, чтобы ее можно было повторно использовать в вашей программе. Взгляните на комментарии на странице mysql_query
на PHP.NET, чтобы узнать больше о предмете и примерах этого сценария.
Небольшая правка о коде Schnalle
<?php
$ids = array(1, 2, 3, 7, 8, 9);
$inQuery = implode(',', array_fill(0, count($ids)-1, '?'));
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN(' . $inQuery . ')'
);
foreach ($ids as $k => $id)
$stmt->bindValue(($k+1), $id);
$stmt->execute();
?>
//implode(',', array_fill(0, count($ids)-1), '?'));
//'?' this should be inside the array_fill
//$stmt->bindValue(($k+1), $in);
// instead of $in, it should be $id
Решение от EvilRygy не сработало для меня. В Postgres вы можете сделать другой обходной путь:
$ids = array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id = ANY (string_to_array(:an_array, ','))'
);
$stmt->bindParam(':an_array', implode(',', $ids));
$stmt->execute();