Mit PHP Bilder aus einem Ordner auslesen

  • Themenstarter Themenstarter johnny26
  • Beginndatum Beginndatum
J

johnny26

Hallo,

ich bin zufällig durch Google auf euer Forum gekommen.
Ich habe einen PHP-Code von einem kleinen, selbst-programmierten CMS. Via PHP werden dort aus einem temporären Verzeichnis Bilddateien ausgelesen. Die Bilder sind mit 1.jpg, 2.jpg. usw. nummeriert. Leider habe ich dabei das Problem, dass die Bilder immer in zufälligen Reihenfolge ausgelesen werden..... und dadurch kommen z.B. Bilder, die in der logischen Reihenfolge zuerst dran sind, etwas später in der Galerie... kurzum: Es ist kunterbunt.

ich habe schon probiert, an verschiedenen Stellen zu drehen, aber leider bekomme die "Macke" nicht weg, dass er die Bilder immer zufällig in die Datenbank einliest, und eben nicht der Nummerierung nach.
An was liegt das?

Anbei der Code. Als Hinweis: Zuerst wird eine Galerie erstellt, danach die einzelnen Bilder ebenfalls in die Datenbank eingelesen.

mfg Andi



Und hier der Code:
PHP:
<?php
session_start();

include("../../../includes/config_inc.php");



