2016-04-22 4 views
4

Ich versuche, die Funktionalität eines Wörterbuchs zu erweitern, indem ich Definitionen für einige der Begriffe (wenn eine Definition vorhanden ist) zeigt.LEFT JOIN, fügen Sie zu Array in PHP hinzu, wenn Ergebnisse aus der zweiten Tabelle vorhanden sind

Ich nehme die Daten aus den beiden Tabellen wie folgt:

$query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " . 
      "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ". 
      "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ". 
      "AND ".DICTIONARY_TABLE.".theme_id = ".$selected_theme_id." ". 
      "ORDER BY ".DICTIONARY_TABLE.".id"); 

Danach wird in der while Schleife, ich zum ersten Mal das Thema Namen bekommen (aus einer anderen Tabelle), dann die Abfrage-Ergebnisse zu einem Array hinzufügen :

 while($row = $query->fetch(PDO::FETCH_ASSOC)) { 
    // get theme name 
    $theme_name = "theme_".$lang; 
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id.""); 
    $theme_row = $theme_query->fetch(PDO::FETCH_ASSOC); 
    $theme  = $theme_row[$theme_name]; 

    // add all results to an array 
    $results[] = array(
     'english'   => $row['english'], 
     'bulgarian'   => $row['bulgarian'], 
     'english_abbr'  => $row['english_abbr'], 
     'bulgarian_abbr' => $row['bulgarian_abbr'], 
     'theme'    => $theme 
    ); 

Danach versuche ich, zu überprüfen, ob die LEFT JOIN tatsächlich alle Ergebnisse aus den Definitionen Tabelle zurückgegeben, und wenn ja, wie auch diejenigen zum Array hinzufügen - aber das ist, wo ich nicht ...

// check if definition exists for this term 
    if(isset($row['bulgarian_definition'])) { 
     array_push($results['bulgarian_definition'], $row['bulgarian_definition']); 
    } 
    if(isset($row['english_definition'])) { 
     array_push($results['english_definition'], $row['english_definition']); 
    } 

Ich habe versucht, alle Möglichkeiten zu finden, um zuerst zu überprüfen, ob die Variablen definiert wurden, und dann sie an die $results-Array zu schieben. Nichts funktioniert.

Ich bin nicht in der Lage, erfolgreich zu finden von english_definition und/oder bulgarian_definition sind gesetzt. Wenn ich die Abfrage in PhpMyAdmin selbst ausführe, funktioniert es gut.

Die einzige „Lösung“ ich mir vorstellen kann ist die Idee, eine separate Tabelle für die Definitionen verschrotten und nur die Haupttabelle zu erweitern, aber das ist kein großer Ansatz, den ich kenne. Jede Einsicht, was ich falsch mache, wird sehr geschätzt. Vielen Dank!

EDIT: Ich habe die Art und Weise verändert Elemente zum Array hinzugefügt werden:

// check if definition exists for this term 
    if(isset($row['bulgarian_definition'])) { 
     $results['bulgarian_definition'] = $row['bulgarian_definition']; 
    } 
    if(isset($row['english_definition'])) { 
     $results['english_definition'] = $row['english_definition']; 
    } 

Und das tut jetzt der Trick. Wenn ich das Array $results außerhalb der Schleife while ablege, wurden beide Definitionen hinzugefügt.

Allerdings bekomme ich jetzt eine große Anzahl von Warning: Illegal string offset 'theme' in... und ‚Englisch‘ und ‚bulgarisch‘ - dies geschieht unter, wenn ich die $ Ergebnisse Array in einer foreach-Schleife laufen, sie zu starten Druck:

