2016-06-09 5 views
0

문제점 : SQL 쿼리에 대해 더 배우고 있는데이 함수와 쿼리가 26 및 25의 user_id를 가진 상태 만 반환하지만 27에서 아무것도 반환하지 않는 이유를 이해하려고합니다. 또는 31.SQL 쿼리가 올바른 값을 반환하지 않음

질문 : 사용자 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; 
     } 
    } 
} 

내가 ($의 group_array) 내가 51을 얻고, 인 print_r ($ friend_array를) print_r의 경우 25을 가져옵니다 (I 사용자 (27) 및 (31)가 반환하는 상태가 있음을 확인했다) 여기

아래의 코드는 , 27,31.

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 

이것은 잘 작동 : 나는 단지 친구 어레이 (25)의 첫 번째 사용자의 상태를 받고

27 및 31을 무시하는 것을 볼 수있는에서 나는 사용하여이 내부에 phpMyAdmin을 테스트했다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

1

while 루프에서 return $row;을 설정합니다. return 즉시 종료하고 다른 반복은 수행되지 않습니다. 당신은 배열에 데이터를 기록하고 배열을 반환해야합니다

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

편집 :로도 오류가

바인딩 : WHERE (user_id IN (:friend_array)는 텍스트 id1,id2,id3 때문에 그것은 텍스트하지으로 처리됩니다

ID 배열. 이

을 제거해야하는
+0

지금은 감사합니다. 더 중요한 것은 왜 작동하지 않았는지 이해합니다. 배열 및 바인딩 문제에 대한 귀하의 설명은 많은 도움이되었습니다. – Niall

+0

내가 도와 줘서 다행이다 :) – nospor

1

나는 생각하지 않는다 - friend_array

$stmt->bindParam(':friend_array', $friend_array); :

WHERE (user_id IN ($friend_array)

및 대한 바인딩 방법을 제거 : 그것은 다음과 같이해야한다, 그래서 당신이이 ID를 결합하지 말아야 PHP는 배열을 매개 변수로 바인딩 할 수 있습니다. 이것은 배열의 첫 번째 값에 대한 결과 만 얻는 이유를 설명합니다. 배열을 쉼표로 구분 된 문자열로 변환 한 다음 SQL 문을 작성해야합니다. 그냥 SQL 주입의 문제를 알고 있어야합니다.

또한 column IN (x, y, z) AND column IS NOT NULL을 사용하는 것은 불필요하게 반복적입니다. 열 값이 값 목록에 있으면 NULL이 될 수 없습니다. NULL이 (가) IN 목록에 있었더라도 일치하지 않습니다.

관련 문제