Morceaux de scripts PHP bien utiles, participez ;)

WRInaute impliqué
Bonjour à tous,

Je vous propose de faire un petit regroupement de fonctions PHP, javascript ou autre langage, que vous utilisez souvent et que vous désirez partager avec d'autres développeurs ;)

Je commence avec une petite fonction permettant de faire une pagination à la mode phpBB (voir en bas à droite du forum par exemple).

===================================================
Sommaire :

* Script permettant la mise en forme d'une liste de pages (comme un forum par exemple) par mowmow

* Debug (print_r avancé) par La Chaise Sauvage

* Fonction de comparaison de chaine de caractères en trois modes (test d'égalité, présence du mot dans l'autre ou expression régulière) par Mumuri

* Fonction permettant de lancer une commande linux($cmd) et d'afficher le succès ou l'échec de l'opération par dadovb

* Fonction qui met en gras le texte $x de la chaine $var

* Fonction de mise en forme de texte pour utilisation dans une URL (Par exemple pour de l'URL Rewriting) par magic corp.

===================================================

Code :
Code:
function pagination($actual_page, $page_number, $url, $show = 3) {
	// Erreurs
	if($show % 2 == 0 || $show < 3) {
		return 'Erreur : $show ne doit pas être pair, égal à 0 ou égal à 1';
	}
	if($page_number < $actual_page) {
		return 'Erreur : la page actuelle est supérieure au nombre de pages.';
	}
	// Erreurs
	if($page_number < $show*4) {
		for($i = 1; $i <= $page_number; $i++) {
			if($i != $actual_page) {
				$debut[] = '<a href="'.str_replace('{id}', $i, $url).'">'.$i.'</a>';
			}
			else {
				$debut[] = $i;
			}
		}
		return implode(', ', $debut);
	}
	
	// Debut
	$debut_fin = $actual_page <= $show-1 ? $show : $actual_page < $show*2 ? $actual_page+1 : $show;
	$debut_fin = $actual_page == 1 ? $show : $debut_fin;
	for($i = 1; $i <= $debut_fin; $i++) {
		if($i != $actual_page) {
			$debut[] = '<a href="'.str_replace('{id}', $i, $url).'">'.$i.'</a>';
		}
		else {
			$debut[] = $i;
		}
	}
	
	// Milieu
	$milieu_verify = $actual_page-1 < $page_number - $show*2 && $actual_page+1 > $show*2 ? 1 : 0;
	$milieu_debut = $milieu_verify ? ($actual_page-floor($show/2)) : 1;
	$milieu_end = $milieu_verify ? ($actual_page+floor($show/2)) : 0;
	for($i = $milieu_debut; $i <= $milieu_end; $i++) {
		if($i != $actual_page) {
			$milieu[] = '<a href="'.str_replace('{id}', $i, $url).'">'.$i.'</a>';
		}
		else {
			$milieu[] = $i;
		}
	}
	// Fin
	$fin_debut = $actual_page >= $page_number-$show+1 ? $page_number-$show : $actual_page > $page_number-$show*2 ? $actual_page-1 : $page_number-$show+1;
	$fin_debut = $actual_page == $page_number ? $page_number-$show+1 : $fin_debut;
	$fin_fin = $page_number;
	for($i = $fin_debut; $i <= $fin_fin; $i++) {
		if($i != $actual_page) {
			$fin[] = '<a href="'.str_replace('{id}', $i, $url).'">'.$i.'</a>';
		}
		else {
			$fin[] = $i;
		}
	}
	// Résultat
	return implode(', ', $debut).($milieu ? ' ... '.implode(', ', $milieu).' ... ' :  ' ... ').implode(', ', $fin);
}

Utilisation :
$actual_page : Page actuelle dans la pagination
$page_number : Nombre de pages au total
$url : ce qui apparaîtra comme lien pour chaque page, exemple : /sommaire/theme/page-{id} => Précisez {id} dans votre url pour que l'id y soit affecté.
$show : Nombre de liens à afficher au début, au milieu et à la fin, doit être impair !

En pratique :
Code:
echo pagination($_GET['page'], ceil($count/$limit), '/mon_url/{id}.html', 3);

Pour tester :
Code:
echo pagination(10, 50, '/mon_url/{id}.html', 3);


Je ferais un petit sommaire dans ce premier post si les contributions sont nombreuses :) Je continuerais de poster quelques morceaux de scripts qui me sont bien utiles ;)

Bon partage :D
 
WRInaute occasionnel
Je crois qu'un site dédié serait plus approprié, non ?
De plus il existe déjà des dizaines de sites faisant ce que tu proposes.
 
WRInaute impliqué
vous avez tout les deux raison, mais vous êtes un peu rudes...

les sites existant recensent surtout des codes plus ou moins "complets", des CMS, des annuaires, de grosses classes etc... moi en lisant son post, j'avais pensé à des petits "trucs" et autres astuces de la vie de tous les jours.. un peu dans le genre des "top 10 custom javascript functions" de dustin diaz http://www.dustindiaz.com/top-ten-javascript ... sauf qu'on n'est pas obligés de se limiter à 10 (..et puis que ce ne sera sûrement pas les "top ten of all times", surtout les miennes ^^)

par exemple, moi j'ai une petite fonction que j'ai appelée "debug", et qui fait grosso modo la même chose qu'un print_r(); mais en mettant le truc un peu plus en forme. je l'utilise quand je ne sais plus ce qu'il y a dans une variable.. ^^

Code:
function debug($obj,$visible=0) {
	$v = ($visible==1) ?  'visible' : 'hidden';
	echo '<a href="#" onclick="document.getElementById(\'debug\').style.visibility=\'visible\'" id="switch">debug</a>
	<pre id="debug" style="visibility:'.$v.'"><a href="#" onclick="document.getElementById(\'debug\').style.visibility=\'hidden\'">[X]</a>
	<code>';
	print_r($obj);
	echo '</code></pre>';
}


