Aide - Recherche - Membres - Calendrier
Version complète : Php ++
La Communauté TitaXium > Service Communication > Espace Developpement
Pages : 1, 2
SX
Dans le soucis de lancer des topics interressant pour la division Développement du TitaXium Entertainement, j'appelle tous les développeurs PHP habitués du coin à se réunir sur ce topic pour parler de quelque chose d'important :

Les petits plus de vos scrips PHP

Nous partirons du fait que la plupart d'entre nous utilisent PHP pour l'élaboration de sites Webs.

Le thême est simple : Partager les petits bouts de code qui vous facilitent la vie.

Par exemple :
:fleches: Le test d'une adresse Email
:fleches: Une fonction pour sécuriser une chaîne
:fleches: Un générateur simple de nombres aléatoires
:fleches: Un remplacant au gestionnaire de sessions PHP
:fleches: etc....

Les bouts de codes pourront être commentés, améliorés, mais jamais méchamment critiqué.
Pensez à utiliser les balises de CODE pour une meilleur lisibilité.

Je serais responsable de la tenue de ce topic.
Je place toute ma confiance en Seoxys, Adweb et ED pour une modération propre et sans bavure (SVP).

SMS Interdit

Bonsoir.
SX
Je commence smile.gif

Il arrive fréquemment que l'on doive tester la forme d'une adresse Ip. Il existe bien sûr les fonctions de recherche par expressions régulières (preg et ereg) mais qui consomme beaucoup de ressources pour pas grand chose. Il existe une fonction qui transforme une chaîne de caractère de type Ip en entier non signé. Si l'Ip de départ était correcte (entre 0.0.0.0 et 255.255.255.255) alors sa réciproque la renverra.

Code
function is_ip($string) {
    if(ip2long(long2ip($string)) == $string)
         return true;
    return false;
}


Il arrive aussi que l'on vérifie la forme d'une chaîne représentant une classe d'Ip, si on est réticent à l'utilisation systématique et gorumande des Expreg, voici une alternative.
Exemple : 127.0.0.1/8

On coupe donc la chaîne au niveau du / et on vérifie chacun des côtés.

Code
function is_classIp($classIp) {
    $array = explode('/', $classIp);
    if(count($array) == 2 && is_ip($array[0]) && ((int) $array[1]) <= 32 && ((int) $array[1]) >= 0)
         return true;
    return false;
}


¤dit : Comme vous l'avez remarqué je code toujours en anglais depuis 5 mois tongue.gif
nonos
Pour vérifier si une email est valide :
Code
<?PHP
if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $_POST['mail']))
{
echo'email valide';
}
else
{
echo'email invalude';
}
?>

A vous après de créer votre formulaire.
SX
Nonos, tu peux perfectionner ton masque en empêchant l'adresse de commencer par autres chose qu'une lettre ou un chiffre smile.gif

Moi j'utilise le masque suivant, mais je crois qu'il n'empeche pas les domaine de moins de 2 caractères comme le tient.

Code
`^\w([-_.]?\w)*@\w([-_.]?\w)*\.([a-z]{2,4})$`i


Il faudrait aussi tester l'existence du domaine mais je n'ai pas çà sous la main
nonos
ok :mum:

Afficher la date/heure

Code
<?PHP
echo ' le '.date('d').'/'.date('m').'/'.date('Y').' à '.date('H').'h'.date('i').'';
?>
mOg
Et pourquoi tu n'utilise pas date() complètement nonos ?

Code
<?PHP
  echo date("\le d-m-Y à H:i");
?>
SX
Nonos ne te décourrage pas continues à poster, on est des chiants avec mOg :x
nonos
Citation (SX @ mercredi 03 août 2005 à 21h12)
Nonos ne te décourrage pas continues à poster, on est des chiants avec mOg :x
*

c'est comme sa qu'on apprend :innocent:


afficher un ombre aléatoire entre 0 et 99999

