Bonsoir,
Je rentre d'une véritable expédition en zone inondée frappée par la tempête.
Merci de vos réponses, j'essaye d'être le plus concis possible concis en ne devenant pas abscons (je viens de finit et je ne vois pas comment j'aurais pu un dire moins et rester clair et utile potentiellement à d'autres lecteurs).
par ailleurs l'effort fait pour communiquer force à une réflexion source de clarifications.
Le problème d'origine posé est presque totalement résolu. Il s'agissait d'une fonction PDO non trouvée (setAttribute). Ce problème ne se posait pas dans la version antérieure (3.3) de Tikiwiki qui créait un objet PDO depuis le programme racine et appelait directement toutes les fonctions. Notamment "prepare" retourne un objet de "PDO_statement" (appelé d'ailleurs dans Zend Framework "_stmt" en tant que variable objet $_stmt).
L'analyse de la version 4.1 montre que les auteurs ont implémenté une structure de classe qui pose en fait problème (voir plus loin celle du ZEND Framework). Ce qui est écrit comprend :
Création de classes
- Une abstract class TikiDb qui permet de gérer une base Tiki, elle comprend l'objet base en private static que l'on stocke et auquel on accède en "singleton" par les fonctions set et get
- Une classe tikiDb_PDO extends TikiDb qui permet d'exécuter un certain nombre de fonctions sur un objet déclaré PDO par une instruction : TikiDb::set( new TikiDb_Pdo( $dbTiki ) );
Une exécution
- La création de l'objet dbTiki par : "$dbTiki = new PDO("$db_tiki:$db_hoststring;dbname=$dbs_tiki", $user_tiki, $pass_tiki);"
- Le surclassement (qui est le problème) de $dbTiki en Tiki_Db_Pdo et son stockage comme singleton dans TikiDb par TikiDb::set( new TikiDb_Pdo( $dbTiki ) );
C'est ce surclassement qui semble-t-il fonctionne en 3.2 sous linux et ne fonctionne pas en 3.3 sous windows
En effet l'instruction suivante :
TikiDb::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Produit l'erreur [function "setAttribute" not found]
en effet l'objet crée $dbTiki = new PDO surclassé en TikiDb_Pdo n'a plus accès aux fonctions PDO.
En ajoutant à la classe TikiDb_Pdo une fonction setAttribute qui est une simple interface l'exécution se déroule normalement.
Ensuite on peut ajouter la fonction "prepare" qui retourne un objet PDOStatement correct.
Désolé pour le Pb "execute" et accès à PDO pour PDOStatements : faux problème du aux versions de test
L'objet PDOStatement retourné par "prepare" est normalement traité par PDO dans le programme racine sans définir une classe Tiki_PDOStatement comme avec ZEND. En effet après analyse plus détaillée de mes modifs, analyse complémentaire faite pour valider mes propos (rédaction en cours de ma réponse), il apparait que j'avais oublié d'effacer un test d'include du PdoStatement de Zend dont la fonction "execute" (instanciation dans ZEND PDOStatement correspondant à la définition d'une interface PDO) et qui, incomplète et présente pour test, masquait celle de PDO.
Si l'exécution ne se termine pas sur une erreur INVALID PDOStatement dans le premier PDOStatement retourné par prepare (16667 c),
par contre le problème d'origine est réglé dans son principe.
Les conséquences et la cohérence liée
Comme la classe abstraite TikiDB définit les méthodes Set et Get de la base via une private static (méthode du singleton), à partir du moment où pour exécuter les fonctions PDO énumérées plus haut (setAttribute, getAttribute et prepare) définies maintenant dans la classe TikiDb_Pdo accessible à l'instance TikiDb:get() il faut bien que ces fonctions appliquent les fonctions PDO à l'instance. Alors il faut que TikiDb::get() puisse être utilisé dans une fonction de la classe TikiDb_Pdo qui hérite de la classe TikiDb. Evidemment cela ne passe pas, c'est considéré à juste titre comme un erreur de syntaxe.
Il faut utiliser le nouveau "nom" clef (je préfère à "mot" utilisé dans la doc) apparus en 3.3.x "parent" et on écrira parent::get()->execute(array(''));
Nota: Quand on examine la classe TikiDb_Pdo on voit qu'il existe un doublon "évolutif" du singleton et c'est potentiellement la pagaille. Evidemment sans le nom clef parent cela ne pouvait pas fonctionner.
J'ai donc nettoyé le code pour que la private $db non statique de la classe
TikiDb_Pdo soit une fois créée attribué comme singleton et que seul le singleton soit utilisé.
J'en conclus que lors du développement de la version 4.1 l'équipe TikiWiki a été confrontée à ce problème, et a fonctionné avec 3.2 qui permettait d'accéder à un objet PDO surclassé en TikiDb_Pdo, ce qui ne marche plus de la même manière avec 3.3.x.
Les modifs sont uniquement dans les classes et sont donc rapides à mettre en place.
Conclusion
Il y a bel et bien masquage des fonctions PDO par le surtypage détaillé plus haut en 3.3.x qui n'existait pas en 3.2 et 3.3 permet grâce à "parent" de traiter le problème dans la définition des classes.
En ajoutant les fonctions utiles à la classe TikiDb_Pdo (setAttribute, GetAttribute, prepare) comme interface vers les fonctions PDO on traite le problème, cela nécessite d'utiliser "parent", sinon point de salut.
Je suis donc maintenant convaincu qu'il s'agit d'un comportement normal de 3.3.x (cela me semble bien dans le sens des mécanismes d'héritage voulus) et 3.2.x acceptait normalement par nécessité une telle séquence donnant accès aux fonctions PDO dns la racine.
Pour sa part l'objet PDOStatement retourné est vu correctement par PDO (extension).
Par contre le statement est cossu et une erreur fatale est générée. La raison est ailleurs, peut-être dans les problèmes de cohérence des instances $db. 3.3 permettant de finir une programmation propre.
Eh bien voilà, j'aurais peut-être très bientôt un version windows (et autre plateformes) de tikiwiki tournant en php3.3 ce qui de toute évidence n'était pas le cas. Je pourrais donc proposer une 4.11.
Merci de me confirmer que mes propos semblent cohérents sous tous leurs aspects.
Je testerai WampServer sur un serveur qui tourne sous 2000 Server.
Il n'y avait donc pas de problème lié à la configuration globale proprement dite de php et des extensions (sous réserve d'aboutir), mais un sacré problème de "versionning" avec cohérence entre TikiWiki et Php.
Enfin un détail : à propos mysqli_pdo.php, j'avais trouvé cette info dans un document de bonne facture concernant php6 et que j'ai provisoirement égaré, il contenait notamment une liste d'extensions Php6. dont mysqli_pdo.dll
Merci d'avance
trebly