avec la ptite css qui va bien c'est encore mieux (mais pas obligatoire)

Code:
pre#debug {
	font-size:14px;
	color:#000000;
	background-color:#FFFFCC;
	border:#FFCC66 2px solid;
	padding:3px;
	width:500px;
	}
#debug a {
	font-family:Verdana;
	text-decoration:none;
	float:right;
	}

à utiliser sur un objet, un tableau.. enfin comme print_r, quoi, sauf que c'est un peu plus lisible à mon goût, et qu'on peut le cacher ou l'afficher d'un clic. l'argument optionnel sert à préciser si on veut afficher ou non le résultat du debug tout de suite, ou seulement quand on clique sur "debug"...

voilàvoilà.. j'espère que je ne vais pas me faire incendier ^^
 
WRInaute impliqué
Voilà comme le dit "la chaise sauvage" c'est simplement des petits bouts de code qui rendent le développement plus simple, sans passer forcemment par un package complet de PEAR...
 
Nouveau WRInaute
Pour ma part je suis à la recherche d'un javascript qui permettrait de mettre un site en page de démarrage du browser et qui marcherait à la fois sous IE et Firefox.
 
WRInaute passionné
fonction de comparaison de chaine de caractére en trois modes (test d'égalité, présence du mot dans l'autre ou expréssion réguliére)

Code:
/**
regarde dans un tableau $interdits si $DossierCourant est "autorisé"
*/
function Est_Autorisé($DossierCourant,$Interdits){
    global $Goption;

    $drapeau = true;
    while ($drapeau && list(,$Dossier)=each($Interdits) ){
        if ( ComparaisonFichier($DossierCourant,$Dossier,$Goption))$drapeau = false;
    }
    reset($Interdits);
    return $drapeau;
}

/**
compare deux chaines
*/
function ComparaisonFichier($DossierCourant,$Dossier,$option=0){
    switch ($option){
        case 0:
            // faire une comparaison bit à bit
            return ($DossierCourant == $Dossier);
        break;

        case 1:
            // faire un filtre avec strpos
            $pos = strpos($mystring, $findme);
            if ($pos === false) {
                return false;
            } else {
                return true;
            }
        break;

        case 2:
            // faire un filtre avec les expressions réguliéres
            return ereg($Dossier,$DossierCourant);
        break;
    }
}


exemple d'appel
Code:
$Goption=0;// option de filtrage (laissez 0 si vous ne comprenez pas)
$ExtensionsInterdites= array('php','php3','html','htm');
if( Est_Autorisé("php",$ExtensionsInterdites))
echo "extension autorisé";
else
echo "extension interdite";

if( Est_Autorisé("gif",$ExtensionsInterdites))
echo "extension autorisé";
else
echo "extension interdite";
 
WRInaute passionné
Code:
function exec_cmd($cmd,$koi){
//permet de lancer une commande linux($cmd) et d'afficher le succès ou l'échec de l'opération
	exec($cmd, $out, $err);
	echo "<p>".$koi.": $cmd.....";
	if($err){
		echo "<font color='red'>ECHEC</font></p>";
		echo "<font color='red'>".$out[0]."</font></p><br>";
		return false;
	}else{
		echo "<font color='green'>succes</font></p>";
		return true;
	}
}

...toute petite commande ....

Code:
function highlight($x,$var) {
//fonction qui met en gras le texte $x de la chaine $var
	if ($var != "") {
		$xtemp = "";
		$i=0;
		while($i<strlen($x)){
			if((($i + strlen($var)) <= strlen($x)) && (strcasecmp($var, substr($x, $i, strlen($var))) == 0)) {
			//this version bolds the text. you can replace the html tags with whatever you like.
				$xtemp .= "<b>" . substr($x, $i , strlen($var)) . "</b>";
				$i += strlen($var);
			}
			else {
				$xtemp .= $x{$i};
				$i++;
			}
		}
	$x = $xtemp;
	}
	return $x;
}

tout est dit en commentaires...
 