Code
<?PHP
$nbr_aleatoire= rand(0,99999);
echo $nbr_aleatoire;
?>
nonos
exploser une chaine de caractère :
Citation
<?PHP
$chaine_explode='lol,mdr,ploutch,plaf';//la chaine de caractères
$chaine_explode= explode(',',$chaine_explode);
echo "$chaine_explode[0] $chaine_explode[3] $chaine_explode[1] $chaine_explode[2] ";//on affiche les différents morceau de la chaine de caractères

?>
Digwele
Qui veut faire un script pour transporter les données d'un .xml dans une base sql ? smile.gif
SX
Ton générateur est tout à fait juste mais à ne pas utiliser en cryptographie tongue.gif

Digwele donne la forme de ton XML et la structure de ta table.
Je veux bien mais avec DOM (ou SimpleXML si ton XML est pas trop complexe) et PHP5.
Digwele
PHP5 ( SimpleXML ) j'avais pensé. Ensuite pour faire simple, une table style :

Citation
Champs :

NOM - PRENOM - ADRESSE - NUM


Et donc un xml comme ça :

Code
<?xml version="1.0" encoding="UTF-8"?>

<annuaire>
   <contact>
       <nom>Dupont</nom>
       <prenom>Jean</prenom>
    <adresse>12 route de Gencay</adresse>
       <numero>0606060606</numero>      
   </contact>

   <contact>
       <nom>Durant</nom>
       <prenom>Henry</prenom>
    <adresse>Pas loin de chez moi</adresse>
       <numero>0606060606</numero>      
   </contact>

</annuaire>
SX
Ne t'embête pas avec DOM dans ce cas.

Code
$xml = simplexml_load_file('fichier.xml');
while($xml->contact) {
$sql->query("INSERT INTO `table` (NOM, PRENOM, ADRESSE, NUM) VALUES ('{$xml->contact->nom}', '{$xml->contact->prenom}', '{$xml->contact->adresse}', '{$xml->contact->num}');");
}


Je n'ai pas testé, c'est fait rapidement sans debuggage mais je reviens demain.
Bonne nuit

J'ai mis $sql pour simplifier le script, tu sais envoyer une requete j'en doute pas tongue.gif
Nephilim
C'est tout bete comme code, mais c'est plus une astuce a appliquer tout le temps sur un site a plus de 5 pages.

Creer une page connect.php et inserez y ce code :

Citation
<?php
$db = mysql_connect('localhost', 'login', 'pass')  or die('Erreur de connexion '.mysql_error());

   mysql_select_db('nom_de_la_base',$db)  or die('Erreur de selection '.mysql_error());
?>



Renseignez y vos identifiants de connection a la base MySql.

Pour vous y connecter a partir d'une page :

Code
include('connect.php');


Ceci vous connecte a la base de donnée directement.
L'avantage est que vous pouvez spécifé automatiquement votre emplacement de base de donnée, sans avoir a tout reediter. (sympathique pour le developpement local et la mise en prod)

Voila, donc ceci est juste ma méthode de travail que je tenais a faire partager histoire d'apporter ma pierre smile.gif
Zorro56
Merci neph mais pas de BBCode dans les balises Unicode smile.gif

-Admettons que header.php contienne votre header et une barre de séparation en dessous , pour que la page ait un title "dynamique" , je mets ce code dans le <head> de header.php :
Code
<?php
if (isset($titrepage)) {  
 echo $titrepage
}
?>


Et dans votre fichier de base :
Code
<?php
$titrepage="Ma page qui utilise un include";

include ("header.php");

?>

Et votre page aura le title "Ma page qui utilise un include" .
Je mets sers aussi de cette technique pour mettre des choses ( scripts javascript apr exemple ) entre les balises <head></head> avec ma balise $entrehead smile.gif .

SX ou M0G me corrigeront peut être mais cette astuce est très pratique cool.gif
elf
Neph'

je metterais plutot require('connect.php')

Nonos pour la verif' de mail tu as pas mis le checkdns()...

Neph' je remplace les code par quote pour que le bbcode marche...
elf
pour la verif' de mail:

