Affichage des articles dont le libellé est php. Afficher tous les articles
Affichage des articles dont le libellé est php. Afficher tous les articles
8/02/2010

[Snippet PHP] apc_exists for APC < 3.1.4

Problem:


Fatal error: Call to undefined function apc_exists() in xxxx.php on line xx
That's because APC may not be activated or because your APC version is less than 3.1.4.

Fix:


11/30/2009

My (unofficial) Kuripotxt PHP API

If you follow me on twitter, you may have seen these tweets :
Kuripotxt.net, my new free #sms gateway #Hijack (flickr) http://flic.kr/p/7iRJpK 3:38 PM Nov 28th
Kuripotxt.net, my new free sms gateway #Hijack

Kuripotxt, free sms "api": Hijack Part2 http://flic.kr/p/7iVJtm 3:48 PM Nov 28th
Kuripotxt, free sms "api": Hijack part2
Yeah... It works ! (on my blog in less than 1 hour :)
$myGateway = new Kuripotxt();
$myGateway->sendSms(33600000000,"Hello World"); 16 minutes ago

After one hour of development, I am glad to show you a PHP Class for Kuripotxt using the HttpClient library.

Usage:
include "kuripotxt.class.php";

$mySender = new Kuripotxt();
//International number format without "+"
$phoneNumber = 33612345678;
$mySender->sendSms($phoneNumber,'Hello world');//one method


10/12/2009

preg_replace/preg_replace_callback PURE Javascript equivalent

I didn't know that but the string replace method support $X notation style and callback functions:

preg_replace
in pure javascript:


preg_replace_callback in pure javascript:
6/30/2008

Équivalent Javascript pour les fonctions PHP ksort et krsort [MAJ]

Il y a quelques minutes, j'ai eu besoin de trier un tableau associatif javascript par ses index, du plus petit au plus grand. Mais javascript (via la méthode sort() de l'objet Array) ne permet que le trie des éléments d'un tableau, et non de ses index. Après une petite recherche, je me suis basé sur le code de Aaron Gustafson afin de créer la fonction ksort() et son opposé krsort().

[MAJ] : Le code de Aaron Gustafson ne prends pas en charge les tableaux de tableau ou d'objet, ni les tableaux de tableau de tableau. Ce qui est très nul dommage. J'ai donc modifié et optimisé tout ça :

/*
    array ksort  ( array $array)
    Trie le tableau array  suivant les clés, en maintenant la correspondance entre les clés et les valeurs.
    Cette fonction est pratique pour les tableaux associatifs.
*/
function ksort(w)
{
  var sArr = [];
  var tArr = [];
  var n = 0;
  for (i in w)
  {
    tArr[n++] = i;
  }
  //tri du plus petit au plus grand
  tArr = tArr.sort();
  n = tArr.length;
  for (var i=0; i<n; i++) {
    sArr[tArr[i]] = w[tArr[i]];
  }
  return sArr;
}
/*
    array krsort  ( array $array)
    krsort() trie le tableau array  en ordre inverse et suivant les clés, en maintenant la correspondance entre les clés et les valeurs.
    Cette fonction est pratique pour les tableaux associatifs.
*/
function krsort(w)
{
  var sArr = [];
  var tArr = [];
  var n = 0;
  for (i in w)
  {
    tArr[n++] = i;
  }
  //tri du plus grand au plus petit
  tArr = tArr.sort(function(a,b){return (b - a);});
  n = tArr.length;
  for (var i=0; i<n; i++)
  {
    sArr[tArr[i]] = w[tArr[i]];
  }
  return sArr;
}

