windows-spieler
Goto Top

PHP-MySQL - mysqli liefert einen Datensatz zu wenig

Hallo zusammen,

ich habe eine einfache (und nicht normalisierte) Tabelle in MySQL mit dem Namen "elemente".
In dieser befinden sich die Spalten id(PK, AI, U) | typ | beschreibung | inhalt | position

Nun wollte ich es per PHP schaffen, dass die Position nach jedem DELETE, UPDATE etc. angepasst wird, einfach nur, weil ich zu blöd bin, später die Elemente in der Tabelle anders in die gewünschte Reihenfolge zu bringen.

Folgender Code liefert aber statt der bisher vorhandenen 7 Datensätze nur 6 (zur Info: ich habe generell Schwierigkeiten mit diesem mysqli, die entsprechende for-Schleife brachte sogar nur 5 Ergebnisse - meine letzter PHP-Session liegt 6 Jahre zurück):
$result = mysqli_query($link, "SELECT id, position FROM elemente ORDER BY elemente.position ASC");  
	$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
	if (!empty($row))
	{	
		$i = 0;
		while($row = $result->fetch_array())
		{
			if ($link->query('UPDATE elemente SET position = ' . $i . ' WHERE id=' . $row['id'] . ';') == TRUE)  
			{
				$erfolg = "Der gewählte Datensatz wurde erfolgreich aktualisiert.";  
			}
			else
			{
				echo '<br>';  
				echo 'UPDATE elemente SET position = ' . $i . ' WHERE id=' . $row['id'] . ';';  
				echo '<br>';  
			}
			$i++;
		}
	}

Ich hoffe, ich habe mich halbwegs klar ausgedrückt. Es soll schließlich niemand seine Kristallkugel suchen müssen face-smile

LG

W-S

Content-ID: 308771

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

Windows-Spieler
Windows-Spieler 03.07.2016 aktualisiert um 01:05:49 Uhr
Goto Top
Mir fällt gerade auf, es ist der ERSTE Datensatz, der fehlt. Nach einem weiteren Test habe ich manuell die Positionen in der Datenbank verändert. Die Zahlen 1 bis 7 waren nun durchgängig vertreten, die 0 überhaupt nicht. Nach dem Ausführen des oben genannten Quellcodes war nun die 1 doppelt. Es gibt keine Fehler, keine Hinweise, was falsch läuft.


Hier macht er es aber richtig:

foreach ($link->query("SELECT * FROM elemente ORDER BY position ASC") as $row)  
{
	if (!empty($row))
	{	
		if($row['typ']=='text')  
		{
			echo $row['inhalt'];  
		}
		else
		{
			echo "<img src='";  
			echo $row['inhalt'];  
			echo "' alt='";  
			echo $row['beschreibung'];  
			echo "'/><br />";  
		}
	}
}

Erklärungen sind sehr willkommen.
129813
Lösung 129813 03.07.2016 aktualisiert um 09:11:11 Uhr
Goto Top
Hi,
in this line of your code
2. $row = mysqli_fetch_array($result, MYSQLI_ASSOC); 
you are already consuming the first record of the resultset! So you start with fetching the second record in your while loop, because the cursor is at the beginning of the second record.

So if you want to know if there are records use the mysqli_affected_rows() or mysqli_num_rows() function instead of fetching one row of data before the if.
You can also reset the cursor to the top of the resultset with mysqli_data_seek($result,0) before the while, but that's normaly not required if you do it right.

Regards
Windows-Spieler
Windows-Spieler 03.07.2016 um 10:45:28 Uhr
Goto Top
Thanks for the reply. If I had known here are English speaking people, I would have written in English from the start face-smile

Of course you are right, I didn't think about the logic behind this part of the code. Thank you very much!