insertion de l'ensemble d'un dossier dans mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : insertion de l'ensemble d'un dossier dans mysql

par hannao » 19 mai 2009, 11:38

merci geoffroy
c'est exactement ce que je cherchais à faire.
Je vais me pencher de plus près sur ton code afin de bien assimile la logique en tout cas grand merci à toi

par geoffroy » 19 mai 2009, 10:37

Ca dépend de ce que tu veux faire.
Si j'ai bien compris, un dossier correspond à un article dans ta base.
Tu peux donc, lorsque tu traites un dossier (donc dossier par dossier),
exécuter à la fin une requête qui enregistre le nom et/ou chemins de tes images correspondant
à un article dans la base.

Un exemple, (plus simple, on oublie le tableau, on va tout mettre dans une chaine de caractères)
<?php
function traiter_dossier($gf) {
    global $dossier_reduit, $max;
	
	//chemin vers les images
    $gf .= "/";
    $pf = $gf.$dossier_reduit."/";

    // tester si le dossier de destination existe, sinon le créer
    if (!is_dir($pf)) {
        mkdir($pf);
    }

    // lister les images du dossier grand_format
    $liste = glob($gf."*{jpg,gif,png,jpeg}",GLOB_BRACE); // => "${gf}*jpg" -> "images/*jpg"
    // $liste = array('images/un.jpg','images/deux.jpg','images/trois.jpg','images/quatre.jpg');
    
	// On va se servir de ce tableau $imgs qui ne sert à rien
	$imgs = ""; // on stocke dans la chaine $imgs
	// les différentes images séparés par des étoiles *
	
    // pour chaque image du dossier grand_format
    foreach ($liste as $imageG) {
        $fichier = basename($imageG); // "images/un.jpg" => "un.jpg"
        echo "- ${pf}${fichier}<br/>\n";
        // si pas jpg alors renommer en jpg sinon ne rien ajouter
        if (!is_file("${pf}${fichier}")) { // "imagesDesti/un.jpg"
            // créer une copie de l'image dans le dossier petit_format
            reduire($fichier,$gf,$pf,$max);
            echo "j'ai du réduire<br/>\n";
        }
		
		$imgs .= $pf . $fichier . "*"; // on rajoute l'image (ce que tu veux, ici le petit format,
		// en cours dans la chaine $imgs

	}
	
	// A LA FIN DE LA BOUCLE, TU ENREGISTRES TES IMAGES D'UN DOSSIER
	// DANS LA LIGNE DE LA TABLE articles DONT l'id correspond au n° du dossier traité
	$requete=mysql_query("INSERT INTO jos_content (images_urls) VALUES '".$imgs."' WHERE id='".$gf."';");
    
} 
?>
Après ta boucle foreach, on a donc une chaine de caractère $imgs, du style :
"dossier1/pf1.jpg*dossier1/pf2.jpg*...",

On l'insère dans une colonne images_url (ou autres) de la table jos_content.

Après, tu peux faire un select pour les récupérer.
Tu peux séparer les étoiles de ta longue chaîne de caractères en tableaux où chaque ligne correspondra à une image, grâce à la fonction explode().
$tableau_images = explode("*", $imgs);

par hannao » 19 mai 2009, 00:43

vraiment merci pour toutes tes explications greffray,
'jai fait ce que tu m'as explique et surtout je l'ai compris
Maintenant pour l'insertion des images je ne peut pas le faire d'un fichier php pour une question de visibilité des variables non? Il me faudra donc réunir me 2 dossiers php en un pour effectué la requête
c'est ça non ? les problèmes de visibilités des variables
Merci pour ton aide j'y suis presque.
ou bien créer une fonction et l'appeler

par geoffroy » 18 mai 2009, 22:42

Non, quand je disais dans ta boucle de traitement, je voulais dire le foreach qui parcours tes images (dans ta fonction traiter_dossier ).

Je t'ai montré la fonction array_push(),
car c'est une fonction qui lorsqu'on a un tableau permet de lui ajouter une valeur simplement,
sans préciser d'index.

Pendant que tu parcours tes dossiers et tes images, tu peux les enregistrer dans un tableau.
Par exemple, tu peux faire un tableau du style :
dossier => chemin des images
(1 => "image1.jpg/image2.jpg", 2=> ...)

