Получить несколько полей одновременно - PullRequest
0 голосов
/ 18 января 2012

В настоящее время мой запрос выглядит так

    $stmt = $this->db->prepare('SELECT `body` FROM `messages` WHERE `id`=? AND `status'='success');
    $stmt->bind_param("i", $msgid);
    $rc = $stmt->execute();
    $stmt->bind_result($message);
    $stmt->fetch();
    $stmt->close();

Скажем, $msgid это массив (1, 2, 5, 7). Можно ли извлечь все поля body, status, где id равен 1, 2, 5, 7 одновременно, и объединить все body в одну переменную, разделенную пробелами? Если да, как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 18 января 2012

нет, заполнитель для оператора IN отсутствует.вам нужно написать простую программу, которая должна создать строку (?,?,?) для добавления в запрос, а затем привязать ваш массив к этому запросу.

ну, это оказалось четыре вопроса сразу:

  1. Как запросить базу данных для нескольких условий
  2. Какпостроить такой запрос, используя подготовленные операторы
  3. Как получить несколько строк
  4. Как получить несколько полей в одном

Однако, похоже, вам не нужен короткий ответно в книге (или, вернее, в двух - базовом PHP и базовом mysql one), здесь приведены ответы для вашей справки

  1. use IN.Оператор SQL WHERE id IN(1, 2, 5, 7) запросит базу данных для всех идентификаторов.
  2. Как я писал выше, создайте небольшую программу для создания оператора (?,?,?) с числом ?, соответствующим количеству элементов массива.Чем связать это обычным способом.
  3. Страница руководства для execute () действительно содержит пример выборки нескольких строк, я считаю.Я всегда обращаюсь к руководству за примерами сам.
  4. Функция SQL group_concat () может это сделать.select group_concat(body SEPARATOR ' ') выберет все ваши тела в один ряд
1 голос
/ 19 января 2012

Существует GROUP_CONCAT - следующий код должен делать то, что вам нужно с PDO.

$values = array(1, 2, 5, 7);
$parameters = implode(',', str_split(str_repeat('?', count($values)));

$stmt = $this->db->prepare("
  SELECT 
      GROUP_CONCAT(body SEPARATOR ' ') as gbody 
    FROM 
      messages 
    WHERE 
      id IN($parameters) 
      AND status='success'
");
$stmt->execute($values);
$res = $stmt->fetch();
echo $res['gbody'];
$stmt->close();
1 голос
/ 18 января 2012

Не уверен, что это возможно с параметрами, но это легко с помощью встроенного SQL:

$imp=implode(',',$msgid);
"SELECT `body`, `status` FROM `messages` WHERE `id` IN (0$imp)"

0 после открывающей скобки помогает преодолеть препятствие на пути к $ msgid, являющемуся пустым массивом.

Предполагается, что is_numeric ($ msgid [$ i]) верно для всех допустимых $ i, или вы потеряете базу данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...