Code
function test_mail($mail){
if(preg_match('!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!', $mail)){if(checkdnsrr(preg_replace('!^[a-z0-9._-]+@([a-z0-9._-]{2,}\.[a-z]{2,4})$!', '$1', $mail))){return true;}else{return false;}}else{return false;}
}
ED
Sujet epinglé smile.gif
tyx
Si tu ne fais pas de retour spécifique selon le résultat de tes 2 conditions, tu peux les réunir en une seule : >

A noter que checkdnsrr ne fonctionne que sur les machines unix donc remballez les easyphp pour les tests.
Pour windows, il faut passer par la fameuse commande "nslookup" grâce la fonction exec comme par exemple cette fonction tirée de php.net
Code

function myCheckDNSRR($hostName, $recType = '')
{
if(!empty($hostName)) {
  if( $recType == '' ) $recType = "MX";
  exec("nslookup -type=$recType $hostName", $result);
  // On cherche une ligne commençant par l'hôte spécifiée
  // Si il y en a une, on peut confirmer l'existence.
  foreach ($result as $line) {
    if(eregi("^$hostName",$line)) {
      return true;
    }
  }
  // Sinon, on peut en déduire que le domaine n'existe pas
  return false;
}
return false;
}


Peut-être utile pour des tests en local mais bien penser à la remplacer par checkdnsrr lors du passage en ligne :>
elf
Tu as raison tyx.

J'ai tiré ce code de ma première version de mon form de contact. comme la dernière est dans les sujets cachés
SX
Voici un code qui m'a fréquemment servi jusqu'à mon utilisation systématique de XML/XSLT.
C'est un gestionnaire d'inclusion simple, donc à placer à l'endroit précis où devra se situer le contenu. Il y a quelques paramètres à définir comme l'emplacement des pages par rapport au script, la variable GET renseignant l'inclusion, le nom de la page par défaut et le nom de la page d'erreur si le fichier est introuvable.
Pourquoi ce script est-il long ? Il est sécurisé, pratique et permet la hiérarchie dans le dossier des pages.
Exemple : index.php?p=articles
index.php?p=articles/php/sessions -> pages/articles/php/sessions.php

Cela peut pour servir dans de nombreux cas, en particulier les petits site de contenu.

Code
<?php

/*---------------------------------
Gestionnaire d'inclusions PHP v1.2
Powered by SX (TitaXium.com - XMLFrance.com)
Compatibilité PHP 5 : OK
Extensions nécessaire : PCRE (par défaut)
----------------------------------*/

/* Paramètres --------------------*/
$pages = "pages";  // Dossier contenant les pages
$url = "p";    // Variable de l'url
$defaut = "accueil";    // Page par défaut (généralement l'accueil)
$erreur = "404";  // Page d'erreur, fichier introuvable
/* ------------------------------ */

$url = preg_split('`[/]+`',$_GET[$url]);
$fichier = $pages;
if($url[0]) {
    for($i=0; $i<count($url); $i++) {
         if(preg_match("`^([a-z0-9-_]+)$`i",$url[$i]) && $stop==0) {
              $fichier .= "/".$url[$i];
         } else {
              $stop=1;
              break;
         }
    }
    $fichier .= ".php";
    if(file_exists($fichier) && $stop==0) {
         include($fichier);
    } else {
         include($pages."/".$erreur.".php");
    }
} else {
    include($pages."/".$defaut.".php");
}

?>
Mnz
vous me faite peur la avec tout vos chiffres et tous vos caracteres chelou!
nonos
Citation (Mnz @ jeudi 04 août 2005 à 13h12)
vous me faite peur la avec tout vos chiffres et tous vos caracteres chelou!
*

ben sauve toi :devil:
Mekza
SX ton code y a plus simple la tu nous a sortis une version "Grand Public"
SX
Mekza plus simple sécurisé et hierarchie je veux bien voir :innocent:
En même temps c'est du procédurale là.
Mekza
C'est la meme chose que toi sans tes 4 variables smile.gif et un eu moins long smile.gif
Code
<?php
$page=$_GET['p'];

