samedi 24 avril 2010

Internal Server Error 500 - ioncube résolu !

Après 3 jours d'incompréhension, j'ai trouvé mon problème d'Internal Server Error 500.

Voilà ma situation.
J'ai une application web (Php/MySQL) encodée avec ionCube.
Sur un hébergeur et que sur certaines pages, j'ai des erreur 500.
Lorsque je remplace les fichiers encodés par les fichiers sources, aucun problème.

Après avoir épluché des milliers de lignes de code, ligne par ligne, j'ai trouvé la fonction qui posait problème. Elle ressemblait à :

function img($url,$parametres=array()){
...
}
La page qui appelait cette fonction est une page non encodée et ressemblait à :


Surpris par le comportement de l'application, j'essaye de ne faire qu'un appel de fonction.


Et là, la page fonctionne.
C'est donc lorsque j'ai deux ou plusieurs appels à cette fonction, que le serveur apache affiche une erreur 500.
Dans le error_log d'apache j'ai :

[Sat Apr 24 03:11:22 2010] [error] [client X.X.X.X] Premature end of script headers: index.php, referer: http://www.mon-site.com/

Le problème venait de la déclaration de la fonction img(). La valeur par défaut "=array()" provoque une erreur au deuxième appel de cette fonction.

function img($url,$parametres=array()){

J'ai donc remplacé cette déclaration par :

function img($url,$parametres=null){

Maintenant tout fonctionne parfaitement, je peux faire autant d'appels à la fonction img() que je veux.


J'espère vous avoir aidé !


dimanche 28 février 2010

Exporter données HyperFile SQL vers MySQL

Voici le but de ce projet.

J'ai une application windev avec une base HyperFile SQL (non client/serveur).
J'ai un site internet à distance avec une base MySQL.
Je souhaite faire une synchronisation de l'application windev vers la base de données à distance.
A chaque synchronisation, les tables sont remises à zéro sur la base distante.

Comment j'ai fait

Dans l'application windev et plus particulièrement dans l'analyse, j'ai ajouté une connexion MySQL vers la base distante. (Pensez à installer l'accès natif MySQL pour windev)

J'ai fait la synchronisation dans une nouvelle fenêtre.
Ayant une base d'environ 1000 lignes, j'ai trouvé une "astuce" pour réaliser la synchronisation facilement.

Ajouter un tableau d'un fichier Windev voulu, sélectionnez tous les champs (chargé en mémoire !)
Tester la fenêtre, vos enregistrements devraient s'afficher.
Ajoutez ensuite un bouton, nous allons mettre du code dedans...

L'idée est de stocker dans le tableau les enregistrements de votre base HyperFile SQL puis de changer de connexion vers MySQL, de reparcourir le tableau et d'ajouter dans MySQL chaque ligne de ce tableau. Astucieux non ? :D

Dans le code du bouton, avant toute chose, il faut forcer le parcours de toutes les lignes du tableau pour que windev mette en mémoire l'ensemble des lignes.

POUR i = 1 _A_ TABLE_Produits..Occurrence
//Rien
FIN

Ensuite on change de connexion. De HyperFile SQL vers MySQL

HChangeConnexion("*",ConnexionMySQL)
HSupprimeTout(Produits)
HCréationSiInexistant("*")

Je crée également les tables MySQL si elles n'existent pas (hCréationSiInexistant).

Puis on re-parcours le tableau en ajoutant les lignes dans MySQL

POUR i = 1 _A_ TABLE_Produits..Occurrence
HRAZ(Produits)
Produits.id= TABLE_Produits.COL_id[i]
Produits.nom= TABLE_Produits.COL_nom[i]

HAjoute(Produits)
FIN

On peut finalement compter le nombre d'ajout dans MySQL. Soit en ajoutant un compteur lorsque le hAjoute réussit (meilleure fiabilité), soit en faisant :

Info(TABLE_Produits..Occurrence + " produits ajoutés")

Je vous conseille également de vérifier le nombre de lignes dans votre base HyperFile SQL et le nombre de lignes ajoutées afin de contrôler l'intégrité des données.


On lance la synchronisation
Windev a créé dans MySQL les tables nécessaires et à ajouté les enregistrements.

Problème d'accents
Windev fait la synchronisation mais on peut avoir des problèmes d'accents. L'astuce est d'ajouter une information dans les connexions windev. Dans l'onglet "Avancé" de la connexion MySQL (dans votre analyse), mettre dans la zone "Infos. étendues" :

WD Unicode Support = 0;

Conclusion
Ce n'est pas la solution idéale je pense, mais c'est une solution rapide pour transférer les informations de HyperFile SQL vers une base MySQL distante (ou locale).