Ensuite pour les enregistrer dans ta bdd, tu fais un foreach pour parcourir ce tableau et tu peux insérer le chemin de tes images selon leur dossier dans la colonne d'un article particulier.
C'est une façon de faire parmi d'autres, c'est pour te donner une piste.

par hannao » 18 mai 2009, 14:29

Merci geoffrey
oui il s'agit effectivement de joomla (on voit les connaisseurs),


J'ai toutes une série de dossier de 1 à 600 environ contenant chacun des images
ex : dossier 1 contient 1-1.jpg,1-2.jpg etc....
dossier 2 contient 2-1,2-2, etc...
ce que je cherche a faire :

enregistrer dans la base de données chaque dossier en conservant son numéro pour le mettre automatiquement au bon endroit dans la base et par la même occasion l'adresse des images qu'il contient dans un et unique champs de la base.
Je ne veux pas mettre les images elles même dans la table mais simplement leur adresse
voilà j'espère avoir été plus clair.

ce que tu me propose de faire c'est d'inclure dans ma boucle
$handle = fopen("test.csv", "rw");
	while (($data = fgetcsv($handle, 0, chr(9),'|')) !== FALSE) {
    $ligne++;
    $num = count($data);
	//$img = '<img src="images/1-2.jpg" />';
    for ($c=0; $c < $num; $c++) {
      //echo 'Col ['.$ligne.', '.$c.'] = '.$data[$c].'<br />'; 
	  echo $data[$c].'<br />';
	  //$var2 = $data[2];
	  $var1 = substr($data[2], 0, 20);
	 
	  }
une variable qui qui contienne l'array_push (l'empilment du tableau) et ensuite de faire l'insert.

par geoffroy » 18 mai 2009, 13:01

Ca ressemble à du joomla tout ça :o ..

Tu peux créer un tableau, et y enregistrer tes paramètres d'images au fur et à mesure de ta boucle de traitement.

Ex :
$tableau_images = array();
Dans ta boucle de traitement, tu enregistres les paramètres que tu souhaites enregistrer image par image (exemple ici l'url de l'image et son dossier) :
array_push( $tableau_images, $dossier, $url_image );
Tu as l'air de faire quelque chose du genre en commentaires dans ta fonction 'traiter_dossier' :
// $liste = array('images/un.jpg','images/deux.jpg','images/trois.jpg','images/quatre.jpg');
A la fin du peux traiter ton tableau et l'enregistrer où bon te semble dans ta base de données.

Ton message n'est pas très compréhensible, j'ai essayé de répondre.
Si ce n'est pas ce que tu attendais, précise un peu plus ton problème.

insertion de l'ensemble d'un dossier dans mysql

par hannao » 17 mai 2009, 18:16

bonjour a tous,

Une bonne journée que celle du dimanche n'est-ce pas ?

Bon voilà j'ai fin un script de redimensionnement des images, ce script fonctionne pour réduire les images de tous le dossier qu'il trouve et en conserve des vignettes dans un dossier créer dans le dossier d'origine voilà le script en question
.
<?php
	
$racine = "images";
$dossier_reduit = "petite_images";
$max = 250;

lit_dossier($racine);


function lit_dossier($dir) {
	global $dossier_reduit;
	if (!is_dir($dir)) {
		echo "$dir n'est pas un dossier";
		return;
	}
	//Ouvre le dossierPrincipale et renvoi un tableau 
	$liste = scandir($dir);
	foreach ($liste as $d) {
		if ($d!="." && $d!=".." && $d!=$dossier_reduit && is_dir($dir."/".$d)) {
			echo "$dir/$d est un dossier<br/>\n";
			echo"$dir/$d<br>\n"; // pour recuperer le n° de dossier images
			lit_dossier($dir."/".$d);
		} else { 
			//echo "$dir/$d est un fichier ou . ou ..<br/>\n";
		}
	}
	traiter_dossier($dir);
}

