Numeros desordonnes

ks13 Messages postés 191 Statut Membre -  
ks13 Messages postés 191 Statut Membre -
Bonjour,

J'ai fait 2 pages php pour recuperer des images en serie automatiquement. Ce que je voudrais faire, c'est pouvoir indiquer les numeros des pages a recuperer de maniere plus flexible. C'est à dire que je voudrais pouvoir lui donner des pages a la facon "1, 3-4, 6, 8-10", ce qui fera la page recuperer les images avec les numeros 1, 3, 4, 6, 8, 9 et 10. Un peu comme on peut selectionner les pages a imprimer particulieres dans Excel.

Y a t il un moyen de realiser cela en php?

21 réponses

mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   44
 
je te conseille d'aller voir du côté de l'argument LIMIT si tu utilises SQL.
0
ks13 Messages postés 191 Statut Membre 23
 
Salut, merci de ta reponse, mais, comme je l'ai dit en fin du post, c'est en php uniquement. J'ai aussi essaye de trouver l'argument limit dans les documentations php online, mais je n'ai pas reussi a le trouver. Pourrais tu preciser ta pensee ou aurais tu un lien ou on explique l'utilisation de cet argument? Si il y a besoin je peux poster le code de mes 2 pages (ce n'est pas un projet top secret :) pour plus de clarté.
0
mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   44
 
en te donnant l'argument LIMIT, je pensais que tu utilisais une base de données mysql (ou phpmyadmin pour ceux qui ne pigent pas).

Je pensais donc que tu faisais un requête dans cette base via mysql_query et l'argument LIMIT sert à ca !

https://www.thoughtco.com/limit-mysql-command-2693970
0
ks13 Messages postés 191 Statut Membre 23
 
Je me disais aussi, mais la je n'utilise que du php, je posterais les 2 pages quand je rentrerais chez moi (suis au boulot et y a du boulot a faire ^^). A plus tard.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ks13 Messages postés 191 Statut Membre 23
 
Resalut, désolé pour le retard, j'ai été occupe juste après être rentre, mais voici les 2 pages en fichiers joints :

Le formulaire : https://www.cjoint.com/?hqwSOvwVSw

Et la page qui télécharge : https://www.cjoint.com/?hqwVbTdOzu

Les pages ont été créées a la va vite et sans intention d'être présentables
0
mjmdurand Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   44
 
documents non téléchargeable ;-)
0
ks13 Messages postés 191 Statut Membre 23
 
Re, désole pour cela, je ne suis pas sur de la cause mais je pense qu'il sera plus simple de faire un copier coller des 2 pages ici, elle ne sont pas très longues. Voici donc la page du formulaire en 1er :
<html>
<head><title>Gallery Downloader v0.5</title></head>
<body>

	<form action="executor.php" method="post">
	<table width="1200" height="200">
		<tr height="30">
			<td width="400">
				Hmmm.....now where are those images at?
			</td>
			<td width="800">
				<input name="adress" id="adress" type="text" width="500"/>
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				And the specific folder is?
			</td>
			<td width="800">
				<input name="folder" id="folder" type="text" width="500"/>
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				And what was the name of the image series....? (i think the sign "#" means a variable number)
			</td>				
			<td width="800">
				<input name="imgname" id="imgname" type="text" />
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				If i recall it correctly, the series began at, and ended at number....
			</td>				
			<td width="800">
				<input name="nbbeg" id="nbbeg" type="text" width="180" /> - <input name="nbend" id="nbend" type="text" width="180" />
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				Maybe it was a formated serie...
			</td>				
			<td width="800">
				Yes<input name="format" id="format" type="radio"/> - No<input name="format" id="format" type="radio"/>
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				I think i'll save those here :
			</td>				
			<td width="800">
				<input name="savepath" id="savepath" type="text" width="400" />
			</td>
		</tr>
		<tr height="30">
			<td width="400">
				Oh, and in case, the files that are too large shouldn't be copied.
			</td>				
			<td width="800">
				<input name="maxsize" id="maxsize" type="text" width="400" />Mb
			</td>
		</tr>
		<tr>
		<td colspan="2">
			<button name="submit" id="submit" type="submit">Okay, here we go!</button>
		</td>
		</tr>
	</table>
	</form>
</body>
</html>


Et ensuite la page executant la copie :