J'en profite pour vous annoncer la naissance prochaine d'un projet sous Adobe Air. A ce propos je cherche des Alpha-testeurs (oui, à ce stade on peut parler d'Alpha plutôt que de bêta) donc n'hésitez pas à vous faire connaître en commentaire.

6/16/2008

Exécuter une tâche après l'affichage d'une page php

Il arrive parfois qu'un développeur PHP ait besoin d'effectuer plusieurs opérations qui ne nécessitent pas de modifier la page à envoyer au navigateur. Il est donc intéressant de pouvoir continuer à exécuter un script même si les en-têtes ainsi que le contenu de la page ont déjà été envoyé au navigateur. On parle alors de fonction d'extinction. Pour enregistrer une fonction d'extinction on utilise la fonction register_shutdown_function qui est de la forme :

void register_shutdown_function ( callback $function [, mixed $parameter [, mixed $... ]] )

Voici un exemple d'utilisation :

<?php
function apres_envoi($var1,$var2)
{
    //code à executer après l'envoi de la page
}


set_time_limit(0);
register_shutdown_function('apres_envoi','maVariable1',$variable2);

//code pour l'affichage de la page
?>

Et voila !

6/06/2008

Amusons-nous avec Plurk [1/2] : Poster un message sur Plurk avec PHP/Curl

Nous allons voir de cet article comment envoyer un message sur Plurk grâce à Curl et PHP. Pour le moment Plurk ne propose pas d'API, ni de documentation, mais votre serviteur à regardé attentivement pendant plusieurs minutes le fonctionnement de la bête afin de pouvoir vous proposer ces quelques morceaux de code.

Etape 1 : Vous inscrire à Plurk (si ce n'est pas déjà fait)

Courrez vous inscrire à Plurk, vous pouvez utiliser ce lien, qui vous permettra une fois inscrit, de m'avoir directement en friends (la chance que vous avez).

Etape 2 : Récupérer votre identifiant Plurk

plurk_logoContrairement à ce que l'on pourrait penser votre identifiant n'est pas votre nom d'utilisateur. Il peut être sous deux formes :

  • AFVeMES9QZpm (exemple d'identifiant privé, contenu dans un cookie après la connexion à Plurk)
  • 33527 (mon identifiant public disponible dans le code de ma page Plurk)

Si vous souhaitez envoyer un message sur Plurk il vous faut les données de votre cookie Plurk. Pour le récupéré j'ai donc créé un petit bookmarklet (encore un bookmarklet ?).

  1. Déplacez ce lien : Plurk (drag & drop) dans votre barre de favoris.
  2. Connectez-vous à Plurk, puis cliquez sur le favoris pour afficher votre cookie Plurk (copiez le) et votre identifiant privé.
  3. Vos possédez maintenant les données qui vous permettrons d'ajouter un message.

Petite anecdote : à la création de cet article, seul l'identifiant privé était nécessaire pour l'ajout d'un message sous Plurk, mais à l'heure actuelle, les variables first_plurk et modified sont obligatoire pour l'ajout d'un post. Je prévient donc qu'il n'y à aucune garantie pour que mon code fonctionne dans les jours à venir ;).

Etape 3 : Poster un message sur Plurk via Php/Curl, le code

function post_to_plurk($content= 'http://geekfg.blogspot.com',$qualifier = ':',$lang = 'fr')
{
// Entrez ici votre cookie Plurk trouvé grâce au bookmarklet
$COOKIE_CURL = '000000000000000000000000000000=?user_id=000000000000&first_plurk=00000000000000000000&modified=00000000=';

//Vous n'êtes pas obliger de toucher au code ci-dessous
$header = array('Cookie: plurkcookie='.$COOKIE_CURL);
$ch = @curl_init();
@curl_setopt($ch, CURLOPT_URL, 'http://www.plurk.com/TimeLine/addPlurk');
@curl_setopt($ch, CURLOPT_HEADER, 0);
@curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($ch, CURLOPT_POST, 1);
@curl_setopt($ch, CURLOPT_POSTFIELDS, 'posted='.rawurlencode(date('Y-n-j').'T'.(date('G')-2).':'.date('i:s')).'&qualifier='.rawurlencode($qualifier).'&content='.rawurlencode(utf8_encode($content)).'&lang='.$lang.'&no_comments=0');
@curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
$data = @curl_exec($ch);
$res = @curl_getinfo($ch);
if($res['http_code'] == 500)
{
return 'Erreur lors de l\'envoi au serveur : les paramètres saisis sont sans doute mauvais';
}
else if($res['http_code'] == 200)
{
return 'Message posté ! Voici ce que retourne le serveur : '.$data;
}
else if($res['http_code'] == 400)
{
return 'Erreur du serveur : '.$data;
}
@curl_close($ch);
}

Modifiez simplement le contenu de la variable $COOKIE_CURL par les données que vous a donné le bookmarklet tout à l'heure, ces données sont normalement de la forme :

000000000000000000000000000000=?user_id=000000000000&first_plurk=00000000000000000000&modified=00000000=

Une fois modifié, vous pouvez utiliser la fonction comme ceci :

echo post_to_plurk('Hello World'); //Plurk affichera : [PSEUDO] Hello World

Ou encore comme ceci :

echo post_to_plurk('être riche','wishes','fr'); //Plurk affichera : [PSEUDO] souhaite être riche

Autre version du code

Cette autre version (que je viens de trouver ici), se connecte à plurk, récupère les données du cookie et envoi un message sur Plurk.

function post_to_plurk2($content= 'http://geekfg.blogspot.com',$qualifier = ':',$lang = 'fr')
{
//Entrez ici vos identifiants de connexion Plurk
$nomutilisateur = 'LOGIN';
$motdepasse = 'MOTDEPASSE';

//Vous n'êtes pas obliger de toucher au code ci-dessous
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, 'plurkcookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'plurkcookie.txt');
curl_setopt($curl, CURLOPT_URL, 'http://www.plurk.com/Users/login');
curl_setopt($curl, CURLOPT_POSTFIELDS, 'nick_name='.$nomutilisateur.'&password='.$motdepasse);
curl_exec($curl);
curl_setopt($curl, CURLOPT_URL, 'http://www.plurk.com/TimeLine/addPlurk');
curl_setopt($curl, CURLOPT_POSTFIELDS, 'qualifier='.rawurlencode($qualifier).'&content=' .rawurlencode(utf8_encode($content)). '&lang='.$lang.'&no_comments=0');
return curl_exec($curl);
curl_close($curl);
}

Voila, c'est finit pour aujourd'hui, mais la suite arrive demain ! N'hésitez pas à vous inscrire au flux rss pour suivre plus facilement le blog.

5/29/2008

Synchronisation entre deux bases de données (Access/Mysql)

La première phase de mon stage consiste à mettre en place un script, un programme, qui permettra de synchroniser une partie de la base de données CIEL (qui contient l'ensemble des articles, famille, fournisseur, ventes, etc...) avec la base de donnée du site (Mysql).

CIEL repose sur une base de données ACCESS, le script devra donc être capable d'effectuer des requêtes sur cette base de données. La synchronisation est unidirectionnel (Ciel -> Site) lorsqu'il s'agit des articles, et bidirectionnel lorsqu'il s'agit des stocks.


Voici donc la façon dont j'effectue la synchronisation (dans cet exemple pour les articles).

Le serveur web du magasin accueil un mini-site, qui effectue via des requêtes AJAX les différents traitements de synchronisation. Le dialogue entre les deux serveurs s'effectue exclusivement en JSON, plus léger que XML et très facilement lisible en cas de debuggage.

Les requêtes AJAX envoyées depuis le serveur web du magasin peuvent être dirigées :

  1. soit vers un script php interne au serveur qui va permettre de créer un interface entre les données de la base de donnée ACCESS et le reste de l'application
  2. soit vers un script php "proxy" qui va effectuer une requête POST sur le serveur web e-commerce et retournera le résultat de cette requête. La requête POST ne contient qu'un seul champs : "data". Ce champs "data" - qui sera envoyé au serveur e-commerce - contient l'intégralité des variables POST ($_POST) envoyées au script proxy. Ainsi, le mini-site envoie une requête AJAX de type POST sur le script "proxy", le script proxy transforme toutes ces variables en JSON (serialisation) et les inclus dans la variable "data" qu'il envoi par POST au serveur web e-commerce, le serveur web e-commerce va alors déserialiser la variable $_POST['data'] et effectuer les traitements en fonction des paramètres transmis.


Ps : J'utilise CURL pour l'envoi de requête POST sur le serveur ainsi que PDO pour la communication avec la base de donnée ACCESS.

5/26/2008

Problème requête SQL avec INNER JOIN multiple sur base de donnée Access

Je viens de commencer réellement mon stage et pour cela, il me faut extraire des données d'une base de données Access par une requête SQL depuis PHP en utilisant PDO. Pour cela j'ai eu besoin de faire plusieurs INNER JOIN  (j'ai simplifié à 2 pour l'exemple) et une fois le deuxième INNER JOIN ajouté l'erreur suivante s'est produite :

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression

Voici la requête produisant l'erreur :

SELECT Articles.code, Articles.libellélong, Articles.libellécourt, ArticlesTarifs.TTC, ArticlesStocks.QtéStock
FROM `Articles`
INNER JOIN `ArticlesTarifs` ON (Articles.N°) = ArticlesTarifs.N°Article
INNER JOIN `ArticlesStocks` ON (Articles.N°) = ArticlesStocks.N°Article
WHERE Articles.bWeb = 1

 

En fait, il suffit de concaténer tout les INNER JOIN directement dans le FROM de la requête et le tour est joué :

SELECT Articles.code, Articles.libellélong, Articles.libellécourt, ArticlesTarifs.TTC, ArticlesStocks.QtéStock
FROM (
(`Articles` INNER JOIN `ArticlesTarifs` ON Articles.N° = ArticlesTarifs.N°Article)
INNER JOIN `ArticlesStocks` ON Articles.N° = ArticlesStocks.N°Article)
WHERE Articles.bWeb = 1

 

Ainsi on a une requête sql sur la forme :

SELECT *
FROM (table 1 INNER JOIN `table2` ON table1.id = table2.id) INNER JOIN `table3` ON table1.id = table3.id)

 

Je reparlerai sans doute de PDO qui est vraiment une classe formidable

5/22/2008

Transformer une image en code html via php et gd

Ces 2 dernières minutes, ne sachant pas quoi faire et rempli d'une profonde tristesse, j'ai eu l'idée (et quelle idée, c'est ce genre d'idée qui vous fait perdre votre temps) de créer un script, qui, à partir d'une image (dans notre exemple une image png) va la transformer en code (x)html en utilisant des propriétés css. Le code du script est disponible ici.

Rien de bien compliqué :
  1. On récupère la taille de l'image
  2. On ouvre l'image
  3. On fait une boucle sur les Y et les X
    • A chaque pixel X:Y on récupère son index
    • On créé un div à la position X;Y et on lui applique un background-color en ayant convertit l'index en RGB
  4. Et voila :)
J'ai ajouté la variable "coef" qui permet de spécifier un coefficient multiplicateur (=zoom), un coef de 1 est la taille normal.

Je pense que des optimisations sont possibles (eh oui, même sur un petit morceaux de code comme celui la !) :
  • Il suffirait de stocker tous les index et leurs positions dans un tableau. Ensuite il faudrait regarder si il y a des mêmes index consécutifs pour ainsi créer un seul div - avec une taille plus grande - au lieu de plusieurs, on allège ainsi la taille du rendu html.
  • Ou encore, faire une liste des différentes couleurs, leurs créer une classe css, et appliquer cette class sur les div (à condition que le nom des classes ne dépassent pas 2-3 caractères et que l'image ne contienne pas beaucoup de couleur)

Ci-joint un exemple généré avec le script et l'image originale utilisée, la page pèse plus de 2.5Mo alors que l'image fait 20.8Ko... Je n'ai jamais dit que le script avait une réel utilité !
4/27/2008

Activer PHP5 sur 1and1

Petite astuce, pour activer PHP5 sur 1&1, créer un fichier .htaccess à la racine du site et ajoutez lui le contenu :

AddType x-mapp-php5 .php
AddHandler x-mapp-php5 .php


Et voila, un petit phpinfo() vous informera que vous êtes maintenant sous PHP5
4/20/2008

Lire récursivement un répertoire en php

Si vous n'avez jamais réussi à parcourir un répertoire ainsi que tout ses sous répertoire en php, ce message est pour vous !

Mais tout d'abord, un petit rappel, qu'est-ce qu'une fonction récursive ?
Une fonction récursive est une fonction qui peut s'appeler elle-même au cours de son exécution
(Wikipedia)
L'algorithme est donc court :

Fonction parcourir(rep)
E :
chaine : rep /* le répertoire à lire */
S :
chaine : liste_fichier /* liste des fichiers dans ce répertoire */
Var :
chaine : f /* fichier actuel */

Debut

TantQue(f = lire_repertoire(rep)))
Si est_repertoire(f)
Alors
liste_fichier += parcourir(rep + f)
FinSi

Si est_fichier(f)
Alors
liste_fichier += f
FinSi
FinTantQue

retourne liste_fichier
Fin


En bref, notre fonction lit le contenu d'un répertoire et retourne sous forme de chaine la liste des nom de fichier qui compose le répertoire en cours (à savoir "rep"). A chaque sous répertoire découvert, on ré-appelle la fonction "parcourir" avec l'adresse actuelle du répertoire ainsi que le nom du sous répertoire, ce qui nous retournera une liste de fichier composant ce répertoire.

Ainsi on va alors obtenir un enchainement d'appelle de fonction "parcourir" chaque fonction retournant une chaine "liste_fichier" à son appelant qui lui même retournera à son appellant etc... Jusqu'à ce que la première fonction appelante, qui aura récupérée tout les "liste_fichier" retourne elle même cette valeur.

Voici donc un exemple de code, qui permet de parcourir tous les sous répertoires d'un dossier, et de calculer le nombre de ligne de code de chaque fichier php, htm/html, css et javascript qu'il contient.
<style>
quote {padding:5px;padding-left:20px;display:block;}
</style>
<?php
function compte_ligne_code($f)
{
    return count(file($f));
}

function read_dir($dir,$dir_max)
{
    $array = array(2);
    if(!strrchr($dir, '_NO_'))//dossier vide
    {
    $me = 0;
    $hdl = @opendir($dir);
    while($f = @readdir($hdl))
    {
        if(is_dir($dir.'/'.$f) && $f !== '..' && $f !== '.')
        {
            if($dir_max > 0)
            {
            $dir_max--;
            $array[0] .= '<quote style="background:#'.rand(2,9).'f'.rand(2,9).'f'.rand(2,9).'f">[DIR] <h3>'.$dir.'/'.$f.'</h3><br />';
                $narray = read_dir($dir.'/'.$f,$dir_max);
                $array[0] .= $narray[0];//code html
                $array[1] += $narray[1];//nombre de ligne
            $array[0] .= '</quote>
';
            }
        }
        else if((substr($f, -4, 4) == '.php'
        ||    substr($f, -3, 3) == '.js'
        ||    substr($f, -4, 4) == '.css'
        ||    substr($f, -4, 4) == '.htm'
        ||    substr($f, -5, 5) == '.html'
        )  && substr($f, 0, 4) !== '_NO_')//fichier .php ou .js
        {
            $l = count(file($dir.'/'.$f));
            $array[1] += $l;
            $array[0] .= '<quote style="background:#'.rand(2,9).'f'.rand(2,9).'0'.rand(2,9).'f">'.$l.' ligne(s) dans <strong style="float:right">'.$dir.'/'.$f.'</strong>';
            $array[0] .= '</quote>
';
        }
        else
        {
        $array[0] .= '['.$dir.'/'.$f.'] ';
        }
    }
    }
    else
    {
        $array[0] .= '<quote style="background:#000000;color:#ffffff">Passe le dossier dossier : '.$dir.'</quote>';
    }
    return $array;
}

$arr = read_dir('.',100);
echo '<h1>'.$arr[1].' lignes de code !</h1>'.$arr[0];


Si vous souhaitez que des dossiers ou des fichiers ne soient pas pris en compte ajoutez "_NO_" devant, par exemple "images" devient "_NO_images" et ainsi de suite.
4/03/2008

Petite astuce php.ini hébergement 1and1

Il y a quelques semaines, je me suis aperçu que les fonctions file() et fopen() ne fonctionnaient plus lorsqu'il s'agissait de chargée une donnée externe au site.
L'erreur retournée était :
URL file-access is disabled in the server

J'ai donc regardé dans le panel, la faq de 1&1, mais aucune réponse sur le sujet. Après l'envoi d'un mail au support j'ai enfin obtenu une réponse :

Cette activation doit être réalisé par la mise en place d'un fichier
"php.ini".

Il vous suffit simplement de créer un fichier "php.ini" (avec un éditeur
texte comme "vi" ou "Bloc-Notes") avec dans celui-ci uniquement le ou
les variables à redéfinir, et de placer celui-ci dans le dossier où vous
souhaitez que les modifications soient appliquées. Vous pourrez
constater le changement des ces valeurs en plaçant un script "phpinfo"
dans le dossier ou se trouve le fichier "php.ini" et en affichant la
page du "phpinfo" dans un navigateur internet.


Trouvez rapidement les réponses à vos questions en consultant notre FAQ:
http://faq.1and1.fr

Cordialement,
Marc

Alors bien sur, j'ai l'impression de passé pour un con quand je vois les réponses en rapport au php.ini dans la faq, j'en vient même à me demander ce que j'ai cherché dans la faq pour ne pas avoir trouvé ça mais bon.

Pour corrigé mon problème, j'ai donc créer un fichier php.ini avec les valeurs :

[...]
allow_url_fopen = On
allow_url_include = On
[...]

Je n'ai pas encore regardé si il y avait que ces valeurs à modifier, je ne pense pas avec la fonction file() ne dois pas reposé sur ces paramètres là, je regarderai ça plus tard.
J'espère que cela pourra servir à d'autres :)
10/30/2007