if(!$page){
    include("home.php");
} elseif(preg_match("`^([a-z0-9]+)$`i",$page) && file_exists("".$page.".php")){
    include("".$page.".php");
} else {
    include("404.php");
}



?>
elf
seul défaut:

il gère que le .php
SX
Bof ce n'est pas un défaut il suffit de changer 3 caractères dans le script.
Mekza ton script permet pas la hiérarchie.
SX
Générateur d'identifiant unique smile.gif

Code
$id = str_shuffle(md5(microtime()));
nonos
Citation (SX @ vendredi 05 août 2005 à 21h28)
Générateur d'identifiant unique smile.gif

Code
$id = str_shuffle(md5(microtime()));

*

pas bête tongue.gif
Forcement unique ??? huh.gif
SX
Unique à 100% c'est impossible.
Mais étant donné qu'avec le même microtime que le voisin, et donc le même md5() est quasiment impossible. Si ce md5 est mélangé c'est encore pire.
Avoir exactement la même chaîne relève du challenge, faut un bol de cocu (pire que le loto et de loin).
nonos
Citation (SX @ vendredi 05 août 2005 à 22h01)
Unique à 100% c'est impossible.
Mais étant donné qu'avec le même microtime que le voisin, et donc le même md5() est quasiment impossible. Si ce md5 est mékangé c'est encore pire.
Avoir exactement la même chaîne relève du challenge, faut un bol de cocu (pire que le loto et de loin).
*

Oui effectivement c'est difficile.
J'ai cependant une question :
pour le script de newsletter que j'ai réalisé, lors de l'inscription il y a une demande de confirmation par mail (pour s'assurer l'existance de la personne).
Dans ce mail, il y a donc un lien pour valider l'inscription de type :
index.php?inscription=21df54dfb215df4
Pour le code de l'inscription (la fin de l'url) j'ai pris l'email, et j'ai utilisé md5() dessus.
Je ne voulais pas m'amuser à créer un systeme pour génerer une chaine de caractere aléatoire, et vérifier si elle exsiste, alors j'ai utilisé tout simplement md5. Comme je vérifie lors de l'inscription si l'email exsiste deja, il ne peut pas avoir 2* le meme code.

Je voudrai savoir si ma solution est vraiment bonne, ou si il vaut mieux générer un nombre alléatoire ??? (je ne vois pas pourquoi, mais je préfère demander).
SX
Il est facile de tester cette évantualité.
Si je veux crèer un faux-compte, j'ai juste à encoder mon adresse email en md5.
Ajoute un grain de sel c'est mieux.
Code
md5($email."Sel_Iodé");
Zorro56
Je trouve que ce topic est une très très bonne idée wink.gif .
Ce ne sont pas des scripts entiers , juste des petits bouts de codes , des fonctions que l'on explique , ce qui instruit chacun ( sauf SX qui sait déja tout ) .
elf
Euh je dirais même plus:

Code
$id = str_shuffle(sha1(microtime().rand(1,99)));


ou pourquoi pas:

Code
$id = str_shuffle(sha1(md5(microtime().rand(1,99))));


Le sha1 est plus sécurisé que le md5. Mieux vaut prendre l'habitude d'utiliser le sha1
Digwele
Trouvé sur la doc officielle :

Citation
Source code to create SSHA passwords...

