Могу ли я связать массив с условием IN ()?

$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.

542
задан vaxquis 24 May 2018 в 10:08
поделиться

5 ответов

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);
?>

(опять же, я не тестировал его)

252
ответ дан 22 November 2019 в 22:18
поделиться

Глядя на PDO: Предопределенные константы , нет необходимого вам PDO :: PARAM_ARRAY, как указано в PDOStatement-> bindParam

bool PDOStatement: : bindParam (смешанный параметр $, смешанный & $ переменная [, int $ data_type [, int $ length [, смешанный $ driver_options]]])

Так что я не думаю, что это достижимо.

10
ответ дан 22 November 2019 в 22:18
поделиться

Какую базу данных вы используете? В 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, чтобы узнать больше о предмете и примерах этого сценария.

7
ответ дан 22 November 2019 в 22:18
поделиться

Небольшая правка о коде 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
8
ответ дан 22 November 2019 в 22:18
поделиться

Решение от 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();
17
ответ дан 22 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: