dressa
Goto Top

PHP Wechsel auf 8.1 - Select Abfrage funktioniert nicht mehr

Hallo miteinander.

Ich habe vor wenigen Tagen von meinem Provider erfahren das meine aktuelle PHP-Version 7.4 Mitte nächsten Monat nicht mehr funktioniert.
Ich habe vor einigen Jahren eine Seite programmiert mit meinem laienhaften Wissen.
Nun stehe ich vor dem Problem das meine Select-Abfrage kein Ergebnis mehr bringt.

Habe mich auf unzähligen PHP-Tutorials durchgelesen und die Vorschläge durchgemacht.
Da aber keine Version zu erkennen ist, weiß ich nicht ob die Beispiele mit PHP 8.1 kompatibel sind.

Unter PHP7.4 funktioniert alles.
Schalte ich auf PHP 8.0 kommt gar nichx.
Habe den Fehler nun eingrenzen können, da bis auf dem PHP-Teil mit der Select-Abfrage noch alles angezeigt wird.

Was ist an meinem Code falsch ?

So verbinde ich mit der MySQL-DB.
$dbcon=mysqli_connect('localhost', 'xxxxxx', 'xxxxx') or die ("Keine Verbindung moeglich");  
	$dbopen=mysqli_select_db($dbcon,"xxxxx");  

Und das ist die Abfrage:
<?
			// News anzeigen
			$found = 0;
			echo "<table>";  
                        $sql3 = mysqli_query($dbcon, "SELECT * FROM news order by datum DESC");  
			while($row3 = $sql3->fetch_array())	
			{
				echo $row3;
				echo "<tr><td>".date("d.m.y", strtotime($row3[datum]))."</td><td>   <a href='".$row3[link]."'>".$row3[text]."</a></td></tr>";  
				echo "<tr><td colspan=2><hr></td></tr>";  
				$found = 1;
			}
			if ($found == 0)
			{
				echo "<tr><td><font color='#0000FF'></font></td><td>Im Moment sind keine News vorhanden</td></tr>";  
			}
			echo "</table>";  
		?>     

Gruss Andy

Content-ID: 4177229995

Url: https://administrator.de/contentid/4177229995

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

Dani
Dani 06.10.2022 aktualisiert um 22:07:19 Uhr
Goto Top
Moin,
Quick und Dirty: Hast du einmal das Error Reporting von PHP aktiviert:
ini_set('display_errors', 1);  
ini_set('display_startup_errors', 1);  
error_reporting(E_ALL);
Die Zeilen gleich zu Beginn der PHP Datei hinzufügen. Je nach Anbieter musst du ggf. die Einstellungen über dessen Weboberfläche vornehmen. Wird dann unter PHP 8.1 ein Fehlermeldung ausgegeben?


Gruß,
Dani
dressa
dressa 06.10.2022 um 22:18:41 Uhr
Goto Top
Hallo Dani.
Danke für deine Hilfe.

die ersten 2 ini_set Abfragen geben keinen Fehler aus.
Die 3. Abfrage error-reporting gibt den Fehler 3376 aus.
Dani
Dani 06.10.2022 um 22:22:39 Uhr
Goto Top
Moin,
die ersten 2 ini_set Abfragen geben keinen Fehler aus.
du hast die drei Zeilen aber schon nach <?php eingefügt?

Die 3. Abfrage error-reporting gibt den Fehler 3376 aus.
Hm. Poste mal ein Screenshot. Vermutlich unterstützt der Webhosters diesen Weg nicht. Wie heißt der Webhoster, so dass wir dort auf der Webseite/FAQ einmal gemeinsam nach den Möglichkeiten schauen können.


Gruß,
Dani
dressa
dressa 06.10.2022 um 22:26:58 Uhr
Goto Top
Ja die 3 Zeilen habe ich im php drin
<?
			echo "1 ".ini_set('display_errors', 1);  
			echo "<br>2 ".ini_set('display_startup_errors', 1);  
			echo "<br>3 ".error_reporting(E_ALL);  
			// News anzeigen
			$found = 0;
			echo "<table border='1'>";  
			$sql3 = mysqli_query($dbcon, "SELECT * FROM news order by datum DESC");  
			printf(mysqli_num_rows($sql3));
			while($row3 = $sql3->fetch_array())	

Mein Webhoster heist Hosteurope aus der Schweiz.
www.hosteurope.ch

Versteh gerade nicht von was du einen Screenshot möchtest.
Meine Testseite ist unter test.f1statistik.ch erreichbar.
dressa
dressa 06.10.2022 aktualisiert um 23:06:09 Uhr
Goto Top
Ich bin noch etwas weiter gekommen.
Habe nach der Select-Abfrage die Anzahl an Datensätzen im Array ausgeben lassen (printf-Befehl)
Der gibt mir 6 aus, was auch stimmt. Es sind 6 Einträge in der DB.
In dem Fall könnte der Fehler in der while-Schleife liegen, da alle Ausgaben innerhalb der Schlaufe nicht mehr ausgegeben werden.

$sql3 = mysqli_query($dbcon, "SELECT * FROM news order by datum DESC");  
printf(mysqli_num_rows($sql3));
while($row3 = $sql3->fetch_array())	
{
	echo "xx".$row3;  
	echo "<tr><td>".date("d.m.y", strtotime($row3[datum]))."</td><td>   <a href='".$row3[link]."'>".$row3[text]."</a></td></tr>";  
	echo "<tr><td colspan=2><hr></td></tr>";  
	$found = 1;
}
if ($found == 0)
{
	echo "<tr><td><font color='#0000FF'></font></td><td>Im Moment sind keine News vorhanden</td></tr>";  
}
echo "</table>";  


