Läuft die Schleife anfangs Rückwärts?

supersalzi

Erfahrenes Mitglied
Hey,

Ich bin mal wieder am verzweifeln...

Ich versuche Bilder aus einem Ordner einzulesen und diese in zwei varianten neu zu speichern. Das geht auch super. Doch soll Dabei ein MySQL eintrag in einer Datenbank eingefügt werden, in welcher jedes Foto seine Zeile hat.
Die ID im DB ist mir dem neu vergebenen Dateinamen des Fotos identisch.

Nun das Problem.

Es werden alle Fotos in richtiger reihenfolge bearbeitet und bekommen den richtigen Dateinamen. Auch wird dem DB eintrag die richtige ID gegeben. Sprich, die Schleife läuft richtig.
Doch: Im DB stimmt die Rheihenfolge nicht. (ich will die IDs nummerisch aufsteigeigend schön nacheinander haben.)

Das Ergebnis sieht etwa so aus:

id: 3
id:4
id:5
id:6
----- neue Einträge
id:9
id:8
id:7
id:10
id:12
id:12

Kann mir bitte jemand erklären wie es zu dieser unschönene verdrehung kommt?
(ich weis, mit ORDER BY id werden sie richtig ausgegeben, aber ich finde es unschön)

ich tippe mal auf die functions, sowas hab ich das erste mal gemacht... da geht bestimmt was schief.

hier nochmal der Code:
PHP:
<?php

$dir_new = "admin/fotos/up/";					// Directory with the new Images
$newImgPath = "content/fotos/img/";				// Path for Images
$newThumbPath = "content/fotos/thumbs/";		// Path for Thumbs

$maxThumbWidth = '96';							// maximum widht of Thumbs in Pixel
$maxThumbHeight = '96';							// maximum height of  Thumbs in Pixel
$maxImgWidth = '600';							// maximum widht of Images in Pixel
$maxImgHeight = '600';							// maximum height of Images in Pixel


require_once'scripts/db-access.inc.php';		// log into database

// form data with default values

if($_POST["button_send"] == "send"){

	if(!empty($_POST["country"])){
		$country = $_POST["country"];
	}else{
		$country = "deutschland";
	}
	$region = $_POST["region"];
	$place = $_POST["place"];
	$cat = $_POST["cat"];
	$topic = $_POST["topic"];
	$genre = $_POST["genre"];
	$series = $_POST["series"];
	$select = $_POST["select"];
	if(!empty($_POST["by"])){
		$by = $_POST["by"];
	}else{
		$by = "salzi";
	}
}

function db_id(){
	$sql = "SELECT *  from fotos "; 
	$result = mysql_query($sql);
	$last_dbID = mysql_num_rows($result);
	
	return $last_dbID + 1;
}

function db_insert($id, $date, $country, $region, $place, $cat, $topic, $genre, $series, $select, $by){
	$sql = "INSERT INTO `fotos` (`id`, `date`, `title`, `country`, `region`, `place`, `cat`, `topic`, `genre`, `series`, `select`, `by`) VALUES ('$id', '$date', '', '$country', '$region', '$place', '$cat', '$topic', '$genre', '$series', '$select', '$by');";
	mysql_query($sql);
}

function exif_date($file){
	$exif = exif_read_data("$file", 'EXIF');
	$date= $exif[DateTimeOriginal];
	return $date ;
}


