2016-04-20 14 views
0

Ich habe unten Abfrage geschrieben, um die Datensätze aus DB abzurufen, die mit dem ID-Wert übereinstimmt. Diese Abfrage gibt jedoch alle Datensätze statt nur einen Datensatz zurück, dessen ID = 1 ist.Warum gibt die folgende Abfrage alle Datensätze statt einer zurück?

$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 Funktion in einer anderen Datei geschrieben:

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; 
    } 
} 

Ich weiß nicht, was das Problem in der obigen Abfrage ist. Kann jemand vorschlagen, wie man korrekte Antwort erhält?

+0

ist Ihr GET-Wert gültig? Warum bist du ihm nicht entkommen oder hast du ihn nicht missbraucht? – Martin

+2

Uh ... versuche, 'WHERE id = 1' hinzuzufügen? –

+0

@ Martin, yep, GET Wert ist gültig eins. Jetzt habe ich diesen Wert typisiert und zugewiesen $ movie_id = (int) $ _GET ['id']; Auch ich bekomme keine zweite Frage. – user3452547

Antwort

1

Unter der Annahme der Kommentarzeile (// $ sql) an der Spitze gut funktioniert, versuchen Sie dies:

$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.';'; 

Sie sind Filterung der mit Filmen verknüpften Tabellen (INNER JOIN ... ON id = $ movie_id), aber der WHERE-Satz filtert das abgerufene Ergebnis.

EDITED: Eigentlich habe ich Ihre Abfrage überprüft, und die ON-Klausel nach dem INNER JOIN ist, zu sagen, welches Feld die Beziehung zwischen den Tabellen ausführt, ohne die ID anzugeben, nur "Diese Tabelle1.ID entspricht diesem table2.ID ". Dann können Sie in der WHERE-Klausel Ihre Filterung hinzufügen. Also, IMO sollte die Abfrage in etwa so aussehen:

$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

nach WHERE Bedingung in Abfrage hinzufügen, es funktioniert perfekt. Vielen Dank. – user3452547

+0

Cool, froh, Ihnen zu helfen;) Überprüfen Sie die bearbeitete Antwort, wenn Sie wollen, ich denke, Sie sollten nicht die ON-Klausel zu filtern, zumindest in Ihrem Fall. – Kamae

Verwandte Themen