2014-10-11 3 views
0

SQL 테이블 subscriptions에서 레코드를 가져 오기 위해 php 함수를 생성했습니다. mysql_query에 조건을 추가하여 테이블에있는 테이블 subscriptions의 레코드를 무시하고 싶습니다. removed_items, 여기 내 코드가 있습니다;MYSQL 테이블 2에 존재하지 않는 테이블 1의 레코드를 가져옵니다.

function subscriptions_func($user_id, $limit){ 

    $subs = array(); 

    $sub_query = mysql_query(" 
     SELECT `subscriptions`.`fo_id`, `subscriptions`.`for_id`, `picture`.`since`, `picture`.`user_id`, `picture`.`pic_id` 
     FROM `subscriptions` 
     LEFT JOIN `picture` 
     ON `subscriptions`.`fo_id` = `picture`.`user_id` 
     WHERE `subscriptions`.`for_id` = $user_id 
     AND `picture`.`since` > `subscriptions`.`timmp` 
     GROUP BY `subscriptions`.`fo_id` 
     ORDER BY MAX(`picture`.`since_id`) DESC 
     $limit 
     "); 
    while ($sub_row = mysql_fetch_assoc($sub_query)) { 
     $subs [] = array(
      'fo_id'    => $sub_row['fo_id'], 
      'for_id'   => $sub_row['for_id'], 
      'user_id'   => $sub_row['user_id'], 
      'pic_id'   => $sub_row['pic_id'], 
      'since'    => $sub_row['since'] 
     ); 
    } 
    return $subs ; 
} 

내 솔루션은 다음과 같은 테이블 removed_items에서 레코드를 가져오고 내가 subscriptions_func (의 레코드를 닮은/해제 기록) subscriptions_func() 건너 뛸를 호출하는 PHP 조건을 설정하는 다른 함수를 만드는 것입니다

$sub = subscriptions_func($user_id); 
foreach($sub as $sub){ 
    $rmv_sub = rmv_items_func($sub[‘pic_id’]); 

    If($rmv_sub[‘pic_id’] != $sub[‘pic_id’]){ 
     echo $sub[‘pic_id’]; 
    } 
} 

이 용액

그러나이 해결책은 에코 상품 판자 스폿하게 변수 $ 부에 기억 된 어레이 간격을 만드는 removed_items 테이블의 항목을 건너 성공했다.

모든 추가 조건과 검사를 줄이기 위해 subscriptions_func() 함수에 추가 할 수있는 조건이 있습니까? id 가정

답변

0

subscriptionssubs_id의 기본 키, removed_items에서 외래 키 다음 바로 WHERE 절에 조건을 추가해야합니다.

  • 코드는 SQL injection에 취약 보인다 :

    ... 
    AND `subscriptions`.id NOT IN (SELECT `removed_items`.subs_id FROM `removed_items`) 
    ... 
    

    이 문제에 관련되지 않음 : 이런 식으로 뭔가 작업을해야합니다이를 방지하기 위해 prepared statement를 사용합니다.

  • 원래 Mysql API는 더 이상 사용되지 않으므로 대신 Mysqli으로 전환하는 것이 좋습니다.
+0

이것은 매력처럼 작동합니다. 고맙습니다. 추가 권장 사항을 고려해 보겠습니다. – benjamin

+0

여러분을 환영합니다! – ForguesR

관련 문제