WRInaute occasionnel
Fonction de mise en forme de texte pour utilisation dans une URL (Par exemple pour de l'URL Rewriting)
Code:
function convert_for_uri($text) {
  // Définition du séparateur
  define("SEPARATOR", "-");

  $tofind = "àáâãäåòóôõöøèéêëçìíîïùúûüÿñ"; // Lettre accentuées
  $replac = "aaaaaaooooooeeeeciiiiuuuuyn"; // Equivalant non accentué

  // Mise en minuscule + suppression des lettres accentuées par leur équivalant non accentué
  $text = strtr(strtolower($text),$tofind,$replac);

  // Remplacement de caractère non alphanumérique par un séparateur
  $text = ereg_replace("[^a-z0-9]", SEPARATOR, $text);

  // Suppression des doubles séparateurs
  while (strstr($text, SEPARATOR . SEPARATOR)) 
    $text = str_replace(SEPARATOR . SEPARATOR, SEPARATOR, $text);

  // Retour avec suppression d’un possible séparateur en fin de chaîne
  return(ereg_replace(SEPARATOR . "$", "", $text));
}
 
WRInaute impliqué
Je vous propose d'organiser un concours: script le + utile, script le plus optimisé (léger en charge serveur), script le + innovant et, bien sûr, prix du meilleur script php. Non ?
 
WRInaute impliqué
Tilt a dit:
Je vous propose d'organiser un concours: script le + utile, script le plus optimisé (léger en charge serveur), script le + innovant et, bien sûr, prix du meilleur script php. Non ?

Dans ce cas je peux dire
Code:
<?php
echo'Hello World';
?>

Plus sécireusement faut donner une base, genre le meilleure script pour supprimes les accents, le meilleure script pour rendre les adresse cliquables etc.

A+
 
WRInaute impliqué
Pour les utilisateurs expérimentés je vous conseille également : http://tech.motion-twin.fr/

Et plus précisemment pour PHP : NSpod, PHPTal et leur librairie SQL

-http://tech.motion-twin.fr/php_sql.html
-http://tech.motion-twin.fr/php_spod.html
-http://phptal.motion-twin.com/
 
WRInaute impliqué
De la part de PigeonDeCombat :

PigeonDeCombat a dit:
Bonjour,

Voici un petit Javascript qui vous permettra de calculer une distance entre deux GPoint(). Très utile quand on souhaite n'afficher que les markers dans un rayon de X km.

Code:
function LatLong(degLat, degLong) {
	  this.lat = LatLong.llToRad(degLat);
	  this.lon = LatLong.llToRad(degLong);
	} 	 
	
	LatLong.llToRad = function(brng) {
	  if (!isNaN(brng)) return brng * Math.PI / 180;  
	
	  brng = brng.replace(/[\s]*$/,'');               
	  var dir = brng.slice(-1).toUpperCase();         
	  if (!/[NSEW]/.test(dir)) return NaN;            
	  brng = brng.slice(0,-1);                       
	  var dms = brng.split(/[\s:,°º′\'″"]/);         
	  switch (dms.length) {                           
	    case 3:                                       
	      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
	    case 2:                                       
	      var deg = dms[0]/1 + dms[1]/60; break;
	    case 1:                                       
	      if (/[NS]/.test(dir)) brng = '0' + brng;    
	      var deg = brng.slice(0,3)/1 + brng.slice(3,5)/60 + brng.slice(5)/3600; break;
	    default: return NaN;
	  }
	  if (/[WS]/.test(dir)) deg = -deg;               
	  return deg * Math.PI / 180;                     
	}
	
	LatLong.distHaversine = function(p1, p2) {
	  var R = 6371; 
	  var dLat  = p2.lat - p1.lat;
	  var dLong = p2.lon - p1.lon;

	  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
	          Math.cos(p1.lat) * Math.cos(p2.lat) * Math.sin(dLong/2) * Math.sin(dLong/2);
	  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
	  var d = R * c;
	
	  return d;
	}

Exemple :
Code:
  startPoint = new LatLong(lat, lng);
  endPoint = new LatLong(lat, lng);
  var dist = LatLong.distHaversine(startPoint, endPoint); // exprimé en Km.
 
WRInaute accro
Perso je ne vois pas l'interet d'un tel topic, regarde le dernier post, ce n'est deja plus du PHP, ensuite cela serait beaucoup plus confortable pour les internautes si tu créais directement ton site avec des bouts de code.
Mon [www] a commencé comme ca, je voulais juste une base perso des bouts de code que j'utilisais régulierement, puis c'est réellement devenu un service utilile à la communauté PHP.
 
WRInaute impliqué
KOogar a dit:
Perso je ne vois pas l'interet d'un tel topic, regarde le dernier post, ce n'est deja plus du PHP, ensuite cela serait beaucoup plus confortable pour les internautes si tu créais directement ton site avec des bouts de code.
Mon [www] a commencé comme ca, je voulais juste une base perso des bouts de code que j'utilisais régulierement, puis c'est réellement devenu un service utilile à la communauté PHP.

Si tu juges que ton site est beaucoup plus approprié dans ce cas vas-y.
 
WRInaute discret
Mumuri a dit:
Code:
function Est_Autorisé($DossierCourant,$Interdits){
    global $Goption;

    $drapeau = true;
    while ($drapeau && list(,$Dossier)=each($Interdits) ){
        if ( ComparaisonFichier($DossierCourant,$Dossier,$Goption))$drapeau = false;
    }
    reset($Interdits);
    return $drapeau;
}

Juste pour détail de programmation, dans ce genre de cas où on cherche un seul contre-exemple pour être fixé, on peut retourner dès la trouvaille de cet élément et se dispenser de parcourir la fin du tableau (pour rien, car rien ne peut faire changer $drapeau de valeur):
Code:
if(ComparaisonFichier($DossierCourant,$Dossier,$Goption)) return false;
Et en sortie de boucle placer un 'return true;' au lieu de $drapeau (on peut se passer entièrement de cette variable du coup).
 
WRInaute accro
mowmow a dit:
KOogar a dit:
Perso je ne vois pas l'interet d'un tel topic, regarde le dernier post, ce n'est deja plus du PHP, ensuite cela serait beaucoup plus confortable pour les internautes si tu créais directement ton site avec des bouts de code.
Mon [www] a commencé comme ca, je voulais juste une base perso des bouts de code que j'utilisais régulierement, puis c'est réellement devenu un service utilile à la communauté PHP.

Si tu juges que ton site est beaucoup plus approprié dans ce cas vas-y.

Dslé, loin de moi le but de te rendre nerveux, re dslé ; ) Bonne continuation :D
 
WRInaute passionné
C juste que les globales c pas la meilleure manière de programmer, c'est très gourmand en ressource mémoire, faut mieux passer la variable en paramètre à la fonction , ou encore mieux en référence.
 
WRInaute accro
Code:
function highlight($x,$var) {
//fonction qui met en gras le texte $x de la chaine $var
	if ($var != "") {
		$xtemp = "";
		$i=0;
		while($i<strlen($x)){
			if((($i + strlen($var)) <= strlen($x)) && (strcasecmp($var, substr($x, $i, strlen($var))) == 0)) {
			//this version bolds the text. you can replace the html tags with whatever you like.
				$xtemp .= "<b>" . substr($x, $i , strlen($var)) . "</b>";
				$i += strlen($var);
			}
			else {
				$xtemp .= $x{$i};
				$i++;
			}
		}
	$x = $xtemp;
	}
	return $x;
}

Argh !! en 1 ligne et sans ces <b> qui sont obsolètes !!!
Code:
eregi_replace($mots,"<strong>\\0</strong>",$chaine);
 
WRInaute accro
dadovb a dit:
C juste que les globales c pas la meilleure manière de programmer, c'est très gourmand en ressource mémoire, faut mieux passer la variable en paramètre à la fonction , ou encore mieux en référence.
la capacité de mémoire allouée est la même que ce soit une variable global ou non...tout dépend des informations que l'on met dans cette variable, simplement..

global signifie uniquement que la variable est la même ou que l'on soit (la portée de la variable) (fonction, sript, etc..), ce qui prend tout au plus 1 bit pour indiquer que la case mémoire sera la même pour chacune de ces même variables.
 
WRInaute accro
thierry8 a dit:
dadovb a dit:
C juste que les globales c pas la meilleure manière de programmer, c'est très gourmand en ressource mémoire, faut mieux passer la variable en paramètre à la fonction , ou encore mieux en référence.
la capacité de mémoire allouée est la même que ce soit une variable global ou non...tout dépend des informations que l'on met dans cette variable, simplement..

global signifie uniquement que la variable est la même ou que l'on soit (la portée de la variable) (fonction, sript, etc..), ce qui prend tout au plus 1 bit pour indiquer que la case mémoire sera la même pour chacune des ces même variables.

+1

Perso je pensais le contraire car j'etais persuadé que ca faisait une copie, mais en effet c'est la meme zone memoire pour la même variable
 
WRInaute impliqué
KOogar a dit:
mowmow a dit:
KOogar a dit:
Perso je ne vois pas l'interet d'un tel topic, regarde le dernier post, ce n'est deja plus du PHP, ensuite cela serait beaucoup plus confortable pour les internautes si tu créais directement ton site avec des bouts de code.
Mon [www] a commencé comme ca, je voulais juste une base perso des bouts de code que j'utilisais régulierement, puis c'est réellement devenu un service utilile à la communauté PHP.

Si tu juges que ton site est beaucoup plus approprié dans ce cas vas-y.

Dslé, loin de moi le but de te rendre nerveux, re dslé ; ) Bonne continuation :D

Je ne cherche aucune notoriété à travers ce post, c'est juste que sur les forums de developpez.net ca avait bien marché et il y avait des fonctions très intéressantes.
 
WRInaute accro
>> c'est juste que sur les forums de developpez.net ca avait bien marché et il y avait des fonctions très intéressantes.

re dslé, l'idée est en trés interressante et je compte suivre ce thread !! Je ne savais qu'il y aurait un sommaire mise a jour régulièrement. Le problème pour toi sera de voir quel bout de code tu crédites. Car deja celui ci est obsolète : -https://www.webrankinfo.com/forum/t/morceaux-de-scripts-php-bien-utiles-participez.58093/#558662
puisqu'il peut s'ecrire en 1 ligne comme je l'indique precedement. Je te laisse juge et te souhaite bonne route !!
 
WRInaute discret
créer et forcer le download d'un iso (suppose serveur linux)

Ca présuppose la création d'une arborescence de fichiers qui servira à la création de l'iso sur le filesystem. Dans mon cas les données sont majoritairement des symlink() dans le répertoire temporaire où l'iso est contruit, pour éviter des copies de fichiers (répertoire temporaire créé unique, avec un partie sortant de uniqid() par exemple, du genre $nomCD = uniqid('moncd_tmp_')).

Il faut mkisofs sur le serveur. Le CD créé est hybride rockridge/joliet, les éléments AUTORUN.inf et .exe sont cachés sous macOS et les applis mac (index.macapp et Demarrer - pour exemple) sont cachés sous windows

$nom_joli est le nom sous lequel l'image apparaîtra lors du download

Code:
function creerEtTélechargerIso($nomCD,$nom_joli){
          exec('mkisofs -f -J -R -hfs -hide-hfs AUTORUN.INF -hide-hfs "*.exe" -hide-joliet Demarrer -hide-joliet index.macapp -allow-leading-dots -o /tmp/'.$nomCD.'.iso /tmp/'.$nomCD);

          header('Content-Type: application/force-download');
          header("Content-Disposition: filename=".str_replace(" ","_",$nom_joli).".iso;");
          header("Content-Transfer-Encoding: binary");
          header("Content-Length: ".filesize("/var/www/tmp/".$nomCD.".iso"));
          readfile("/tmp/".$nomCD.".iso");
          exec("rm -f /tmp/".$nomCD.".iso");
          exec("rm -rf /tmp/".$nomCD);
}
Ca marche de la même manière pour créer des zip à télécharger directement (changer les ".iso" en ".zip", remplacer mkisofs par un truc comme "cd /tmp/$nomCD; zip -rq 0 ../$nomCD.zip *", penser à l'option "déréférencer les symlinks" si ce n'est pas le comportement par défaut.
(et si c'est gros, penser à set_time_limit(0); pour ne pas échouer du fait du dépassement le temps max d'exécution php)
 
WRInaute impliqué
KOogar a dit:
>> c'est juste que sur les forums de developpez.net ca avait bien marché et il y avait des fonctions très intéressantes.

re dslé, l'idée est en trés interressante et je compte suivre ce thread !! Je ne savais qu'il y aurait un sommaire mise a jour régulièrement. Le problème pour toi sera de voir quel bout de code tu crédites. Car deja celui ci est obsolète : -https://www.webrankinfo.com/forum/t/morceaux-de-scripts-php-bien-utiles-participez.58093/#558662
puisqu'il peut s'ecrire en 1 ligne comme je l'indique precedement. Je te laisse juge et te souhaite bonne route !!

Autant pour moi, je n'avais pas vraiment fait attention à cette fonction.
 
Nouveau WRInaute
magic corp. a dit:
Fonction de mise en forme de texte pour utilisation dans une URL (Par exemple pour de l'URL Rewriting)
Code:
...

Bonjour, j'ai essayé d'utiliser ce code mais voilà le résultat (en bas de page) :
http://www.virtual-games.org/v3/tests.php?id=1
Code:
Fatal error: Cannot redeclare convert_for_uri() (previously declared in /home.10.3/virtualg/www/v3/tests.php:46) in /home.10.3/virtualg/www/v3/tests.php on line 46

Voici mon code complet :
Code:
<?php require("config.inc.php");
mysql_connect($host,$username,$password);
mysql_select_db($bdd_name);

$id = $_GET['id'];
$sql = mysql_query("SELECT * FROM images LEFT JOIN jeux ON images.id_jeu = jeux.id WHERE id_article = '$id' AND type = 'vg'");

while($donnees = mysql_fetch_array($sql))
{

$support = $donnees['support'];

function convert_for_uri($support) {
  // Définition du séparateur
  define("SEPARATOR", "-");

  $tofind = "àáâãäåòóôõöøèéêëçìíîïùúûüÿñ"; // Lettre accentuées
  $replac = "aaaaaaooooooeeeeciiiiuuuuyn"; // Equivalant non accentué

  // Mise en minuscule + suppression des lettres accentuées par leur équivalant non accentué
  $support = strtr(strtolower($support),$tofind,$replac);

  // Remplacement de caractère non alphanumérique par un séparateur
  $support = ereg_replace("[^a-z0-9]", SEPARATOR, $support);

  // Suppression des doubles séparateurs
  while (strstr($support, SEPARATOR . SEPARATOR))
    $support = str_replace(SEPARATOR . SEPARATOR, SEPARATOR, $support);

  // Retour avec suppression d’un possible séparateur en fin de chaîne
  return(ereg_replace(SEPARATOR . "$", "", $support));
}

?> 
<img src="images_jeux/<?php echo $support ?>/<?php echo $donnees['id_jeu'] ?>/<?php echo $donnees['id_image'] ?>.gif" />
<?php } mysql_close(); ?>

Le mot qu'il faut mettre en force est : Xbox 360 .

Avez vous une idée du problème ?

Merci beaucoup, a455bcd9
 
WRInaute occasionnel
Je pense que ça vien du faite que tu déclares la fonction dans une boucle ...

Est ce mieux comme ça :
Code:
<?php require("config.inc.php");

function convert_for_uri($support) {
  // Définition du séparateur
  define("SEPARATOR", "-");

  $tofind = "àáâãäåòóôõöøèéêëçìíîïùúûüÿñ"; // Lettre accentuées
  $replac = "aaaaaaooooooeeeeciiiiuuuuyn"; // Equivalant non accentué

  // Mise en minuscule + suppression des lettres accentuées par leur équivalant non accentué
  $support = strtr(strtolower($support),$tofind,$replac);

  // Remplacement de caractère non alphanumérique par un séparateur
  $support = ereg_replace("[^a-z0-9]", SEPARATOR, $support);

  // Suppression des doubles séparateurs
  while (strstr($support, SEPARATOR . SEPARATOR))
    $support = str_replace(SEPARATOR . SEPARATOR, SEPARATOR, $support);

  // Retour avec suppression d’un possible séparateur en fin de chaîne
  return(ereg_replace(SEPARATOR . "$", "", $support));
}

mysql_connect($host,$username,$password);
mysql_select_db($bdd_name);

$id = $_GET['id'];
$sql = mysql_query("SELECT * FROM images LEFT JOIN jeux ON images.id_jeu = jeux.id WHERE id_article = '$id' AND type = 'vg'");

while($donnees = mysql_fetch_array($sql))
{

$support = $donnees['support'];

?>
<img src="images_jeux/<?php echo $support ?>/<?php echo $donnees['id_jeu'] ?>/<?php echo $donnees['id_image'] ?>.gif" />
<?php } mysql_close(); ?>
 
Nouveau WRInaute
Bonjour, merci d'avoir répondu aussi vite !

Il n'y a plus le message d'erreur, mais la fonction ne fonctionne pas, c'est à dire que le mot Xbox 360 n'est pas transformé, et il reste comme il est.

a455bcd9
 
WRInaute occasionnel
Pour ça il faut utiliser la fonction et pas uniquement la déclarer.
Code:
...
while($donnees = mysql_fetch_array($sql))
{

$support = convert_for_uri($donnees['support']);

?>
...
Ou
Code:
while($donnees = mysql_fetch_array($sql))
{
  echo('<img src="images_jeux/' . convert_for_uri($donnees['support']) . '/' . $donnees['id_jeu'] . '/' . $donnees['id_image'] . '.gif" />');
} 
mysql_close(); ?>
 
WRInaute discret
salut

Pour ma part, je pense que ce thread devrait être purement et simplement supprimé!

95% (j'ai pas osé dire 100% ...il y en a un de bien je crois) des codes proposés ne valent rien et ce, pour différentes raisons :

* Utilisation de fonctions obsolètes
* Optimisation nulle : certains codes de dix lignes s'ecrivent en une seule
* le pire : certains contiennent des trous de sécurité

Et j'en passe et des meilleurs ....

Je sais que je vais pas me faire que des potes sur ce coup là, mais donner de mauvais codes à des débutants (ou pas, j'ai même vu un "spécialiste" utiliser eregi_replace ...) n'est pas la bonne solution.
Certes, wai, ça marche (et encore peut-être pas tous) ... après on s'étonne sur les forums spécialisés dans le langage PHP de voir de telles inepties .... pff

efin bref, amusez-vous bien ...

fab
 
Nouveau WRInaute
un homme charmant sous tout rapports.....

Heureusement que le titre du thread est "bouts de code ultra optimisés super secure de la mort pour se palucher sur du php 7.4 rc3" et pas "bouts de code utiles"

désolé du freepost, mais la ca me grattait
 
WRInaute discret
Heureusement que le titre du thread est "bouts de code ultra optimisés super secure de la mort pour se palucher sur du php 7.4 rc3" et pas "bouts de code utiles"

Tout à fait d'accord avec toi. C'est juste que j'en vois tellement passer tous les jours avec des "aye aye aye mon site s'est fait hacké" , "pourquoi ma page met trente minutes à se charger ?" .... après, vous faites bien ce que vous voulez.

fab
 
Nouveau WRInaute
ok, je vois ton point de vue, seulement reconnait que cetait un peu brutal comme maniere de l'exposer ;)

bref, parenthèse close.
 
WRInaute occasionnel
Tres bonne comme idée .voici ma petite contribution
Code:
 * Enlève les accents
 * 
 * @return string
 */
function sansaccent($chaine)
{
   return strtr($chaine,
      'àâäåãáÂÄÀÅÃÁæÆçÇéèêëÉÊËÈïîìíÏÎÌÍñÑöôóòõÓÔÖÒÕùûüúÜÛÙÚÿ',
      'aaaaaaaaaaaaaacceeeeeeeeiiiiiiiinnoooooooooouuuuuuuuy');
}


edit dd32 : ajout bbcode
 
WRInaute accro
Un explorateur de fichier parfois bien pratique :

Code:
<?
//Explorer PHP By Scorpion
function present($chaine,$mot,$sep)
{
    $tab=split($sep,$chaine);
    $rep=FALSE;
    for ($j=0;$j<count($tab);$j++)
    {
        if ($tab[$j]==$mot) {$rep=TRUE;break;}
    }
    return $rep;
}
function affperm($fichier)
{
    $perm=fileperms($fichier);
    $nbr1=substr($perm,-1,1);
    return(true);
}
function affperm2($fichier)
{
    $perm=fileperms($fichier);
    $nbr1=substr($perm,-1,1);
    $r="-";$w="-";$x="-";
    if ($nbr1>=6 and $nbr1<=9)
        $r="r";
    if ($nbr1==4 or $nbr1==5 or $nbr1==8 or $nbr1==9)
        $w="w";
    if ($nbr1==3 or $nbr1==5 or $nbr1==7 or $nbr1==9)
        $x="x";
    return $r." ".$w." ".$x;
}
function affdate($fichier)
{
    $datef=filemtime("$fichier");
    if (date("d/m/Y",$datef)==date("d/m/Y",time()))
    {
        $datef="Aujourd'hui à".date(" H:i:s",$datef);
    }
    else
    {
        $datef=date("d/m/Y à H:i:s",$datef);
    }
    return $datef;
}
function afftaille($t)
{
    if ($t>=10000 and $t<1000000)
    {
        $t=(int)($t/1000);
        $tlib="$t Ko";
    }
    else if ($t>1000000 and $t<1000000000)
    {
        $t=(int)($t/10000);
        $t=$t/100;
        $tlib="$t Mo";
    }
    else if ($t>1000000000)
    {
        $t=(int)($t/10000000);
        $t=$t/100;
        $tlib="$t Go";
    }
    else
    {
        $tlib="$t Bytes";
    }
    return $tlib;
}
function autoinstall($rep)
{
    @copy("index.php",$rep."/index.php");
}
$tab_ext=array(
        array("PHP","#006699","Fichier PHP"),
        array("PHPS","red","Code source"),
        array("HTM,HTML","#00219A","Fichier HTML"),
        array("TXT","#000000","Fichier Texte"),
        array("DOC","#0066FF","Fichier Word"),
        array("EXE","#6600EE","Fichier exécutable"),
        array("ZIP,RAR,TAR,GZ,TGZ","#FF6600","Fichier compressé"),
        array("JPG,JPEG,GIF,BMP","#00BBFF","Image"),
        array("MPG,MPEG,AVI","#008000","Vidéo"));
if ($action=="install" and !empty($rep))
{
    if (!@copy("index.php",$rep."/index.php"))
    {
        echo "<FONT size=1 face=verdana color=red><B>ATTENTION</B> : ERREUR DANS L'INSTALLATION DU SCRIPT !! VERIFIEZ VOS DROITS SUR LES FICHIERS...</FONT><BR><BR>";
    }
}
echo "<HTML><HEAD><STYLE>A {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {TEXT-DECORATION: underline}TD{FONT-FAMILY:verdana;FONT-SIZE:10}BODY{FONT-FAMILY:verdana;FONT-SIZE:10}</STYLE><TITLE>Explorer PHP</TITLE></HEAD><BODY>";
$mydir=dir("."); // récupère le répertoire du script
$mydir->read();
$rep=""; //variable contenant les répertoires
$fic=""; //variable contenant les fichiers
$rep=$rep."<TR height=20><TD><FONT FACE=wingdings size=4>1</FONT></TD><TD><A HREF=\"..\"><FONT color=green>..</FONT></A></TD><TD>&nbsp;</TD></TR>\n";
while($entry=$mydir->read()) // on lit chaque fichier ou répertoire jusqu'à ce qu'il n'y en ai plus
{
    
    if (($entry!="index.php" and substr($entry,0,1)!="."))
    {
        if (filetype($entry)=="dir") // on teste si le nom de fichier est un répertoire ou non
        {
            $perm=fileperms("$entry");
            $nbr1=substr($perm,-1,1);
            $perm=fileperms("$entry/index.php");
            $nbr2=substr($perm,-1,1);
            if (filesize("index.php")!=filesize("$entry/index.php") && affperm("$entry"))
            {
                $link="<A HREF=\"index.php?action=install&rep=$entry\"><FONT color=#0B163D face=wingdings size=4>:</FONT></A>";
            }
            else
            {
                $link="<FONT FACE=wingdings size=4 color=red>ý</FONT>";
            }
            if (filesize("index.php")==filesize("$entry/index.php"))
                $link="";
            $perm=affperm2($entry);
            $rep=$rep."<TR height=20><TD><FONT FACE=wingdings size=4>0</FONT></TD><TD><A HREF=\"$entry/\"><FONT color=green>$entry</FONT></A></TD><TD>$link</TD><TD align=center>N.A</TD><TD>&nbsp;</TD><TD>Répertoire</TD><TD>&nbsp;</TD><TD align=center>$perm</TD><TD>&nbsp;</TD><TD>".affdate($entry)."</TD></TR>\n";
        }
        else
        {
            $tlib=afftaille(filesize($entry)); // convertion de la taille du fichier
            $extention2=substr($entry,-1,1); // prends le dernier caractère (pour voir si fichier est un backup)
            $extention=strtoupper(str_replace(".","",strrchr($entry,".")));
            $couleur="#545A72";
            $description="Fichier $extention";
            for ($i=0;$i<count($tab_ext);$i++)
            {
                if (present($tab_ext[$i][0],$extention,","))
                {
                    $couleur=$tab_ext[$i][1];
                    $description=$tab_ext[$i][2];
                    break;
                }
            }
            if ($extention2=="~")
            {
                $couleur="#545A72";
                $description="Fichier Backup";
            }
            $perm="<FONT FACE=wingdings size=4 color=red>ý</FONT>";
            if (is_writable("$entry"))
            {
                $perm="<FONT FACE=wingdings size=4 color=green>þ</FONT>";
            }
            $perm=affperm2($entry);
            $fic=$fic."<TR height=20><TD align=center><FONT FACE=wingdings size=4 COLOR=$couleur>2</FONT></TD><TD><A HREF=\"$entry\"><FONT COLOR=$couleur>$entry</FONT></A></TD><TD width=20>&nbsp;</TD><TD><FONT COLOR=$couleur> $tlib</FONT></TD><TD width=20>&nbsp;</TD><TD><FONT COLOR=$couleur>$description</FONT></TD><TD width=20>&nbsp;</TD><TD align=center>$perm</TD><TD width=20>&nbsp;</TD><TD><FONT COLOR=$couleur>".affdate($entry)."</FONT></TD></TR>\n";
        }
    }
}
$mydir->close();
echo "<TABLE>";
echo "<TR><TD colspan=3>&nbsp;</TD><TD align=center>Taille</TD><TD>&nbsp;</TD><TD align=center>Description</TD><TD>&nbsp;</TD><TD align=center>Permissions</TD><TD>&nbsp;</TD><TD align=center>Dernier accès</TD></TR>";
echo "$rep$fic</TABLE></BODY></HTML>"; // on affiche les répertoires, puis les fichiers.
$t=afftaille(diskfreespace("/"));
echo "<BR><BR><P align=center>.: Explorer PHP | Espace disque libre : $t :.";
?>
 
WRInaute impliqué
fablezouave a dit:
* Utilisation de fonctions obsolètes
* Optimisation nulle : certains codes de dix lignes s'ecrivent en une seule
* le pire : certains contiennent des trous de sécurité

Et j'en passe et des meilleurs ....

ah ben non ça c'est dommage, que tu en passes.

au contraire, à mon avis, un des intérêts de ce post, ça peut être d'attirer l'attention des gens sur les failles/faiblesses/erreurs de leur code, leur permettre de progresser....

personne ne s'attend à voir naître ici un nouveau Codes-Sources, il s'agit plus de comparer des façons de coder, d'en discuter... et pourquoi pas de corriger le code des autres :wink:
 
WRInaute discret
Quelques fonctions que je me suis créé, bien souvent en catastrophe et je ne suis pas revenu dessus !

Ahh ben oui : n'en déplaise à certains... on a pas toujours le temps d'optimiser (dans le monde du travail) lorsque la deadline est courte, surtout quand on est seul sur le projet.

Mais comme le dit La chaise sauvage: libre à vous de les commenter, je ne vous les donne pas comme étant des perles de code, mais elles m'ont bien dépanné et j'espère qu'elles vous seront utiles. ;)

Code:
// Executer un fichier PHP et le placer dans le buffer
// (sorte de file_get_contents permettant l'execution de php dans le fichier)
function inc2buffer($file) {
   ob_start();
   include($file);
   $output = ob_get_contents();
   ob_end_clean();
   return $output;
}

// Obtenir l'extension d'un fichier
function getExtension($file){
	$len = strlen($file);
	$pos = strrpos($file, ".");
	$type = substr($file, $pos + 1, $len);
	return strtolower($type);
}

// crypter une adresse email
function cryptEmail($mail){
	$ret_mail="";
	$len=strlen($mail);
	for($x=0;$x<$len;$x++){
		$ord=ord(substr($mail,$x,1));
		$ret_mail.="&#$ord;";
	}
	return $ret_mail;
}

// Enlever tous les accents
// Celle là n'est pas de moi mais il me semble l'avoir récupérée sur Nexen dans mes débuts, ça fais un bail que je la traine :)
function stripAccent($text) {
	$out = strtr($text,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");
	return $out;
}
 
WRInaute occasionnel
A propos de la fonction debug de lachaisesauvage....

Petite amelioration (utilisation de display (none/block) a la place de visibility :

Code:
function debug($obj,$visible=0) { 
   $v = ($visible==1) ?  'block' : 'none'; 
   echo '<a href="#" onclick="document.getElementById(\'debug\').style.display=\'block\'" id="switch">debug</a> 
   <pre id="debug" style="visibility:'.$v.'"><a href="#" onclick="document.getElementById(\'debug\').style.display=\'none\'">[X]</a> 
   <code>'; 
   print_r($obj); 
   echo '</code></pre>'; 
}
 
WRInaute passionné
Select dynamique : table SQL

Pour construire un <select> dynamique provenant de n'importe quelle table (client, fournisseur, département, pays, critère, rubrique etc...) de votre base de données.

Voilà comment je fais

Dans une fichier séparé, afin d'appeler ensuite ces fonctions par un require_once();


Code:
			function selectTable($nomtable, $where = NULL, $order = NULL)
			{
				$sql = "SELECT * FROM $nomtable";
				if ( $where !== NULL ) $sql .= " WHERE $where";
				if ($order !== NULL)$sql.=" ORDER BY $order ";
				
				$query=mysql_query($sql);
				
				$ret = array();
				while ( $donnee = mysql_fetch_assoc($query)) 
				{
					$ret[] = $donnee;
				}
				return $ret;
			}
			
			function sqlSelect($sqlDonnee, $nomCol, $valCol)
			{
				for($i = 0 ; $i<count($sqlDonnee) ; $i++) 
				{
					$selectDonee["name"][$i] = $sqlDonnee[$i][$nomCol];
					$selectDonee["value"][$i] = $sqlDonnee[$i][$valCol];
				}
			return $selectDonee;
			}
			
			function htmlSelect($nom, $options, $selected = NULL, $css = NULL)
			{
				$select  = "<select name=\"".htmlentities($nom)."\"";
				if ( $css !== NULL )
					$select .= " $css>";
				else
					$select .= ">";

				for($i = 0 ; $i<count($options["name"]) ; $i++) 
				{
					if ( $selected !== NULL && $selected == $options["value"][$i] )
						$select .= "<option value=\"".$options["value"][$i]."\" selected=\"selected\">".$options["name"][$i]."</option>\n";
					else
						$select .= "<option value=\"".$options["value"][$i]."\">".$options["name"][$i]."</option>\n";
				}
				$select .= "</select>\n";

				return $select;
			}

Et voilà c'est tout bête, bien sûr j'ai omis les conditions d'erreur afin d'éclaircir le script...

Ensuite on peut construire nos <select> désirés n'importe où et ça prend seulement 3 lignes de code :-D!
exemple, je veux un <select> de ma table pays avec par défaut la France en "selected" qui est l'id 72 dans la base de données :

Code:
			$paysSelect = isset($_POST["pays"]) ? ($_POST["pays"]) : ("72");
			
			$selectPays=selectTable("pays");
			$pays=sqlSelect($selectPays,"nom","id");			
			echo htmlSelect("id", $pays, $paysSelect); // on construit notre <select>


l'avantage, c'est que ce <select> est dynamique, c'est à dire que si on ajoute, supprime etc... un champ, le tout sera automatiquement mis à jour sur vos pages , elle n'est pas belle la vie :-D
 
WRInaute discret
Voici le mien, il permet de formatter une date timestamp, anglaise avec les minutes et secondes ou anglaise sans heures vers le format français :
Code:
function date_formatter($date)
{
if($date == '0000-00-00') return '00/00/0000';
elseif($date == '0000-00-00 00:00:00') return '00/00/0000 à 00h00';

if(($len_date=strlen($date)) == 10)
{
	return date('d/m/Y',strtotime($date));
}
elseif($len_date == 19)
{
	return date('d/m/Y à H\hi',strtotime($date));
}

return 0;
}
 
Nouveau WRInaute
Re: créer et forcer le download d'un iso (suppose serveur linux)

sunflower a dit:
Ca présuppose la création d'une arborescence de fichiers qui servira à la création de l'iso sur le filesystem. Dans mon cas les données sont majoritairement des symlink() dans le répertoire temporaire où l'iso est contruit, pour éviter des copies de fichiers (répertoire temporaire créé unique, avec un partie sortant de uniqid() par exemple, du genre $nomCD = uniqid('moncd_tmp_')).

Il faut mkisofs sur le serveur. Le CD créé est hybride rockridge/joliet, les éléments AUTORUN.inf et .exe sont cachés sous macOS et les applis mac (index.macapp et Demarrer - pour exemple) sont cachés sous windows

$nom_joli est le nom sous lequel l'image apparaîtra lors du download

Code:
function creerEtTélechargerIso($nomCD,$nom_joli){
          exec('mkisofs -f -J -R -hfs -hide-hfs AUTORUN.INF -hide-hfs "*.exe" -hide-joliet Demarrer -hide-joliet index.macapp -allow-leading-dots -o /tmp/'.$nomCD.'.iso /tmp/'.$nomCD);

          header('Content-Type: application/force-download');
          header("Content-Disposition: filename=".str_replace(" ","_",$nom_joli).".iso;");
          header("Content-Transfer-Encoding: binary");
          header("Content-Length: ".filesize("/var/www/tmp/".$nomCD.".iso"));
          readfile("/tmp/".$nomCD.".iso");
          exec("rm -f /tmp/".$nomCD.".iso");
          exec("rm -rf /tmp/".$nomCD);
}
Ca marche de la même manière pour créer des zip à télécharger directement (changer les ".iso" en ".zip", remplacer mkisofs par un truc comme "cd /tmp/$nomCD; zip -rq 0 ../$nomCD.zip *", penser à l'option "déréférencer les symlinks" si ce n'est pas le comportement par défaut.
(et si c'est gros, penser à set_time_limit(0); pour ne pas échouer du fait du dépassement le temps max d'exécution php)

Est-ce que ça marche
 
Discussions similaires
Haut