public function HashPassword($password)
{
  mt_srand((double)microtime()*1000000);
  $salt = mhash_keygen_s2k(MHASH_SHA1, $password, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
  $hash = "{SSHA}".base64_encode(mhash(MHASH_SHA1, $password.$salt).$salt);
  return $hash;
}

Source code to validate SSHA passwords...

public function ValidatePassword($password, $hash)
{
  $hash = base64_decode(substr($hash, 6));
  $original_hash = substr($hash, 0, 20);
  $salt = substr($hash, 20);
  $new_hash = mhash(MHASH_SHA1, $password . $salt);
  if (strcmp($original_hash, $new_hash) == 0)
    ... do something because your password is valid ...
  else
  echo 'Unauthorized: Authorization has been refused for the credentials you provided. Please login with a valid username and password.';
  ... be sure to clear your session data ...
}
SX
D'accord mais utiliser autant de ressources pour un identifiant de session...
Seoxys il y a plus de possibilité en SHA1 mais la clé est plus longue.
Et je tiens à ma database.

D'autant plus que je ne hashe pas une information critique.
SX
[Mode vacances SX]

Le Staff Développement prend le relais smile.gif

Bonnes vacances à tous.
Zorro56
Bonnes vacances SX wink.gif Essaie de ne pas trop penser au XML et autres DOM tongue.gif
.
PS : Si quelqu'un veut savoir comment faire un flux rss a partir d'un forum IPB , qu'il me le dise j'ai un script simple de 36 lignes wink.gif , qu'un débutant peut comprendre .
Digwele
Colorie-le et met le sur ton serveur, puis passe-nous le lien, ça peut servir smile.gif
mOg
Citation (SeoxyS @ samedi 06 août 2005 à 10h35)
Le sha1 est plus sécurisé que le md5. Mieux vaut prendre l'habitude d'utiliser le sha1
*

Les deux sont cassables donc pas de plus sécure que l'autre.
elf
le md5 à été cassé bien plus de fois que le sha1...

cela dit une sécurité absolue est impossible
ED
o_o

Euh vous appelez quoi casser?

Parce que le md5 n'a été cassé qu'une fois et c'etait une collision pas du brute force.
tyx
Nan nan ED, le md5 a été cassé sans brute force l'année dernière.

Quand à la meilleur sureté du sha1, c'est surtout qu'il est plus récent. Mais il finira comme le md5, et comme tous les algos de hashages.
ED
Citation (ED @ dimanche 07 août 2005 à 17h07)
Parce que le md5 n'a été cassé qu'une fois et c'etait une collision pas ud brute force.
*

C'est bien ce que je disais, faire une collision c'est quand meme différent que de casser un code avec un brute force, l'objectif est différent.
tyx
au temps pour moi, j'ai lu de travers :x
Mekza
la POO avec php quelqu'un fait une demo ? smile.gif
Zorro56
Cela m'intéresse aussi ! Et commenté s'il vous plait smile.gif
elf
Oui pourquoi pas...
Digwele
Copier-Coller de ma vieille classe mysql :

Code
<?php

class mysql { # Classe mysql

    var $id; # Id de la connection en cours
    var $error; # Les erreurs
    var $num_error; # Le numéro de l'erreur
    
    function connect($host, $user, $mdp, $dbname) { # Connexion à la bdd
    
 $this->error = '';
 $this->num_error ='';
 
 $this->id = @mysql_connect($host, $user, $mdp);
    
     if (!$this->id) {
     
   $this->define_error(); # Si problème de connexion, on va définir les erreurs

   
         }
     
     else {
     
   $this->db_connect($dbname); # Sinon, on passe à la sélection de la base
   
   }
   
 }
 
    function db_connect($dbname) { # Fonction de sélection de la base
    
 $db = @mysql_select_db($dbname, $this->id);
 
     if (!$db) {
     
   $this->define_error(); # Si ça marche pas, on va définir les erreurs
   
       }
    }
    
    function query($requete) { # C'est parti pour les requêtes
    
 if (!$this->id) {
     return false;
 }
 
 $requete = @mysql_query($requete, $this->id);

 if (!$requete) {
     
     $this->define_error();
     
 }      
   
    }
    
    function close() { # Fermeture de la bdd
    
 if($this->id) {
 
     mysql_close($this->id);
     
 }
 
    }
    
 
    
    function define_error() { # On définis les erreurs
    
     $this->error = mysql_error();
     $this->num_error = mysql_errno();

 $this->display_error();

    }
    
    
    function display_error() { # Affichage des erreurs, s'il y a
 
     if($this->error != '') {
     
   echo 'Erreur numéro <b>'.$this->num_error.'</b> détectée : <i>'.$this->error.'</i><br />';
   
     }
     
 }
    
}
?>
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2012 Invision Power Services, Inc.