2016-04-20 4 views
0

Я написал ниже запрос для извлечения записей из БД, соответствующих значению id. Но этот запрос возвращает все записи вместо одной записи, id = 1.Почему приведенный ниже запрос возвращает все записи вместо одного?

$movie_id=$_GET['id']; //assume movie_id=1 
//$sql ='select * from tbl_movie where movie_id='.$_GET["id"]; 

$sql='SELECT M.movie_name, MC.on_screen_name, R.role, C.celebrity_name, C.celebrity_id, MI.production, MI.director,' 
     . ' MI.screenplay, MI.music, MI.bgm_score, Col.movie_running_time, L.language, CC.censor_certificate,' 
     . ' MR.movie_review_comment, A.award_name' 
     . ' FROM tbl_movie M INNER JOIN tbl_movie_awards MA INNER JOIN tbl_movie_details MD' 
     . ' INNER JOIN tbl_movie_cast MC on MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_actor_role R on MC.movie_role_id=R.role_id AND MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_celebrity C on MC.movie_celebrity_id=C.celebrity_id AND MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_awards A on MA.award_id=A.award_id AND MA.award_movie_id='.$movie_id 
     . ' INNER JOIN tbl_language L on MD.movie_language_id=L.language_id' 
     . ' INNER JOIN tbl_censor_certificate CC on MD.censor_id=CC.censor_id AND MD.movie_id='.$movie_id 
     . ' INNER JOIN tbl_movie_info MI on MI.movie_info_id='.$movie_id 
     . ' INNER JOIN tbl_movie_collection Col on Col.movie_id='.$movie_id 
     . ' INNER JOIN tbl_tt_movie_review MR on MR.movie_review_id='.$movie_id.';'; 

$result = $db->getData($sql); 
    if(!empty($result)) 
    { 
     while($row=$result->fetch_assoc()) 
     { 
      $movie_name=$row['movie_name']; 
     } 

    } 

getData функция, написанная в другом файле:

public function getData($query) 
{ 
    $result=$this->myconn->query($query); 
    if($result->num_rows>0) 
    { 
     return $result; 
    } 
    else 
    { 
     echo ' error in query execution'.$this->myconn->error; 
    } 
} 

Я не знаю, что проблема в приведенном выше запросе. Может ли кто-нибудь предложить, как получить правильный ответ?

+0

Действительно ли ваше значение GET действительно? Почему вы не ускользнули от него или не подверглись насилию? – Martin

+2

Uh ... попробуйте добавить 'WHERE id = 1'? –

+0

@ Мартин, да, значение GET действительно. теперь у меня есть typecast это значение и назначено $ movie_id = (int) $ _GET ['id']; Также я не задаю вам второй вопрос. – user3452547

ответ

1

Предполагая комментируемой линии (// $ SQL) в верхней части работает хорошо, попробуйте следующее:

$sql='SELECT M.movie_name, MC.on_screen_name, R.role, C.celebrity_name, C.celebrity_id, MI.production, MI.director,' 
     . ' MI.screenplay, MI.music, MI.bgm_score, Col.movie_running_time, L.language, CC.censor_certificate,' 
     . ' MR.movie_review_comment, A.award_name' 
     . ' FROM tbl_movie M INNER JOIN tbl_movie_awards MA INNER JOIN tbl_movie_details MD' 
     . ' INNER JOIN tbl_movie_cast MC on MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_actor_role R on MC.movie_role_id=R.role_id AND MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_celebrity C on MC.movie_celebrity_id=C.celebrity_id AND MC.movie_id='.$movie_id 
     . ' INNER JOIN tbl_awards A on MA.award_id=A.award_id AND MA.award_movie_id='.$movie_id 
     . ' INNER JOIN tbl_language L on MD.movie_language_id=L.language_id' 
     . ' INNER JOIN tbl_censor_certificate CC on MD.censor_id=CC.censor_id AND MD.movie_id='.$movie_id 
     . ' INNER JOIN tbl_movie_info MI on MI.movie_info_id='.$movie_id 
     . ' INNER JOIN tbl_movie_collection Col on Col.movie_id='.$movie_id 
     . ' INNER JOIN tbl_tt_movie_review MR on MR.movie_review_id='.$movie_id 
     . ' WHERE M.movie_id = '.$movie_id.';'; 

Вы фильтрации таблицы, связанные с фильмами (INNER JOIN ... ON ID = $ movie_id), но предложение WHERE фильтрует полученный результат.

EDITED: на самом деле, я рассматривал ваш запрос, а предложение ON после INNER JOIN - указать, какое поле выполняет связь между таблицами, без указания идентификатора, только указав: «Этот table1.ID равен этому table2.ID». Затем в предложении WHERE вы можете добавить свою фильтрацию. Итак, ИМО, запрос должен быть примерно таким:

$sql='SELECT M.movie_name, MC.on_screen_name, R.role, C.celebrity_name, C.celebrity_id, MI.production, MI.director,' 
      . ' MI.screenplay, MI.music, MI.bgm_score, Col.movie_running_time, L.language, CC.censor_certificate,' 
      . ' MR.movie_review_comment, A.award_name' 
      . ' FROM tbl_movie M ' 
      . ' INNER JOIN tbl_movie_awards MA' 
      . ' INNER JOIN tbl_movie_details MD' 
      . ' INNER JOIN tbl_movie_cast MC ON MC.movie_id = M.movie_id' 
      . ' INNER JOIN tbl_actor_role R ON MC.movie_role_id = R.role_id AND MC.movie_id = M.movie_id' 
      . ' INNER JOIN tbl_celebrity C ON MC.movie_celebrity_id = C.celebrity_id AND MC.movie_id = M.movie_id' 
      . ' INNER JOIN tbl_awards A ON MA.award_id = A.award_id AND MA.award_movie_id = M.movie_id 
      . ' INNER JOIN tbl_language L ON MD.movie_language_id = L.language_id' 
      . ' INNER JOIN tbl_censor_certificate CC ON MD.censor_id = CC.censor_id AND MD.movie_id = M.movie_id' 
      . ' INNER JOIN tbl_movie_info MI ON MI.movie_info_id = M.movie_id' 
      . ' INNER JOIN tbl_movie_collection Col ON Col.movie_id = M.movie_id' 
      . ' INNER JOIN tbl_tt_movie_review MR ON MR.movie_review_id = M.movie_id' 
      . ' WHERE M.movie_id = '.$movie_id.';'; 
+0

после добавления условия WHERE в запрос, он отлично работает. Спасибо. – user3452547

+0

Прохладный, рад помочь вам;) Проверьте отредактированный ответ, если хотите, я думаю, вы не должны использовать предложение ON для фильтрации, по крайней мере, в вашем случае. – Kamae

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