"Détournement" de l'API de Twitter pour envoyer des sms groupés

Simon Robic (de SimonRobic.com) m'à demandé comment je faisais pour envoyer des sms groupés à mon staff via l’interface administrateur sur VistaRC. D'où l'objet de ce post.

Ci-joint le pdf de l'article, car Blogger rend très mal le code ^^'.

[MAJ] Révision 1 :
http://vistarc.net/public/1193778828twitter-apirev1-pdf.pdf

Anciennes versions :
http://vistarc.net/public/1193758079twitter-api-pdf.pdf
8/25/2007

Mise en place d'un plazu mobile

Plazu, l'application communautaire par excellence (du moins pour moi), s'exporte sur un interface client. En effet, hier dans la soirée, l'idée m'est venu de développer un interface en C# communiquant avec le serveur PHP en XML (Xml maison). 4 heures plus tard voici la première alpha :




Le but étant finalement de permettre à l'équipe de consulter sa boite mail même en étant hors ligne (ce qui n'arrive presque jamais) et d'avoir un accès rapide aux différentes fonctions du site.
10/30/2006

Module Iframe dans Wordpress

Il y a quelques minutes un membre du forum Bt Dot Com m'a demandé de lui permettre d'avoir une zone "téléchargement" dans son blog.

Voici donc la manipulation à faire.

Dans votre dossier Wordpress, allez dans "wp-includes/template-loader.php".

Remplacez :

Par

Sachant que dl.php est le nom de la page a appelé lorsque la variable "dl" dans l'url à une valeur. Comme par exemple avec une url du type http://monsite.com/wordpress/?url=true.

Ensuite allez dans "wp-content/themes/NOM DE VOTRE THEME/" puis créé y votre fichier, qui dans notre exemple est "dl.php".

Pour que votre fichier soit bien intégré au site, il lui faut au minimum ce code :

Dans notre exemple voici notre page dl.php :


Et voila c'est tout pour aujourd'hui.
»
 
 
Made with on a hot august night from an airplane the 19th of March 2017.