Articles avec #php tag

Publié le 27 Avril 2017

J'ai deux noms de domaine différents que je veux faire pointer vers la même installation de wordpress.

Par exemple: www.mondomaine.fr et blog.mondomaine.fr

Je ne parle pas l'option multisite de wordpress, ici. Les 2 domaines sont complétement équivalent.

Le problème vient de la configuration de wordpress, dans Settings / General il faut spécifier l'adresse wordpress (wordpress address) avec une URL unique. Il n'est pas possible de rentrer 2 noms de domaines différents.

Par exemple si j'utilise www.mondomaine.fr ici, alors lorsque j'utilise blog.mondomaine.fr, tous les liens pointent vers www.mondomaine.fr, ce qui est assez embêtant.

Heureusement il existe une solution toute simple à ce problème: Editer le fichier wp-config.php et ajouter les 2 lignes suivantes (n'importe où mais avant le require_once à la fin).

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

Ceci a pour effet de griser les 2 options de configuration "wordpress address" et "site address" dans "settings / general". 

Voir les commentaires

Rédigé par Bliz

Publié dans #Php, #Wordpress

Repost 0

Publié le 16 Mars 2015

J'ai dû développé en PHP un petit module d'import de fichier csv. La solution que j'ai utilisée se base sur le LOAD DATA INFILE de MySQL.

Un des besoins était de pouvoir utiliser un autre séparateur de champ que la virgule.

J'ai donc écrit une petite fonction qui permet de détecter le séparateur utilisé dans la ligne d'en-tête qui contient les noms des champs présents dans le fichier.

function separator($fields) {
    preg_match_all(
       '/(\w[\p{Pc}\w]*)+\s*([\p{P}\p{S}]+)\s*\w/',     
       $fields, 
       $matches, 
       PREG_SET_ORDER);
    return $matches[0][2];
}

La solution utilise une expression régulière pour détecter les caractères de ponctuation (\p{P}) et symboles (\p{S}) présent après le premier nom de champ. Il devrait donc être assez facile de l'utiliser dans d'autres langages de programmation.

Note: Le nom du premier champ peut contenir des _ (\p{Pc}).

Ensuite il suffit de récupérer les caractères utilisés dans le deuxième groupe (2ème parenthèse).

(La première parenthèse étant le nom du premier champ).

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 1 Février 2015

Depuis la version 5.3 de PHP il est possible d'écrire des fonctions anonymes ou lambda.

Par exemple imaginons le calcul "simplifié" du montant d'un panier:

$panier = array(
   "Learning PHP, MySQL & JavaScript: With jQuery, CSS & HTML5" => 35.50,
   "PHP and MySQL Web Development (4th Edition)" => 25.50,
   "PHP and MySQL for Dynamic Web Sites" => 30.00
);

function total() {
   $total = 0.0;
   array_walk($panier, function ($prix, $produit) use (&$total) {
      $total += $price;
   });
   return $total;
}

Ce qu'il faut remarquer ici c'est que la closure sur les variables présentes dans le scope où est déclarée la fonction ne se fait pas automatiquement.

Il faut spécifier explicitement les variables que l'on veut utiliser à l'aide du mot-clé 'use'.

Ensuite comme en PHP toute les valeurs sont passées par copies par défaut il faut spécifier explicitement que $total doit être passer par référence pour pouvoir la modifier depuis la lambda.

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 8 Juillet 2014

Si vous avez mis en place un téléchargement de fichier sur votre site vous vous êtes peut être confronté aux différences de caractère de fin de ligne.

Par exemple linux et mac os x utilisent le saut de ligne simple (line feed) qui se représente par \n. De l'autre côté les fichiers téléchargés depuis une machine Windows utilisent le retour charriot et de saut de ligne soit \r\n

Si cela a une incidence sur la façon dont vous devez traiter les fichiers il faut détecter le caractère de fin de ligne et dans mon cas sans charger tout le fichier en mémoire.

J'ai trouvé l'astuce suivante (je ne sais pas s'il y a mieux mais ça fonctionne en ne lisant que la première ligne du fichier):

<?php
$fichier = fopen('fichier/telecharge.txt', 'r');
$line = fgets($fichier);
fclose($fichier);

$fin_de_ligne = "";
if (strpos($ligne, "\r")) $fin_de_ligne .= "\r";
if (strpos($ligne, "\n")) $fin_de_ligne .= "\n";
?>

Voir les commentaires

Rédigé par Bliz

Publié dans #php

Repost 0

Publié le 14 Juin 2014

J'ai récemment eu l'occasion de travailler sous mac et pour commencer il a fallu installer tout l'environnement PHP/MySQL.

Comme OS X est basé sur Unix on retrouve vite ses marques.

Apache

Ainsi Apache est déjà installé par défaut.

Pour vérifier qu'il fonctionne il suffit d'ouvrir un navigateur avec l'adresse: http://localhost

Si un magnifique "It works!" s'affiche c'est que le serveur apache est démarrer. Sinon il suffit de le démarrer avec la commande:

sudo apachectl start

PHP

PHP est également déjà installé mais il n'est pas activé. Pour l'activer il faut éditer la configuration apache qui se trouve dans

/etc/apache2/httpd.conf

Avant de modifier le fichier il est plus prudent d'en faire une copie (au cas où).

Ensuite de le fichier il suffit de décommenter (enlever le #) la ligne suivante pour qu'elle ressemble à ça:

LoadModule php5_module libexec/apache2/libphp5.so

Ensuite il faut redémarrer Apache pour prendre en compte les changements:

sudo apachectl restart

À partir de là Apache/PHP fonctionne. Par défaut le dossier contenant les sites webs se trouvent dans 

/Library/WebServer/Documents

Il suffit de placer un fichier php dans ce répertoire pour qu'il soit servi par Apache.

Pour utiliser un autre répertoire (e.g. /var/www) il faut modifier la ligne suivante dans /etc/apache2/httpd.conf

DocuementRoot "/var/www"

Puis redémarrer Apache.

MySQL

En revanche MySQL n'est pas du tout présent. Il va falloir l'installer from scratch. Le plus simple est de l'installer à partir d'un fichier .dmg disponible sur le site de MySQL: http://dev.mysql.com/downloads/mysql/

MySQL peut également être installé à partir d'un gestionnaire de package tel que homebrew avec la commande:

brew install mysql

Si vous avez opté pour l'installation à partir du .dmg pensez à mettre à jour votre $PATH en y incluant /usr/local/mysql/bin.

Après l'installation il est recommandé de lancer 

mysql_secure_installation

Pour démarrer le serveur mysql:

mysql.server start

Voilà mysql est maintenant installé mais il n'est pas encore accessible depuis un fichier PHP. Pour cela il faut modifier la configuration PHP et activé l'extension MySQL.

Vérifier que le fichier /etc/php.ini.default contient bien une des deux lignes suivantes (non commenté - sans ; au début)

extension=php_mysql.dll
extension=php_mysqli.dll

Normalement l'extension mysqli remplace mysql mais certain sites utilisent encore l'extension mysql.

Une fois le fichier modifier il faut encore une fois redémarrer Apache.

Maintenant tout est en place pour que cela fonctionne mais il y a de fortes chances que vous rencontriez un problème pour se connecter au mysql local que nous venons d'installer.

En fait le problème est que pour les connections locales les communications s'effectue à l'aide d'un fichier .sock est que php ne va pas chercher le fichier là où il se trouve.

Par exemple MySQL crée le fichier mysql.sock dans /tmp/mysql.sock alors que PHP va le chercher dans /var/mysql/mysql.sock

Le moyen le plus simple pour résoudre le problème est de créer un lien symbolique dans /var/mysql:

sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 8 Janvier 2013

Dans une petite appli web, il y a un texte généré en PHP. Ce texte s'affiche dans un textarea ... jusque là, tout va bien.

C'est maintenant que Javascript entre en jeu. Selon certaines actions utilisateur il faut changer le contenu du textarea en utilisant Javascript, mais les textes sont toujours générés par PHP.

En gros c'est PHP qui génère du javascript. Il faut donc encoder le texte généré en PHP pour être utilisable en javascript.

Les 2 principaux problèmes que j'ai noté sont les ' et les \n qu'il faut protéger. Le code suivant fait l'affaire dans mon cas (attention ce n'est pas très propre et je ne pense pas que ça fonctionne dans tous les cas):

<?php
 echo 'var monTexte = "'.str_replace("\n", '\n', addslashes($mon_texte)).';';
?> 

Ce que fait cette ligne c'est protéger toutes quotes avec un \ puis remplacer les sauts de ligne par des \n.

ça a suffit dans mon cas. J'ai vu des solutions qui utilisaient json_encode() mais je n'ai pas réussi à le faire marcher dans mon cas (même en convertissant le texte un utf8 avec utf8_encode() auparavant).

Si vous avez d'autres idées, je suis preneur.

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 28 Novembre 2012

Je dois gérer des utilisateurs sur un site web et il faut leur proposer un password par défaut.

Bien sûr le password doit répondre à certaine contraintes. Ici il doit faire 8 caractères contenir 1 majuscules, 1 chiffres et 1 caractère spécial (genre ponctuation).

voilà un bout de code que j'ai écrit pour répondre à ce besoin :

<?php

class PasswordGen {

   public static function generate() {
      // les valeurs suivantes peuvent être modifiées selon le besoin
      $l = 8; // longueur du mot de passe
      $c = 1; // nombre de lettre capitale
      $n = 1; // nombre de chiffre
      $s = 1; // nombre de caractères spéciaux
      
      // liste des valeurs possibles pour chaque type de caractères
      $chars = "abcdefghijklmnopqrstuvwxyz";
      $caps = strtoupper($chars);
      $nums = "0123456789";
      $syms = "!@#$%^&*()-+?";
      
      $out .= self::select($chars, $l - $c - $n - $s); // sélectionne aléatoirement les lettres minuscules
      $out .= self::select($caps, $c); // sélectionne aléatoirement les lettres majuscules
      $out .= self::select($nums, $n); // sélectionne aléatoirement les chiffres
      $out .= self::select($syms, $s); // sélectionne aléatoirement les caractères spéciaux
      
      // Tout est là, on mélange le tout
      return str_shuffle($out);
   }
   
   private static function select($src, $l){
      for($i = 0; $i < $l; $i++){
         $out .= substr($src, mt_rand(0, strlen($src)-1), 1);
      }
      return $out;
   }
}

?> 

Pour l'utiliser il suffit d'appeler la méthode statique generate():

<?php $password = PasswordGen::generate(); ?>

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 24 Mai 2011

Lors du développement d'application web, on doit souvent recharger la même page dans son navigateur.

Mais souvent le code a changé depuis le dernier affichage de la page et un simple refresh (F5) utilise le cache du navigateur qui correspond à une version antérieur de ce qu'on pense tester.

 

Heueusement la touche Ctrl vient à la rescousse. En effet Ctrl+F5 permet de recharger la page sans utiliser le cache: tout est donc rechargé depuis le serveur - ce qui en phase de dév signifie qu'on récupère bien la dernière version.

 

ça n'a l'air de rien comme ça mais j'ai déjà rencontré (assez souvent même) des problèmes liés à l'utilisation du cache qui entrainait des comportement étrange, notamment avec flash et GWT.

 

Et cerise sur le gâteau ce raccourci fonctionne aussi bien sous Firefox qu'Internet Explorer!

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 21 Avril 2010

Pour faire suite à l'article précédent sur les filtres PHP nous allons voir comment utiliser ces filtres pour "nettoyer" les saisies de l'utilisateur (ou toute autre donnée).

 

Nous allons donc toujours utiliser la fonction filter_var mais cette fois-ci non plus avec des filtres "VALIDATE" mais avec des filtres "SANITIZE".

 

Ansi le code suivant supprimera les balises HTML et affichera donc uniquement "Bonjour les amis" (sans les balises <p>)


<?php

$variable = "<p>Bonjour les amis</p>";
echo filter_var($variable , FILTER_SANITIZE_STRING);

php?>

 

On peut également choisir de ne pas supprimer les balises mais de les encodées en appliquant le filtre FILTER_SANITIZE_SPECIAL_CHARS qui donnera le résultat suivant:

 

&#60;p&#62;Bonjour les amis&#60;/p&#62;

 

Voilà il existe toute une série de filtre pour nettoyer différents types de données tels que:

 

email FILTER_SANITIZE_EMAIL
URL FILTER_SANITIZE_URL
Nombre entier FILTER_SANITIZE_NUMBER_INT
Nombre décimal FILTER_SANITIZE_NUMBER_FLOAT

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0

Publié le 20 Avril 2010

Aujourd'hui voici une astuce pour valider facilement une saisie utilisateur (email, URL, nombre, somme, etc ...) en PHP.

Pour ceci nous allons utiliser les filtres PHP disponibles grâce à la fonction filter_var.

 

Cette fonction permet en effet de valider une saisie utilisateur avant d'effectuer un traitement dessus (stockage en base de données par example).

 

Par example pour valider une adresse email:

 

<?php

$email = $_REQUEST['email'];
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
   // email OK
   // insertion en base de données

}
else{
   // email non valide
   // affichage d'un message d'erreur par exemple

}

?>

 

Pour valider une URL on utilisera la même fonction avec le filtre : FILTER_VALIDATE_URL.

 

Pour valider un nombre il existe les filtres: FILTER_VALIDATE_INT pour les entiers et FILTER_VALIDATE_FLOAT pour les nombres à virgules flottantes (c'est à dire les nombres avec une virgule).

 

On peut même valider que le nombre se trouve dans un interval défini:

 

<?php

$nombre = $_REQUEST['saisie'];

// définition de l'interval

$options = array("min_range" => 1, "max_range" =>10);

echo "Nombre compris entre 1 et 10: ";
echo filter_var($nombre, FILTER_VALIDATE_INT, array( "options" => $options));

?>

Voir les commentaires

Rédigé par Bliz

Publié dans #Php

Repost 0