<html>
<title>Gallery Downloader v0.5</title>
<body>

	<?php
	
	/* - Ceci sert de test rapide pendant la mise a jour du code*/
	
	/*$adress = "";
	$imgname ="0#.jpg";
	$nbbeg = ;
	$nbend = ;
	$savepath = "";
	$maxsize = 10;
	$sp = strpos( $imgname, "#");
	$imgnl = substr( $imgname,0,$sp);
	$imgnr = substr( $imgname,$sp+1);*/
	
	$defsavepath = "savedimg/";
	$adress = $_POST['adress'];
	$folder = $_POST['folder'];
	$imgname = $_POST['imgname'];
	$nbbeg = $_POST['nbbeg'];
	$nbend = $_POST['nbend'];
	$savepath = $_POST['savepath'];
	$maxsize = $_POST['maxsize'];
	/*$formated = $_POST['format'];*/
	$sp = strpos( $imgname, "#");
	$imgnl = substr( $imgname,0,$sp);
	$imgnr = substr( $imgname,$sp+1);
	$add = "0";
	
	echo "Voici les donées :"."<br>";
	echo ("L'adresse internet des images est :  ".$adress."<br>"."Le nom générique des images est :  ".$imgname."<br>"."Le nombre de depart de la série est :  ".$nbbeg." et le nombre de fin est :  ".$nbend."<br>"."Le chemin complet du dossier de sauvegarde des images est :  ".$savepath."<br>"."La taille maximum de chaque image ne doit pas depasser :  ".$maxsize."Mb<br>");
	$i =0;
	$j = $nbbeg;
	if(!is_dir($savepath)){
	mkdir($savepath,0700);
	}

	
	while ($j<$nbend+1){
	$nbbeg =$j;
	if(strlen($nbbeg) !== strlen($nbend)){
	while(strlen($nbbeg) !== strlen($nbend)){
	$nbbeg = $add.$nbbeg;
	}
	}
	echo "<br>Nombre courant :  ".$nbbeg."/".$nbend;
	echo "<br>Variable courante :  ".$nbbeg."/".$nbend;
	$simgnametable=$adress.$folder.$imgnl.$nbbeg.$imgnr;
	$dimgnametable=$savepath."/".$imgnl.$nbbeg.$imgnr;
	echo "<br>Chemin de la source :  ".$simgnametable;
	echo "<br>Chemin de sauvegarde :  ".$dimgnametable;
	echo "<br>Partie gauche du nom de l'image :  ".$imgnl;
	echo "<br>Partie droite du nom de l'image :  ".$imgnr;
	echo "<br>";
	if (!copy($simgnametable,$dimgnametable)) {
	echo "La copie du fichier $simgnametable[$i] dans $dimgnametable[$i] n'a pas réussi...\n";
	}
	$i =$i+1;
	$j =$j+1;
	
	}
	?>

</body>
</html>


Vous remarquerez des parties qui en apparence ne servent a rien, et c'est le cas, ce sont des parties de fonctions que je voulais implementer, mais que je n'ai pas eu le temps de finir.
0
Leviathan49 Messages postés 267 Statut Membre 70
 
pour le problème des pages je te propose cette méthode avec les expressions régulières. exemple :
<?php 
function fct($capture){ 
   sscanf("$capture[1]","%d-%d",$debut,$fin);

   $res = "$debut";
   
   for($i=($debut+1);$i<=$fin;$i++)
   {
      $res .= ",$i";
   }
   return $res; 
} 

$txt = "1,2,3,4-6,9-12,13,15-20"; 
echo preg_replace_callback('#([0-9]{1,2}-[0-9]{1,2})#', "fct", $txt);
?>

Cela remplace "5-9" entrés par l'utilisateur par "5,6,7,8,9"
0
ks13 Messages postés 191 Statut Membre 23
 
Je vois, le sscanf cherche dans le string une expression du genre "%d-%d" et met le 1er %d en tant que numero de debut, et le 2eme en tant que numero de fin puis avec une fonction ajoute tous les numeros entre debut et fin, les deux y compris, dans un tableau.

Mais je n'ai pas tres bien compris le preg_replace_callback. Je vois que cela change le texte avec tous les numerso choisis, mais je ne connais pas cette fonction. Pourrais tu expliquer comment cela marche avec les arguments que tu y a mis?
0
Leviathan49 Messages postés 267 Statut Membre 70
 
Le preg_replace_callback applique la fonction "fct" a tout ce qui correspond a ce motif "[0-9]{1,2}-[0-9]{1,2}" soit deux chiffres séparés par un tiret. Ça reviens à ca :
- preg_replace_callback : cherche un chaine correspondant au motif dans la chaine placée en paramètre.
- preg_replace_callback : récupère "1-5", le stocke dans un tableau.
- preg_replace_callback : appelle la fonction fct sur ce tableau.
- fct : remplace "1-5" par "1,2,3,4,5"
- fct : renvoie "1,2,3,4,5"
- preg_replace_callback : remplace "1-5" par "1,2,3,4,5" dans la chaine placée en paramètre.
0
ks13 Messages postés 191 Statut Membre 23
 
Je vois mais, il y a toujours ce [0-9]{1,2} dont je ne comprends pas le sens, j'ai bien compris que [0-9] designe les chiffres, mais je ne vois pas a quoi sert {1,2}.

Il y a aussi un autre detail que je viens de remarquer : tu met le resultat dans un string. Mais j'ai besoin d'avoir un tableau contenant les numeros entrés pour l'utiliser dans ma boucle. Donc, je pense avoir un truc du genre :
$tblnbs[] = sscanf($txt, "%d,"); 


