MySQL Wert darüber

ZockerLordLP

Erfahrenes Mitglied
Hallo Community

Ich habe mir mit PHP ein Script zusammen bastellt, welches die Spalte "Klasse" nach leeren Zeichen absucht und dann den Wert darüber annimt. Dies funktioniert auch soweit gut, nur der letzte Eintrag in der Spalte wird nie bearbeitet. Er bleibt einfach leer. Wenn ich die Datei ein 2. mal aufrufe wird auch der letzte Eintrag bearbeiten.
PHP:
<?php
include "verbinden.php";
$tables = mysql_query("SHOW TABLES IN vp LIKE 'table%';") or die(mysql_error());

while($line = mysql_fetch_array($tables)){
		
		$result = mysql_query("SELECT * FROM `".$line["Tables_in_vp (table%)"]) or die(mysql_error());
		while($list = mysql_fetch_array($result)){
			if($list["klasse"]==" "){
			
			mysql_query("UPDATE `".$line["Tables_in_vp (table%)"]."` SET `klasse`='$klasse' where id=$id") or die(mysql_error());
			}else{
			$klasse =$list["klasse"];
			$idraw=$list["id"];
			$id=$idraw+1;
			echo $id;
			}
		}
		
}
?>

Wo ist der Fehler, dass der letzte Eintrag nicht bearbeitet wird?

Danke für eure Hilfe :)
 
Hallo,

Sind die Werte von $id in jedem Schleifendurchgang richtig?

Ansonsten würde ich mal alle Queries ausgeben lassen.
Du hast leider keine extra Datenbankklasse, die ein einfaches Ändern erleichtern würde, und du nutzt noch die alte MySQL-Erweiterung, die bald gänzlich aus PHP entfernt wird.

Trotzdem hier mal schnell zum Debuggen eine Funktion:
PHP:
function mysql_queryd($sql) {
  var_dump($sql);
  return mysql_query($sql);
}
(Hinweis: nur zum schnellen Verändern gedacht. Sogar dafür ist diese Lösung schon zu unsauber! Wie gesagt, bau dir lieber eine Datenbankklasse, die MySQLi oder PDO nutzt.)

Außerdem würde ich dir eine andere DB-Struktur empfehlen. Egal was du für eine hast, man sollte sich niemals auf sowas wie einen Datensatz "darüber" oder "darunter" verlassen. IDs sind nur zur Referenzierung. Wenn du mir/uns genau dein Vorhaben erzählst, könnten wir dir vielleicht was Besseres vorschlagen ;)
 
@ComFreek
Ich brache es dafür, dass in der Klassen Spalte keine leeren Zellen vorhanden sein sollen. Da die Daten von einer HTML-Datei importiert werden, passt es wenn man immer den Wert darüber nimmt.

So sieht die Datenbank aus.

Klasse
test
("Dies Zeile ist leer")
("Dies Zeile ist leer")
 
Hallo ZockerLordLP,

ich hab zwar aktuell keinen Einblick in deine Datenbank, jedoch kann ich mir vorstellen, dass es etwas mit der Hochzählung Zutun hat.

Beispiel:

PHP:
#
# 	ID		NAME		KLASSE
#	1		TEST		test
#  	2		TEST		wefew
#	3		TEST		*NULL*	
#



$sql = mysql_query("SELECT * FROM TABLE") or die(mysql_error());
while($output = mysql_fetch_array($sql)){
	if(empty($output["klasse"])){
		mysql_query("UPDATE TABLE SET `klasse`='".$tmp."' WHERE `id` = ".$outpt["id"]) or die (mysql_error());		
	}else{
		$tmp = $output["klasse"];
		
	}
}

*ungetestet

Voraussetzung dafür ist jedoch, dass in dem ersten Datensatz eine Klasse steht.
 
Oder einfach ein einziges SQL auf die Tabelle absetzen
SQL:
UPDATE
	act_table t,
	(SELECT @last_k := '') vars
SET 
	t.klasse= (@last_k := IFNULL(NULLIF(TRIM(t.klasse), ''), @last_k))

Das Konstrunkt IFNULL(NULLIF(TRIM( dient dazu, zu prüfen ob die Klasse Null, oder leer oder iene ABfolge von Leerzeichen ist.

Im PHP sieht denn da so aus
PHP:
$sql = <<<SQL
 'UPDATE
	`%s` t,
	(SELECT @last_k := '') vars
SET 
	t.klasse= (@last_k := IFNULL(NULLIF(TRIM(t.klasse), ''), @last_k))'
SQL;

$tables = mysql_query("SHOW TABLES IN vp LIKE 'table%';") or die(mysql_error());
while($line = mysql_fetch_array($tables)){
    $sql =  sprintf($sql, $line['Tables_in_vp (table%)']);
    mysql_query($sql);
}

Ps. du solltes von mysql_* auf mysqli_* wechseln. Das Erstere ist veraltet.
 
Zuletzt bearbeitet von einem Moderator:
Zurück