Muss mich korrigieren
Die beiden XXen (Zeile 5) die ich innerhalb der Schlaufe ausgebe, werden ausgegeben.

Der Fehler ist gefunden face-smile
die Ausgabe in der Schlaufe $row3[datum] muss so geschrieben werden $row3['datum'].
Das Datum muss in Hochkomma gesetzt werden.
localtux
localtux 07.10.2022 um 07:39:47 Uhr
Goto Top
Müsste dann nicht $row3[link] und $row3[text] auch $row3['link'] und $row3['text']?
Dani
Dani 07.10.2022 um 08:55:06 Uhr
Goto Top
Moin,
die ersten drei Zeilen entsprechen nicht den Zeilen, die ich gepostet habe. Bitte 1:1 übernehmen bzw. einfügen.
Das echo und weitere Zeichen haben da nichts zu suchen.


Gruß,
Dani
dressa
dressa 09.10.2022 um 12:24:59 Uhr
Goto Top
@ localtux
Ja das hab ich noch geändert.
dressa
dressa 09.10.2022 aktualisiert um 12:31:52 Uhr
Goto Top
Zitat von @Dani:

Moin,
die ersten drei Zeilen entsprechen nicht den Zeilen, die ich gepostet habe. Bitte 1:1 übernehmen bzw. einfügen.
Das echo und weitere Zeichen haben da nichts zu suchen.


Gruß,
Dani

Ohne das Echo bekam ich keine Fehlermeldungen.
Deshalb habe ich das Echo eingefügt.
Aber danke für den Tip.
Ich muss mich mit dieser Fehlermeldung noch auseinandersetzen, da diese Umstellung doch komplexer ist als gedacht.
firefly
firefly 09.10.2022, aktualisiert am 11.10.2022 um 22:04:32 Uhr
Goto Top
Was ist an meinem Code falsch?

Ein paar Dinge. Keine Ahnung ob das Problem schon gelöst ist, aber hier noch ein paar Fehler in deinem Script:

while ($row3 = $sql3->fetch_array()) {
    echo $row3;
    ..

Das Ergebnis von $row wird ein array sein (fetch_array). Da ist "echo" keine gute Wahl um sich den gesamten Inhalt anzeigen zu lassen. Versuche es eher mit:

print_r($row3)

Dann willst du die Inhalte von $row3 wie z.B. $row3[datum] ausgeben:

echo "<tr><td>" . date("d.m.y", strtotime($row3[datum])) . "</td><td>   <a href='" . $row3[link] . "'>" . $row3[text] . "</a></td></tr>";  

Du musst aber die Feldwerte wie z.B. "datum" oder "link" quoten (entweder mit " oder '). Also:

echo "<tr><td>" . date("d.m.y", strtotime($row3["datum"])) . "</td><td>   <a href='" . $row3["link"] . "'>" . $row3["text"] . "</a></td></tr>";  

Dann mag PHP 8.1 die Felder auch wieder - es sei denn, sie sind leer. Wenn sie leer sind erscheint auch wieder ein Fehler. Du musst die Werte also vorher prüfen (z.B. per isset()):

echo isset($row3["link"]) ? $row3["link"] : null;  

Die Kurzform dieser Überprüfung lautet:

echo $row3["link"] ?? null;  

Das spart viel Zeit face-smile

Bei deinem Beispiel sieht das dann so aus:

echo "<tr><td>" . date("d.m.y", strtotime(($row3["datum"] ?? null))) . "</td><td>   <a href='" . ($row3["link"]?? null) . "'>" . ($row3["text"] ?? null) . "</a></td></tr>";  

Statt "null" kannst du natürlich auch irgend einen anderen Wert angeben, der erscheinen soll, wenn z.B. die Variable $row["text"] keinen Wert hat.

echo $row3["link"] ?? "hier ist nichts drin";  


Das alles müsste dir aber das PHP-Log unter "/var/log/php..." anzeigen. Wenn du kein Log hast, dann wie Dani oben schon beschrieben hat, es mit "ini_set('display_errors', 1);" einschalten oder in der php.ini unter /etc/php.. das Error-Log aktivieren. Ohne das Logfile wirst du nicht weiterkommen.

Gruß
@firefly
dressa
dressa 11.10.2022 um 21:59:59 Uhr
Goto Top
Danke firefly für deine ausführliche Erklärung.

Das echo $row3 war etwas unglücklich gewählt.
Hätte es in dem oben geposteten Beispiel entfernen sollen.
Ich habe es lediglich so in den Code eingefügt, damit ich einfach mal eine Ausgabe habe. Und auch wenn es nur "Array" gewesen wäre.

Der print_r Befehl ist mir bekannt, benutze den auch.

Die Seite funktioniert bereits auch wieder.

Gruss Andy
Dani
Dani 11.10.2022 um 22:22:06 Uhr
Goto Top
Moin,
Die Seite funktioniert bereits auch wieder.
und was war die Lösung?


Gruß,
Dani
dressa
dressa 11.10.2022 aktualisiert um 22:38:25 Uhr
Goto Top
Zitat von @Dani:
und was war die Lösung?


Oha... dachte ich hätte die Lösung bereits erwähnt.

In meinem ersten Thread hatte ich ja den PHP-Code gepostet.
In der Zeile 9 war der Fehler

Die Feldwerte waren nicht korrekt gequotet.

vorher (falsch):
echo "<tr><td>".date("d.m.y", strtotime($row3[datum]))."</td><td>   <a href='".$row3[link]."'>".$row3[text]."</a></td></tr>";  

nachher (korrekt):
echo "<tr><td>".date("d.m.y", strtotime($row3['datum']))."</td><td>   <a href='".$row3['link']."'>".$row3['text']."</a></td></tr>";