$dir_content = opendir($dir_new);

 while (($filename = readdir($dir_content)) !== false) {
  if(($filename != "." && $filename != "..")  ){
          //echo "filename: $filename : filetype: " . filetype($dir_new . $filename) . "<br>\n";
$file = "$dir_new/$filename";

// calculate new image and thumb size

	$imgSize = getimagesize($file);
	
	$origWidth = $imgSize['0'];
	$origHeight = $imgSize['1'];
	
	if($origWidth > $origHeight){			//wenn Querformat
	
		$ThumbFactor = $origWidth / $maxThumbWidth ;
				
		$newThumbWidth = $origWidth / $ThumbFactor;		
		$newThumbHeight = $origHeight / $ThumbFactor ;
	
		$imgFactor = $origWidth / $maxImgWidth ;
				
		$newImgWidth = $origWidth / $imgFactor;
		$newImgHeight = $origHeight / $imgFactor;
				
	}elseif($origWidth < $origHeight){		//wenn Hochformat
	
		$ThumbFactor = $origHeight / $maxThumbHeight ;
				
		$newThumbWidth = $origWidth / $ThumbFactor;
	    $newThumbHeight = $origHeight / $ThumbFactor ;
	
		$imgFactor = $origHeight / $maxImgHeight ;
				
		$newImgWidth = $origWidth / $imgFactor;
		$newImgHeight = $origHeight / $imgFactor;
	}
	
//insert into database

$newID = db_id();
$newName = $newID.".jpg";

$date = exif_date($file);

db_insert($newID, $date, $country, $region, $place, $cat, $topic, $genre, $series, $select, $by);

// img
$newImg =  imagecreatetruecolor($newImgWidth, $newImgHeight);
$newImgTemp =  imagecreatefromjpeg($file);
imagecopyresampled($newImg, $newImgTemp, 0, 0, 0, 0, $newImgWidth, $newImgHeight, $origWidth, $origHeight);
imagejpeg($newImg, "$newImgPath$newName", 70);


// thumb
$newThumb =  imagecreatetruecolor($newThumbWidth, $newThumbHeight);
$newThumbTemp =  imagecreatefromjpeg($file);
imagecopyresampled($newThumb, $newThumbTemp, 0, 0, 0, 0, $newThumbWidth, $newThumbHeight, $origWidth, $origHeight);
imagejpeg($newThumb, "$newThumbPath$newName", 60);

unlink($file);

   }
}

header("Location: index.php?app=admin&area=5");

?>

Ganz vielen Dank, salzi
 
Wird eine Abfrage nicht explizit geordnet, haben die Datensätze die Reihenfolge, wie sie in der Datenbank gespeichert wurden. Das ist normal.
 
Danke Gumbo, aber das ist mir schlon klar.
Ich habe mich evt. mal wieder schlecht ausgedrückt.
Es geht mir nicht um die Ausgabe des DB Inhaltes. Ich möchte die Einträge schön hinter einader in den DB einfügen. (Weil es für uns menschen leichter zu überschauen ist.)
Also die Frage: Warum speichert meine Schleife die Einträge in so einer verdrehten Rheihenfolge, wenn ich immer die letzte ID aus dem DB auslese, sie um 1 erhöhe, und so die neue ID einfüge?
Danke, salzi.
 
Ich muss nochmal nachfragen, nachdem ich den Tag daran rumgebastelt habe und es immer noch nicht geht.
Kennt das Problem jemand?
Vielen dank, J
 
Also zunächst würde ich das Feld "id" in der DB auf auto_increment setzen, so wird sichergestellt, dass es jede ID auch nur einmal gibt.

Zu der Ausgabe der Datenbank... Kann es sein, dass du manuell einige Einträge zwischendurch gelöscht hast?
Ich kenne dieses Phänomen... Wenn ich manuell einige Einträge aus der DB gelöscht habe und es kamen neue Datensätze dazu, dann nahmen diese "sozusagen" den Platz der gelöschten Datensätze ein - so war die Reihenfolge nur durch anschließendes ordnen richtig, wobei ich IMMER empfehlen würde, die Datensätze geordnet auszulesen. Zumindest dort, wo es wichtig ist (chronologisch geordnet zB).
 
Hey Ramon,

das klingt irgendwie logisch.
Ich hatte mich gegen auto_increment entschieden, da in diesem Fall ein einmal gelöschte id nie wieder vergehen wird, sprich es entstehen Lücken.

Das es sonst auch solch Phänomen gibt war mir neu, der Typ vom Feld id ist Smallint (?)
 
Du hast es jetzt zwar als Erledigt gekennzeichnet, ich mag aber dennoch antworten ;)

Also bei deinem Script ist es ja egal, ob du auto_increment nutzt oder nicht (ist einfach nur ein Wert weniger, den du verarbeiten musst), denn soweit wie ichs gesehen habe, nimmst du auch immer bloss die letzte ID, welche vergeben wurde und rechnest plus 1 -> es enstehen bei möglichem Löschen also ebenfalls Lücken... aber ist das denn so schlimm? Ansonsten ist es ein echter Hürdenlauf immer alle Nummern vergeben zu haben....
 
Noch ein ablschließendes Wort.

Meine Schleife lief nie Rückwärts. Es ist lediglich eine Eigenheit von MySQL, dass wenn ich einmal gelöschte datensätze wieder reinschreibe, sie eben falschherum aufgelistet werden. Ein einfaches Ordnen nach "id" mittels SQL Befehl löst das Problem.

Danke nochmal, J
 
Zurück