2016-06-09 2 views
0

Проблема: я узнаю больше о SQL-запросах, и я пытаюсь понять, почему эта функция и запрос возвращают только статусы с user_id из 26 и 25, но ничего не возвращают из 27 или 31.SQL-запрос не возвращает правильные значения

Вопрос: Почему это не возвращает статусы для пользователей 27 или 31? (Я подтвердил, что пользователь 27 и 31 имеют статусы для возвращения)

Вот код ниже:

public function t_status($friends, $groups, $user_id, $start, $per_page, $db){ 

    $group_array = implode(',', $groups); 
    $friend_array = implode(',', $friends); 

    $stmt = $db->prepare("SELECT * FROM statuses WHERE (user_id IN (:friend_array) && user_id IS NOT NULL) OR user_id = :auth_id OR (group_id IN (:group_array) && group_id IS NOT NULL && group_id != 0) ORDER BY updated_at DESC LIMIT :offset, :limit"); 
    $stmt->bindParam(':auth_id', $user_id); 
    $stmt->bindParam(':group_array', $group_array); 
    $stmt->bindParam(':friend_array', $friend_array); 
    $stmt->bindParam(':offset', $start, PDO::PARAM_INT); 
    $stmt->bindParam(':limit', $per_page, PDO::PARAM_INT); 

    $stmt->execute(); 
    if ($stmt->rowCount() > 0) { 
     while($row = $stmt->fetchAll()) { 
      return $row; 
     } 
    } 
} 

Когда я print_r ($ group_array) я получаю 51 и print_r ($ friend_array) получает 25 , 27,31. Из того, что я могу видеть, что это только получать статусы от первого пользователя в другом массиве 25 и игнорируя 27 и 31.

Я испытал это внутри PHPMyAdmin с помощью:

SELECT * FROM statuses WHERE (user_id IN (25,27,31) && user_id IS NOT NULL) OR user_id = 26 OR (group_id IN ('51,') && group_id IS NOT NULL && group_id != 0) ORDER BY updated_at DESC LIMIT 0, 10 

Это работало отлично. Любая помощь будет принята с благодарностью.

ответ

1

Вы установили return $row; в цикл while. return Функция выхода немедленно и любая другая итерация не выполняется. Вы должны записать данные в массив, а затем возвращают массив:

$arr= array(); 
while($row = $stmt->fetch()) { 
    $arr[]=$row; 
} 
return $arr; 

редактировать:

есть также ошибка с привязкой: WHERE (user_id IN (:friend_array)

, потому что текст id1,id2,id3 он будет рассматриваться как текст не как массив идентификаторов. Вы не должны связывать там эти идентификаторы, поэтому он должен выглядеть следующим образом:

WHERE (user_id IN ($friend_array)

и удалить метод связывания для: friend_array

$stmt->bindParam(':friend_array', $friend_array); - это должно быть удалено

+0

Работы сейчас благодаря и, что более важно, я понимаю, почему это не сработало. Ваше объяснение проблемы с массивом и привязкой помогло. – Niall

+0

Я рад, что смог помочь :) – nospor

1

Я не верю что PHP позволяет привязывать массивы к таким параметрам. Это объясняет, почему вы получаете только результаты для первого значения в массиве. Вам нужно будет преобразовать массив в строку, разделенную запятыми, а затем создать из нее инструкцию SQL. Просто имейте в виду проблему SQL-инъекции.

Также, используя column IN (x, y, z) AND column IS NOT NULL, излишне повторяется. Если значение столбца находится в списке значений, оно не может быть NULL. Даже если NULL были в вашем списке IN, это не соответствовало бы.

Смежные вопросы