foreach($results as $result) { 

    if($theme != $result['theme']) { 
     $theme = $result['theme']; 
     $search_results .= "<h3>" . $result['theme'] . "</h3>"; 
    } 

    if($source == "english") { 
     foreach ($keywords as $keyword) { 
      $result['english'] = preg_replace("|($keyword)|Ui", "<span style=\"color:#780223\">" . $keyword . "</span>", $result['english']); 
     } 

Keine Ahnung, warum das passiert, wird weiter schauen.

ZWEITER EDIT: Entschied die beiden Definitionen direkt in der $ Ergebnis-Reihe zu setzen sich wie folgt:

while($row = $query->fetch(PDO::FETCH_ASSOC)) { 
    // get theme name 
    $theme_name = "theme_".$lang; 
    $theme_query= $db->query("SELECT theme_id,".$theme_name." FROM ".DICTIONARY_THEMES." WHERE theme_id = ".$theme_id.""); 
    $theme_row = $theme_query->fetch(PDO::FETCH_ASSOC); 
    $theme  = $theme_row[$theme_name]; 

    // add all results to an array 
    $results[] = array(
     'english'   => $row['english'], 
     'bulgarian'   => $row['bulgarian'], 
     'english_abbr'  => $row['english_abbr'], 
     'bulgarian_abbr' => $row['bulgarian_abbr'], 
     'theme'    => $theme, 
     'bulgarian_definition' => $row['bulgarian_definition'], 
     'english_definition' => $row['english_definition'] 
    ); 
}// end while 

Dies funktioniert nun einwandfrei. Wenn ich das Array dump, wenn keine Definition existiert, habe ich 'english_definition' => null und wenn eine Definition existiert, ist es da. So weit, ist es gut.

Das neue Problem ist, dass ich nicht mehr Gruppe nach Themen die Ergebnisse kann - das Thema des letzten Ergebnisses gefunden gezeigt. Welches ist ein anderes Problem insgesamt. Was mich wirklich ärgert, ist, dass bevor ich die Definitionen hinzugefügt habe, alles gut funktioniert hat. Sie können die funktionierende Website here.

Problem gelöst!

  1. Decided gegen Werte an die Anordnung drückt (wie oben gezeigt).
  2. Die zusätzliche Abfrage innerhalb der while-Schleife los, die den Namen des Themas erhält, verschieben Sie es stattdessen auf die Abfrage, die die Suche durchführt. So ist die Abfrage selbst ist:

       $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " . 
         "JOIN ".DICTIONARY_THEMES." ON ".DICTIONARY_TABLE.".theme_id = ".DICTIONARY_THEMES.".theme_id ". 
         "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".id = ".DICTIONARY_DEFINITIONS.".term_id ". 
         "WHERE ".DICTIONARY_TABLE.".".$source." LIKE '%".$keyword."%' ". 
         "ORDER BY ".DICTIONARY_TABLE.".theme_id, ".DICTIONARY_TABLE.".id"); 
    

Und die while Schleife ist:

while($row = $query->fetch(PDO::FETCH_ASSOC)) { 

    $theme_name = "theme_".$lang; 

    // add all results to an array 
    $results[] = array(
     'english'   => $row['english'], 
     'bulgarian'   => $row['bulgarian'], 
     'english_abbr'  => $row['english_abbr'], 
     'bulgarian_abbr' => $row['bulgarian_abbr'], 
     'theme'    => $row[$theme_name], 
     'bulgarian_definition' => $row['bulgarian_definition'], 
     'english_definition' => $row['english_definition'] 
    ); 
}// end while 

Der Link Website von oben wird nun die aktualisierte Suchfunktion laden, wo Definitionen angezeigt wird (wenn sie existieren). Ein Beispiel für jemanden, der neugierig ist, ist "Wurm".

Wie sich herausstellt, ist manchmal alles, was man braucht, um ein Problem zu beheben, es den Leuten zu zeigen und dann darüber nachzudenken, da manchmal die Lösung direkt vor Ihnen liegt. Danke an alle die teilgenommen haben!

+0

Bitte zeigen Sie uns den Code, wo Sie in dem $ row Array gefüllt – Webeng

+0

Haben Sie getan, um ein 'print_r (Ergebnisse $)' die 'array_push() sehen' gearbeitet, aber hinzugefügt, um sie nur als neue Array-Elemente , anstatt sie dem '$ result []' hinzuzufügen, das Sie in der Schleife erstellt haben. – Sean

+0

Ja, ich mache eine 'print_r ($ ergebnisse)', aber 'array_push' fügt die neuen Elemente nicht hinzu - weil sowohl 'english_definition' als auch' bulgarian_definition' NULL sind, nehme ich an. Weder noch '$ results [] = $ row ['english_definition']'. – cheeseus

Antwort

0

BEARBEITET:Gelöschte vorherige Antwort seit es falsch war. Wird diese Antwort aktualisieren, sobald ich eine Lösung für das Problem habe. Ich habe diese Antwort nicht gelöscht, da ich die entsprechende Option nicht gefunden habe. Obwohl es manchmal Spaß macht Platz zu nehmen und sich wichtig zu fühlen :), hasse den Spieler nicht, hasse das Spiel.


+0

betrachten Sie die Abfrage für '$ theme_query', es ist' SELECT theme_id, ". $ Theme_name." VON ... '. Diese Spalten befinden sich also nicht in '$ theme_row', sondern in' $ row', was die äußere Schleifenvariable ist. – Sean

+0

@Sean Sie haben Recht. Ich habe seine Frage kommentiert, um den Code anzuzeigen, in den er das $ row-Array einfügt. Ich bearbeite meine Antwort nun, indem ich die neuen Informationen in Betracht ziehe. – Webeng

+0

In Ihrem zweiten Teil - '$ results [] = array (' ist korrekt, wenn Sie das Array für jede Schleife von 'while ($ row = $ query-> fetch (PDO :: FETCH_ASSOC)) {' Wenn mehr als 1 Zeile zurückgegeben wird, muss es '$ result []' sein, wie bei '$ result' nur bei jeder Schleifeniteration würde der vorherige Wert überschrieben, und nur die letzten Schleifenwerte würden gespeichert. – Sean