Ich habe zwei Tabellen "bierdeckel" (in dieser Tabelle sind alle Brauereien, von denen ich Bierdeckel habe.) und "thueringen" (hier sind alle Brauereien aus Thüringen)
Meine Web-Seite "bierdeckelsammlung.com"
Ich möchte nun eine Tabelle erstellen, wo alle Brauereien aufgelistet sind und die Brauereien aus tabelle.bierdeckel farblich gekennzeichnet sind. Ich habe ein Script, welches nicht ganz funktioniert. Es werden nicht alle Brauereien aus tabelle.bierdeckel angezeigt und keine aus tabelle.thueringen werden angezeigt.
Ich weiß, dass dies ein altes Thema ist, es gelingt mir diesmal nicht.
tabelle.bierdeckel:
ID
Brauerei
Bundesland
PLZ
Stadt
Stck
24
Vereinsbrauerei Apolda
Thüringen
99510
Apolda
151
27
Brauerei Erfurt
Thüringen
99510
Erfurt
10
30
Brauerei Jena
Thüringen
07747
Jena
43
52
Brauerei Meiningen
Thüringen
96412
Meiningen
3
tabelle.thueringen:
ID
Brauerei
Bundesland
PLZ
Stadt
Stck
24
Vereinsbrauerei Apolda
Thüringen
99510
Apolda
151
27
Brauerei Erfurt
Thüringen
99510
Erfurt
10
30
Brauerei Jena
Thüringen
07747
Jena
43
52
Brauerei Meiningen
Thüringen
96412
Meiningen
3
99
Brauerei Sonneberg
Thüringen
96412
Sonneberg
0
Script:
$abfrage = "SELECT Bundesland, bierdeckel.Brauerei, bierdeckel.PLZ, bierdeckel.Stadt, bierdeckel.Stck, bild FROM bierdeckel LEFT JOIN thueringen ON bierdeckel.Brauerei = thueringen.Brauerei WHERE bierdeckel.Bundesland = 'Thüringen' GROUP BY bierdeckel.Stadt ASC"; $ergebnis = mysql_query ($abfrage) or die (mysql_error()); $colClass=array("bg1","bg2"); if(mysql_num_rows($ergebnis)) { $i = 1; count($colClass); while ($row = mysql_fetch_assoc($ergebnis)) { echo '<tr class="'.$colClass[$i%count($colClass)].'">'; echo "<td>"; echo $row['PLZ']; echo " </td>"; echo "<td>"; echo $row['Stadt']; echo " </td>"; echo "<td>"; echo "<a href=\"" . $row['bild'] . "\">" . $row['Brauerei'] . "</a>"; echo "</td>"; echo "<td>"; echo $row['Stck']; echo " </td>"; echo "</tr>";
Da das Thema etwas älter ist, weiß ich nicht, ob du inzwischen an dem Problem weiter gearbeitet hast. Ich kann keine direkte Lösung liefern, mir sind aber ein paar Dinge aufgefallen.
1. Du scheinst PHP 7.4 zu verwenden und bei Strato zu hosten. Die von dir verwendete PHP-Version wird nicht mehr unterstützt. Strato bietet zwar Extended PHP-Support an, der kostet allerdings zusätzlich. Das müsstest du eigentlich monatlich in der Rechnung als zusätzlichen Kostenpunkt sehen können. Es ist also in deinem Interesse, auf eine neue Version zu aktualisieren.
2. Funktionen wie mysql_query wurden schon aus PHP 7.0 entfernt (https://www.php.net/manual/en/function.mysql-query.php). Ich frage mich, wieso der Code überhaupt funktionieren kann. Der Ersatz wäre mysqli oder noch besser, PDO.
Ich habe mir bei https://sqliteonline.com/ einen Teil der Tabelle erstellt, und zumindest bei der Query ist mir aufgefallen:
1. In dem Select-Teil der SQL-Query wählst du die Spalte "bild" aus. In deinen Beispiel-Tabellen gibt es aber nichts mit "bild". Es kann aber sein, dass es Teil von deiner Datenbank ist.
2. Die "Group By" Syntax am Ende der Query scheint ungültig zu sein. "group by" kennt kein "asc", dazu müsstest du "order by" nutzen.
3. Ich kriege den Fehler "ambiguous column name: Bundesland". Korrigiere ich "SELECT Bundesland" zu "SELECT bierdeckel.Bundesland", ist der Fehler weg.
Ansonsten wirkt die Logik hinter der SQL-Query und dein Datenbank-Design für mich nicht wirklich nachvollziehbar. Du speicherst die selben Daten über die Brauereien doppelt in zwei unterschiedlichen Tabellen, und musst diese auch doppelt aktualisieren. Mit foreign keys zu arbeiten, wäre vielleicht übersichtlicher.
Außerdem sehe ich in dem PHP-Code keine Logik, die bestimmte Tabellen Spalten rot hervorhebt, was du laut deinem Post erreichen möchtest.
Generell ist es schwierig, Datenbank- und PHP-Probleme über die Ferne zu beheben.
Hast du eine Seite, auf der man sich das Resultat anschauen kann?
Hast du PHP-Fehler aktiviert, und werden dort Fehler ausgegeben? Warnungen werden oft unterdrückt.
Es wäre vielleicht einfacher, wenn du bei der SQL-Query einfacher anfängst. Erst mal nur im Datenbankprogramm (wie phpmyadmin) alle Daten aus der Datenbank lesen mit select *, und dann bei Bedarf runtergehen. Dann fallen Fehler auch eher auf.
Vielen, vielen Danke, das du dich mit meine Problem beschäftigt hast. Ich werde morgen dir eine ausführliche Antwort auf deine Fragen geben, leider ist es mir heute nicht möglich (Zeitgründen).
Ich wollte erstmal dir zukommen lassen, das ich deinen Beitrag gelesen habe und ihn nicht ignorieren werde.
Ja ich verwende noch eine alte Version von PHP. Ich verwnde den Server von Strato. Momentan funktioniert diese Version noch siehe bierdeckelsammlung.com .Leiderkann ich keine Links versenden Aber ich weiss, das Strato in laufe dieses Jahres die alten Versionen abstellt. Ich benutze seit einiger Zeit meine WEB_Seite nur noch Localhost. Denn ich habe mir die Seite erstellt, um eine Überblick zu haben welche Bierdeckel ich habe. Ich habe vor Jahren zwei Bücher gekauft und mir PHP selbst erlernt. Deshalb werden auch einige Abfragen nicht gut Aussehen, aber für meine Zwecke reicht mir das Ergebnis. "da kann ich nur um ein wenig Verständnis bitten".
Zu deinen Bemerkungen: zu 1. 'bild' richtig wäre es bierdeckel. bild Die spalte existiert. hier sind PHP-Datei gespeichert, die zur entsprechend ID ausgefüurt werden soll tabelle bierdeckel
tabelle thueringen ]
zu 2. "Group By" ist natürlich falsch, wenn ein Ort z.B. Erfurt mehrmals vorkommt, dann wird dies als Gruppe Erfurt nur einmal angezeigt. "Order BY" ist bei dieser Abfrage richtig, denn Erfurt wird auch 9x angezeigt. DANKE für deinen Hinweis zu 3 Bundesland dies hatte ich auch schon korregiert
Zu den zwei Tabellen bierdeckel: in dieser Tabelle habe ich alle Bierdeckel sespeicher, die ich besitze. siehe oben thueringen hier sind alle thüringer Brauereien gespeichert die es mal gab oder die mom exist
<body> <?php include 'verbindung.php'; include 'menue_alles.php'; echo "<div id='inhalt'>";
$bundesland = 'Thüringen'; $result = mysql_query("SELECT ID, Brauerei, Stck, Bundesland FROM bierdeckel WHERE Bundesland = '$bundesland'") or die (mysql_error()); $menge = mysql_num_rows($result); $sum = "SELECT SUM(Stck) AS summe FROM bierdeckel WHERE Bundesland = '$bundesland'"or die (mysql_error()); $gesamt = mysql_query("SELECT * FROM thueringen"); $zahl = mysql_num_rows($gesamt) OR die(mysql_error()); ?> <table width="90%" border="0" align="center"> <tr> <td width="19%"><div align="center"><img src="bundesland/Thüringen-k.jpg" alt="Thüringen" width="20%" ></div></td> <td width="51%"><div align="center" class="Stil12">Brauereien aus Thüringen</div></td> <td width="30%" bgcolor= #A9F5A9><span class="Stil13">Alle Brauereien aus Thüringen </span><? echo "$zahl";?><br> Anzahl der Brauereien <? echo "$menge";?><br> Anzahl der Bierdeckel <? echo mysql_result($ergebnis,0);?></td> </tr> </table> <?php $abfrage = "SELECT bierdeckel.Bundesland, bierdeckel.Brauerei, bierdeckel.PLZ, bierdeckel.Stadt, bierdeckel.Stck, bierdeckel.bild FROM bierdeckel LEFT JOIN thueringen ON thueringen.Brauerei = bierdeckel.Brauerei WHERE bierdeckel.Bundesland = '$bundesland' ORDER BY bierdeckel.Stadt ASC"; echo '<table width="90%" border="0" align="center">'; echo "<tr style='background-color: #A52921;font-size:18px;color:#FFFFCC;'> <td>PLZ</td> <td>Stadt</td> <td>Brauerei</td> <td>Stück</td> </tr>"; $ergebnis = mysql_query ($abfrage) or die (mysql_error()); $colClass=array("bg1","bg2"); if(mysql_num_rows($ergebnis)) { $i = count($colClass); while ($row = mysql_fetch_array($ergebnis)) { echo '<tr class="'.$colClass[$i%count($colClass)].'"> <td> '.$row['PLZ'].'</td> <td> '.$row['Stadt'].'</td> <td> '."<a href="" . $row['bild'] . "">" . $row['Brauerei'] . "</a>".'</td> <td> '.$row['Stck'].'</td> </tr>'; $i++; } } ?> </table> </body>
Angezeigt werden aber nur Brauereien, von denen ich Bierdeckel habe -also tabelle bierdeckel. Die brauereien , wo ich keine bierdeckel habe - tabelle thueringen - werden nicht mit angezeigt. Und hier komme ich einfach nicht weiter!!!!
Rot hervorheben: Wenn die Abfrage richtig funktioniert, möchte ich hervorheben, von welcher Brauerei ich Bierdeckel habe. Also sollen die Brauerei aus tabelle bierdeckel farblich gekennzeichnet werden.
Aber ich arbeite noch daran und werde auch wiedermal in einen Buch nachlesen. Vielleicht geht dies auch garnicht.
Nochmal vielen, vielen Dank, das du dir die Zeit genommen hast, um meinen Beitrag zu bearbeiten. Ja, vielleicht werden ich mich zu aufrappen, um mich mit der neuen Version von PHP zu beschäftigen. Es sind eben viele Dateien, die geändert werden müssen.
Zitat von Plienkie im Beitrag #5Aber ich weiss, das Strato in laufe dieses Jahres die alten Versionen abstellt.
Ich habe es so verstanden, dass Strato die älteren PHP-Versionen weiterhin unterstützt. Es kostet für dich nur mehr (laut der Strato-Seite7.81€ im Monat). Es kann aber auch sein, dass deine Seite nicht mit neueren PHP-Versionen läuft, also dass Aktualisieren sowieso keine Option für dich ist. Ich verstehe zwar trotzdem noch nicht, warum die PHP-Funktion "mysql", die seit 7.0 entfernt wurde, bei dir funktioniert, aber solange es keine Probleme damit gibt, müsste es erst einmal ausreichen.
Zu dem "Left Join" in der SQL-Query habe ich leider auch keine Idee. Mit dieser Art von Query habe ich nicht viel Erfahrung und es ist deutlich schwieriger, die Query ohne eine richtige Datenbank zu testen.
Eine andere Möglichkeit wäre, noch eine weitere Query zu schreiben, um alle Brauerein ohne Bierdeckeln abzufragen. Diese überprüfst du später, wenn du die Tabelle anzeigst.
1. Query auf Tabelle thueringen. Alle Brauereien ausgeben, wo Brauerei nicht in bierdeckel.
1 2
SELECT brauerei FROM thueringen WHERE brauerei NOT IN (SELECT brauerei FROM bierdeckel)
Das Resultat zum Beispiel in Variable $ohneBierdeckel speichern.
2. Query auf Tabelle bierdeckel, ohne "left join". Alle Brauerein für Thüringen ausgeben.
1 2 3 4 5
SELECT bierdeckel.Bundesland, bierdeckel.Brauerei, bierdeckel.PLZ, bierdeckel.Stadt, bierdeckel.Stck, bierdeckel.bild FROM bierdeckel, thueringen WHERE bierdeckel.Bundesland = 'Thüringen' AND thueringen.Brauerei = bierdeckel.Brauerei ORDER BY bierdeckel.Stadt ASC
In der While-Schleife: Falls eine Brauerei mit keinen Bierdeckeln aus Schritt 1 dabei ist, farblich markieren.
Entschuldige bitte, das ich etwas stumm war, habe mir ein paar Tage frei genommen. Habe noch mal in der Literatur studiert, mit Erfolg.
Ich habe nun eine Lösung .
1 2 3 4 5 6 7 8 9 10
SELECT PLZ, Stadt, Brauerei FROM thueringen AS thueringen WHERE EXISTS ( SELECT Bundesland, Brauerei, PLZ, Stadt, Stck, bild FROM bierdeckel AS bierdeckel ORDER BY Stadt ASC )
Danke für dein Hinweis mit 2x SELECT in einer Anweisung, denn dies war der richtige Weg.
Und vielen, vielen DANK das du dir die Mühe gemacht hast, Dich mit dem Problem zu beschäftigen.