Problem:
Fatal error: Call to undefined function apc_exists() in xxxx.php on line xxThat's because APC may not be activated or because your APC version is less than 3.1.4.
Fatal error: Call to undefined function apc_exists() in xxxx.php on line xxKuripotxt.net, my new free #sms gateway #Hijack (flickr) http://flic.kr/p/7iRJpK 3:38 PM Nov 28th
Kuripotxt, free sms "api": Hijack Part2 http://flic.kr/p/7iVJtm 3:48 PM Nov 28th
Yeah... It works ! (on my blog in less than 1 hour :)
$myGateway = new Kuripotxt();
$myGateway->sendSms(33600000000,"Hello World"); 16 minutes ago
include "kuripotxt.class.php";
$mySender = new Kuripotxt();
//International number format without "+"
$phoneNumber = 33612345678;
$mySender->sendSms($phoneNumber,'Hello world');//one method
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.
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 !
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.
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).
Contrairement à ce que l'on pourrait penser votre identifiant n'est pas votre nom d'utilisateur. Il peut être sous deux formes :
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 ?).
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 ;).
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
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.
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 :
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.
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
AddType x-mapp-php5 .php
AddHandler x-mapp-php5 .php
Une fonction récursive est une fonction qui peut s'appeler elle-même au cours de son exécutionL'algorithme est donc court :
(Wikipedia)
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
<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]; 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 ^^'.