Apres quoi, je devrais trouver la longueur du tableau (que ne sais pas faire pour le moment) et faire un
$i=0; 
while($i<(longueur maximum du tableau)+1){


ensuite je remplace $nbbeg et $nbend par $tblnbs[$i] en modifiant un peu ma boucle while actuelle.

PS: Je ne suis pas sur mais si je fais un truc du genre :
$tblen = $$tblnbs;
$longueur = end($tblen);


Cela me donnera la taille du tableau?
0
Leviathan49 Messages postés 267 Statut Membre 70
 
Si tu veux un tableau c'est tout simple, tu prends mon string et tu utilises explode.
http://php.net/manual/fr/function.explode.php
Soit $a = explode(",",$txt); $a contient donc un tableau des nombres entrés

Le {1,2} veux dire que tu peux avoir 1 ou 2 [0-9] donc 1 ou 2 chiffres.
0
ks13 Messages postés 191 Statut Membre 23
 
Merci pour la reponse rapide. Alors, si j'ai un chiffre superieur a 100, je dois mettre {1,3} ou {1,2,3}?

Aussi, d'accord pour obtenir le tableau des valeurs, mais comment faire pour obtenir la longueur du tableau, ou alors, faire qu'il effectue une action pour toutes les valeurs du tableau?

PS: apres une recherche, j'ai reussi a trouver la fonction :
for$i=0; $i <= count($a); $i++)


Si j'ai bien compris.
0
Leviathan49 Messages postés 267 Statut Membre 70
 
{1,3} pour un chiffre supérieur à 100.

Je conseille foreach pour parcourir le tableau
https://www.php.net/manual/fr/control-structures.foreach.php
ex:
foreach($tableau as $numpage)
{
echo $numpage;
}
Sinon pour connaitre la taille du tableau : sizeof($tableau).
0
ks13 Messages postés 191 Statut Membre 23
 
Hmm, $tableau as $numpage, je ne comprends pas....

Est-ce que c'est un equivalent du
for ($i=0; $i <= sizeof($tableau); $i++) {
$tableau[$i] = $numpage;
echo $numpage;


?
0
Leviathan49 Messages postés 267 Statut Membre 70
 
Oui tout à fait (plutôt $numpage = $tableau[$i];)
C'est une version simplifiée de ta structure, ça parcourt le tableau et stocke la case actuelle dans $numpage.
0
ks13 Messages postés 191 Statut Membre 23
 
D'accord, donc j'ai bien compris ce qu'il y avait ecrit sur le lien que tu m'a donne. Par contre, le $key => $value, d'apres ce que j'ai compris, ca assigne la valeur de $value a $key, non?
0
Leviathan49 Messages postés 267 Statut Membre 70
 
Non pas du tout.

Si tu utilise la structure foreach($tableau as $numpage) tu as la valeur de chaque case du tableau qui se stocke dans $numpage.

Si tu utilise la structure foreach($tableau as $key => $numpage) tu as la valeur de chaque case du tableau qui se stocke dans $numpage et la valeur de la clé qui se stocke dans $key. La clé étant le "nom" de la case. Dans un tableau "normal" chaque clé est un nombre.
array
{
0 => "case 1"
1 => "case 2"
2 => "case 3"
}
Dans un tableau un peu plus exotique on peut avoir d'autres clés.
array
{
"clé 1" => "case 1"
"clé 2" => "case 2"
"clé 3" => "case 3"
}
echo $tableau["clé 1"]; affiche donc "case 1".

Cette structure est donc à utiliser si tu veux récupérer la clé.
0
ks13 Messages postés 191 Statut Membre 23
 
Oh, je vois, a force de n'utiliser que les valeurs dans un tableau en laissant des numeros pour noms de parties, je commencais a oublier qu'on pouvais donner des noms a chaque partie d'un tableau. J'allais mettre ici le code modifi de ma page mais je suis tombé sur un probleme : le {1,2}. Comment verifier la longueur du plus grand nombre dans le string avant meme de decomposer le string? Car si l'utilisateur entre un truc du genre "21-50, 98-120", on aura {1,2} pour les 1ers numeros, et {1,3} pour les derniers. Il sera facile de mettre {1,3} partout, mais je voudrais faire un truc dynamique pour que la fonction utilise la bonne logueur dependant des numeros entrés. Pour moi je ne pense pas depasser 100, mais si dans le futur quelqu'un depasse 100, ou meme 1000, la fonction ne marchera pas correctement.
0
Leviathan49 Messages postés 267 Statut Membre 70
 
Une solution pour cela :
<?php   
function fct($capture){   
   sscanf("$capture[1]","%d-%d",$debut,$fin);  

   $res = "$debut";  
     
   for($i=($debut+1);$i<=$fin;$i++)  
   {  
      $res .= ",$i";  
   }  
   return $res;   
}   

$txt = "1,2,3,4-6,9-12,13,15-20";   
echo preg_replace_callback('#([0-9]+-[0-9]+)#', "fct", $txt);  
?>

Voilà tu peut en mettre à 150 chiffre si tu veux maintenant (le + est équivalent à {1,infini}) ta fonction marchera quelque soit le nombre de pages.
0