function traiter_dossier($gf) {
	global $dossier_reduit, $max;
	$gf .= "/";
	$pf = $gf.$dossier_reduit."/";

	// tester si le dossier de destination existe, sinon le créer
	if (!is_dir($pf)) {
		mkdir($pf);
	}

	// lister les images du dossier grand_format
	$liste = glob($gf."*{jpg,gif,png,jpeg}",GLOB_BRACE); // => "${gf}*jpg" -> "images/*jpg"
	// $liste = array('images/un.jpg','images/deux.jpg','images/trois.jpg','images/quatre.jpg');
	$imgs = array();
	// pour chaque image du dossier grand_format
	foreach ($liste as $imageG) {
		$fichier = basename($imageG); // "images/un.jpg" => "un.jpg"
		echo "- ${pf}${fichier}<br/>\n";
		// si pas jpg alors renommer en jpg sinon ne rien ajouter
		if (!is_file("${pf}${fichier}")) { // "imagesDesti/un.jpg"
			// créer une copie de l'image dans le dossier petit_format
			reduire($fichier,$gf,$pf,$max);
			echo "j'ai du réduire<br/>\n";
		}
	}
}


function reduire($fichier, $d_src, $d_dest, $max) {
	// Crée une nouvelle image à partir d'un fichier src
	$ext = trouver_extension($fichier);
	switch($ext) {
		case "jpg":
		case "jpeg":
			$f = "imagecreatefromjpeg";
			$fe = "imagejpeg";
		break;
		case "gif":
			$f = "imagecreatefromgif";
			$fe = "imagegif";
		break;
		case "png":
			$f = "imagecreatefrompng";
			$fe = "imagepng";
		break;
		default:
			return;
	}
	$grande_image = $f("${d_src}${fichier}");
	
	// prend les mesures de l'image src
	$ls = imagesx($grande_image);
	$hs = imagesy($grande_image);

	//	On établi une regle de traitement --- si largeur src>hauteur de la source alors
	if ($ls > $hs) {
		$ld = $max;
		$hd = $hs / $ls * $max;
	} else {
		$hd = $max;
		$ld = $ls / $hs * $max;
	}

	/*Retourne un identifiant de ressource image en cas de succès, FALSE si une erreur
	  survient.en gardant les vrai couleur*/ 
	$petite_image = imagecreatetruecolor($ld,$hd);
	imagecopyresampled($petite_image, $grande_image, 0, 0, 0, 0, $ld, $hd, $ls, $hs);
	/* Enregistre l'image_gd $petite_image dans le fichier "$d_dest$fichier" */
	$fe($petite_image, $d_dest.$fichier);
}
	
function trouver_extension($fichier){
	
	$ext = explode(".",$fichier);
	// Pour vérifier push, pop sert a enlever le dernier element du tableau (voir shift et unshift)
	$extension = array_pop($ext);
	return $extension;
}

?>	   
j'ai d'autre part une requête sql qui fonctionne mais je voudrais pouvoir ajouter à cette requête l'ensemble des images contenu dans un dossier dans le champs images ou url peut importe
je vous mettre le bout de code pour la requête;


<?php
	mysql_connect("localhost","root",""); // declaration de la connexion
    mysql_select_db("interieu");
	$ligne = 0;
	$handle = fopen("test.csv", "rw");
	while (($data = fgetcsv($handle, 0, chr(9),'|')) !== FALSE) {
    $ligne++;
    $num = count($data);
	//$img = '<img src="images/1-2.jpg" />';
    for ($c=0; $c < $num; $c++) {
      //echo 'Col ['.$ligne.', '.$c.'] = '.$data[$c].'<br />'; 
	  echo $data[$c].'<br />';
	  //$var2 = $data[2];
	  $var1 = substr($data[2], 0, 20);
	 
	  }
	$query = "INSERT INTO jos_content (`id`,`title`,`alias`,`title_alias`,`introtext`,`fulltext`,`state`,`sectionid`,`mask`,`catid`,`created`,`created_by`,`created_by_alias`,`modified`,`modified_by`,`checked_out`,`checked_out_time`,`publish_up`,`publish_down`) VALUES ('". 
	$data[0] ."','".$data[1]."','".$data[1]."','".$img."','".$var1."','".$data[2]."',1,5,0,0,now(),62,'".idem."',now(),62,76392,now(),now(),'2010-10-10 00:00:00')";
	mysql_query($query);
	($query);
	echo $query.'<br />';
	//je n'arrive plus qu'a rentrer  le numéros 3 dnas le fichier test.csv, je ne sais pas pourquoi on //va chercher
 }

voilà donc je veux garder en mémoie le n° du dossier et l'ensemble de ces photos pour l'associer à un article dans la base de données,

voilà le problème et j'ai pas envie de me taper tous le chemin à la main.