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!
- Decided gegen Werte an die Anordnung drückt (wie oben gezeigt).
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!
Bitte zeigen Sie uns den Code, wo Sie in dem $ row Array gefüllt – Webeng
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
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