If($_POST['sendButton'] == "JETZT ERSTELLEN")
{

		$idEdit = $_POST['idEditGet'];
		$idConnectionGet = $_POST['idConnectionGet'];

//SESSIONS WERDEN GESCHRIEBEN
        $_SESSION['title_for_ses'] = $_POST['title_for'];

	//FEHLERMELDUNGEN WERDEN ERZEUGT	
	If($_POST['title_for'] == ""){
	  $mistake = "1";
      $_SESSION['title_for_msg_ses'] = "Titel darf nicht fehlen!";
	}


	//BILDDATEN
	if ($_POST["idEditGet"]) {
	  $Uploaddatei = $_FILES['datei']['name'];
	  $imgsize = getimagesize( $_FILES['datei']['name']); 
	  $groesse = filesize($_FILES['datei']['name']);
	  
	 $Uploaddatei = strtolower("$Uploaddatei");

	  $path = $Uploaddatei;
	  $path = explode(".",$path);
	  $ext = $path[count($path)-1];

	if(($imgsize[2] != "2") or ($Uploaddatei == "")){
	  $mistake = "1";
      $_SESSION['datei_for_msg_ses'] = "Bild hat nicht das Format jpg!";
	} ElseIf($groesse > "2560000"){ //1536000 1,5MB
	  $mistake = "1";
	  $_SESSION['datei_for_msg_ses'] = "Bilddatei zu grosse max.1.5 MB!";
	}
	}


$idEditttt = $_POST['idEditGet'];

	if($mistake == "1"){
	  header("location: ../../?ID=$idConnectionGet&toDo=create");
	} else {
	

	$vn = "../../../ZWISCHENSPEICHER/";
	$vnToGo = "../../../images/content/pics/thumbs/";
	$vnToGo2 = "../../../images/content/pics/zoom/";
	
	$i = 0;
	
	$verzeichnis = opendir($vn);
	while($file = readdir($verzeichnis)) {

    	$s = @getimagesize($vn."/".$file);

		if(in_array($s[2], array(1,2,3)))
        	$auswahl[] = $file;
			
			if ($s[2] == "2") {
			$i++;

			
			
			//erstellung der galerie
			if ($i == 1) {
			
				$INSERT = mysql_query("INSERT INTO $tabnamePics SET 
	    		title = '".$_POST['title_for']."',
	    		status = '1',
	   			time = '".time()."',
	    		month = '".$month."',
	    		year = '".$year."' ") ;
	   			$id_entry = mysql_insert_id();
        		$id_entry_code = md5($id_entry);
        		$hsakjhdasjd = $id_entry_code;
	
	
				$UPDATE = mysql_query("Update $tabnamePics SET idCertification = '".$id_entry_code."'  WHERE idEntry = '".$id_entry."'");
				
				$stValue = 1;
			 
			} else {
			$stValue = 0;
			}
			
			
			
		$INSERT2 = mysql_query("INSERT INTO $tabnamePics SET 
	    idConnection = '".$id_entry_code."',
	    status = '1',
	    time = '".time()."',
	    startpic = '$stValue' ") ;
	    $id_entry2 = mysql_insert_id();
        $id_entry_code2 = md5($id_entry2);
        
        $UPDATE2 = mysql_query("Update $tabnamePics SET idCertification = '".$id_entry_code2."'  WHERE idEntry = '".$id_entry2."'");
			
			
			
			
			
				$url = $vn.$file;
				$thumb_width = 150;
				$quality=90; 
				$newFileName = $id_entry_code2.".jpg";
				
				$thumb_width2 = 640;
				
				 

	  	  		$UPDATE = mysql_query("Update $tabnamePics SET pic = '".$newFileName."'  WHERE idEntry = '".$id_entry2."'");
				
				//org bild öffnen
				$org_image = imagecreatefromjpeg($url);
				$org_image_daten = getimagesize($url);
				$org_width = $org_image_daten [0];
				$org_height = $org_image_daten [1];
					
				//seitenverhältnis berechnen
				$skale_faktor = $org_width / $thumb_width;
				$thumb_height = round ($org_height / $skale_faktor);
				
				//var_dump ($org_image_daten);
				 if($org_width < $org_height){
	  
	  	    			
	  	    	$thumb_image = imagecreatetruecolor(138, 86);
				imagecopyresampled($thumb_image,$org_image,0,0,0,0,138, 86,138, 86);
	  	    			
	  	    			
	  				} else {
	  					$thumb_image = imagecreatetruecolor($thumb_width, $thumb_height);
				imagecopyresampled($thumb_image,$org_image,0,0,0,0,$thumb_width, $thumb_height,$org_width, $org_height);
	  				}
	  	
				$thumb_image = imagecreatetruecolor($thumb_width, $thumb_height);
				imagecopyresampled($thumb_image,$org_image,0,0,0,0,$thumb_width, $thumb_height,$org_width, $org_height); 
		
			
				if (imagejpeg($thumb_image, $vnToGo.$newFileName ,$quality)){
					imagedestroy ($thumb_image);
					imagedestroy ($org_image);
					//echo "<p>Thumb wurde erzeugt</p>";
					//echo "<p><img src=\"".$vnToGo.$newFileName."\" /></p>";
			
				}
				
				//org bild öffnen
				$org_image = imagecreatefromjpeg($url);
				$org_image_daten = getimagesize($url);
				$org_width = $org_image_daten [0];
				$org_height = $org_image_daten [1];
				
				//seitenverhältnis berechnen
				$skale_faktor2 = $org_width / $thumb_width2;
				$thumb_height2 = round ($org_height / $skale_faktor2);
				
				//var_dump ($org_image_daten);
				$thumb_image2 = imagecreatetruecolor($thumb_width2, $thumb_height2);
				imagecopyresampled($thumb_image2,$org_image,0,0,0,0,$thumb_width2, $thumb_height2,$org_width, $org_height); 
		
			
				if (imagejpeg($thumb_image2, $vnToGo2.$newFileName ,$quality)){
				
					imagedestroy ($thumb_image2);
					imagedestroy ($org_image);
					//echo "<p>Thumb wurde erzeugt</p>";
					//echo "<p><img src=\"".$vnToGo.$newFileName."\" /></p>";
			
				}
				
				
				unlink($vn."$file");
				
	
  			}
	
	}

       
		if ($i == 0) {
			$_SESSION['title_for_msg_ses'] = "Im Ordner ZWISCHENSPEICHER FEHLEN DIE BILDER!";
			header("location: ../../?ID=$idConnectionGet&toDo=create");
		} else {
		
			//DEL SESSIONS
	 		$_SESSION['title_for_ses'] = "";
	 		$_SESSION['title_for_msg_ses'] = "";
	 		$_SESSION['text_for_ses'] = "";
	 		$_SESSION['text_for_msg_ses'] = "";
	 		$_SESSION['datei_for_msg_ses'] = "";

	 
      		$_SESSION['msg_ses'] = "Erfolgreich gespeichert";
	  		header("location: ../../?ID=$idConnectionGet&idEdit=$hsakjhdasjd");
		
		}	

	}

}
?>
 
Zuletzt bearbeitet von einem Moderator:
Hey,

äähm wieso fügst du mit einem Script nicht alle Bilder zur Datenbank ( Ort, Title , Beschreibung etc)
und mit einem Script liest du die Datenbank dementsprechend aus!

Zudem solltest du deinen Code in {CODE} - Tags nehmen ( mit [ eckigen Klammern ] )

mfg

bo
 
Danke für die Tipps.

Mein hauptsächliches Problem ist eigentlich, dass die Reihenfolge so durcheinander ist.
Ich habe jetzt auch andere Posts gelesen, bei denen das genau gleich ist.

Da stand dann, dass man das ganze in ein Array einlesen soll.
Nur leider bin ich nicht so der Experte, dass ich es jetzt gleich selber hinkriege. Hat bei mir viel mit Trial & Error zu tun ;).

Das Teil, das ich nicht kapier hier, ist die variable $s, die im Zusammenhang steht mit dem Auslesen eines Arrays (array_in).
Wozu brauch ich das denn hier? Kann ich da mein neues Array draus bauen?

Sorry für die vielen Fragen, hab gedacht, es wäre nur n kleines Problem, die Sortierung mit dem bestehenden Script zu ändern, aber das scheint es wohl (für mich zumindest) nicht zu sein.
Danke nochmals für eure Antworten.


mfg
Andi
 
Hi,

zuerst mal was Grundsätzliches zu deinem Problem. Dateisysteme selbst achten überhaupt nicht auf irgendwelche Reihenfolgen der Dateien, weder beim Schreiben noch beim Lesen. Wer noch die alten MS-DOS Zeiten kennt, weiß, daß auch DOS die Dateien und Verzeichnisse völlig unsortiert aufgelistet hat. Eine Sortierung nach was-auch-immer ist stets die Sache des ausgebenden Elements, also der Fenstersteuerung bzw. des Betriebssystems. Und im Falle des Internets bist du das Betriebssystem und mußt selbst für eine Sortierung sorgen.

Generell würde ich die Bilder bzw. Bildnamen nicht in einer Datenbank ablegen, wenn immer ein ganzes Verzeichnis oder Blöcke, die anhand bestimmter Kriterien identifiziert werden können, angezeigt werden sollen. Denn da mußt du zuerst auf die Datenbank zugreifen um alle passenden Datensätze auslesen. Ich mache es in solchen Fällen so, daß ich alle Dateinamen eines Verzeichnisses auslesen und dann sortieren lasse. Spart jede Menge DB-Zugriffe.

Generell ist es aber richtig, alle Ergebnisse in ein Array schreiben und sortieren zu lassen.

Hier mal ein Beispiel, wie das Auslesen eines ganzen Verzeichnisses mit anschließender Sortierung bei mir gelöst wird. Zuerst werden alle Dateinamen in der Reihenfolge in das Array "dateiliste" aufgenommen, die das Dateisystem ausgibt. Mit is_file() werden alle Verzeichnisse und . bzw. .. übergangen. Zum Schluß wird mit natcasesort() die Liste natürlich sortiert.

PHP:
$dateiliste = '';
$pfad = 'galerie/'.$galerie.'/';
if ($handle = @opendir($pfad)){
	while ($file = readdir($handle)){
		if (is_file($pfad.$file)){
			$dateiliste[] = $file;
		}
	}
	closedir($handle);
	natcasesort($dateiliste);
}
 
Zudem sendet dein Server ohnehin das der Browser die Bilder nicht cachen soll, und jedes mal erneut abgefragt werden sollen.

Wenn du die Rechte dazu hast, solltest du in die htaccess noch Expires aktivieren, etwa mit:
Code:
ExpiresActive On
ExpiresByType image/gif "access plus 336 hours"
ExpiresByType image/jpeg "access plus 336 hours"
ExpiresByType image/png "access plus 336 hours"
ExpiresByType text/css "access plus 12 hours"
ExpiresByType text/javascript "access plus 336 hours"
ExpiresByType application/x-javascript "access plus 336 hours"


PS: Generell arbeitete euer CMS auch relativ langsam. Bei mir verbraucht das generieren der HTML Seite ~ 1,5 Sekunden von 2,1 Sekunden Gesamtladezeit.
 
Zuletzt bearbeitet:
Zurück