Discussion:
La classe PDO est-elle ancetre ou descendan te de la classe PDOStatement ?
(trop ancien pour répondre)
Jean-Francois Ortolo
2010-01-23 20:09:19 UTC
Permalink
Bonjour

J'ai essayé de trouver la réponse dans le PHP Manual en utilisant le
formulaire "Search for", mais je n'y suis pas arrivé. Aucun critère ne
mène à une réponse à cette question.

Mon précédent message sur le même sujet, a été refusé par le
modérateur. Je me suis conformé à son avis, et j'ai donc essayé
d'obtenir l'information désirée sur le PHP Manual, sans succès.

J'espère que le modérateur acceptera mon message, qui peut intéresser
les programmeurs php cherchant à construire des classes utilitaires par
dessus la classe PDO.

Vous connaissez la classe PDO, qui est l'interface objet d'accès aux
bases de données.

La classe PDOStatement, quant à elle, contient toutes les fonctions
rendant les résultats de ces requêtes ( par exemple fetch(), rowCount()
, ... )

Ma question est : Est-ce que la classe PDOStatement, est ancêtre ou
descendant de la classe PDO ?

Etant donné que cette classe constitue ( peut-être ? ) une surcouche
de PDO, PDOStatement ne serait-elle pas dérivée de PDO ?

J'ai besoin de la réponse à cette question, car j'ai fait une classe
MyPDO extends PDO surchargeant la fonction rowCount(), ce qui ne peut se
concevoir que si la classe PDOStatement est père ( ou + ) de la classe
PDO, puisque cette fonction rowCount() est censée appartenir à la classe
PDOStatement. A ce moment-là cette fonction rowCount() de la classe père
( ou + ) PDOStatement, peut être surchargée dans la classe PDO.

Dans ce cas-là pas de problème.

Sinon, cette fonction rowCount() est nouvelle dans MyPDO, et la
classe PDOStatement est bien descendante de la classe PDO, mais pas de
ma classe MyPDO, ce qui pourrait me poser des problèmes.

Je vous fais cette question, essentiellement pour simplifier au
maximum le code de ma classe MyPDO, compte tenu du fait qu'actellement,
cette classe fonctionne, mais il se peut qu'une partie du code que j'ai
mis ne serve à rien.

Merci beaucoup de vos réponses.

Bien à vous.

Amicalement.

Jean-François Ortolo
Olivier Miakinen
2010-01-24 11:25:06 UTC
Permalink
Post by Jean-Francois Ortolo
Vous connaissez la classe PDO, qui est l'interface objet d'accès aux
bases de données.
Non, mais je vais chercher dans la doc :

<http://fr2.php.net/manual/en/class.pdo.php>
Post by Jean-Francois Ortolo
La classe PDOStatement, quant à elle, contient toutes les fonctions
rendant les résultats de ces requêtes ( par exemple fetch(), rowCount()
, ... )
Idem :

<http://fr2.php.net/manual/en/class.pdostatement.php>
Post by Jean-Francois Ortolo
Ma question est : Est-ce que la classe PDOStatement, est ancêtre ou
descendant de la classe PDO ?
<cit. http://fr2.php.net/manual/en/class.pdo.php>
PDO {
...
}
</cit.>

<cit. http://fr2.php.net/manual/en/class.pdostatement.php>
PDOStatement implements Traversable {
...
}
</cit.>

Je suppose que si l'une des deux classes héritait de l'autre on aurait
le mot « extends » dans l'un des deux /class synopsis/, non ?
--
Olivier Miakinen
Jean-Francois Ortolo
2010-01-24 14:17:20 UTC
Permalink
Post by Olivier Miakinen
<cit. http://fr2.php.net/manual/en/class.pdo.php>
PDO {
...
}
</cit.>
<cit. http://fr2.php.net/manual/en/class.pdostatement.php>
PDOStatement implements Traversable {
...
}
</cit.>
Je suppose que si l'une des deux classes héritait de l'autre on aurait
le mot « extends » dans l'un des deux /class synopsis/, non ?
Bonjour Monsieur

Le but que je poursuivais, était de fixer ma classe MyPDO, qui permet
simplement, de disposer d'une fonction rowCount(), après une query()
aussi bien qu'après exec() ou prepare() et execute(). Ce problème est
résolu.

J'ai modifié et simplifié la classe MyPDO que j'ai implémentée, pour
me donner le choix entre une fonction rowCount(void) et une fonction
rowCount($sql), $sql étant la requête obligatoirement paramètre de cette
fonction durant l'appel, et contenant la requête sql précédemment
envoyée dans la fonction MyPDO::query($sql) précédente.

Ce choix se fait simplement en commentant/décommentant les lignes de
ces deux fonctions.

il se trouve, que je suis en train de faire une migration automatique
d'un site web sur mon ordinateur, des fonctions mysql_*() vers
l'interface PDO, et je suppose, qu'il soit possible de rencontrer
plusieurs appels à mysql_query($sql, $conn) ou mysql_db_query($base,
$sql), avant de rencontrer une fonction mysql_num_rows($res), le nom de
la variable $res indiquant quelle est la fonction mysql_query() à
prendre en compte, qui n'est donc pas nécessairement la plus récente
dans le code, ce qui serait nécessité par l'implémentation de
MyPDO::rowCount(void).

Avec une fonction PDO::rowCount($sql) , j'ai la possibilité de
transmettre à cette fonction déclarée dans la classe MyPDO, la requête
de la fonction mysql_query mémorisée dans une array
requete[$nom_de_variable] = $sql, à chaque fois que je rencontre dans le
code initial une affectation du type ${$nom_de_variable} =
mysql_query($sql, $conn).

Evidemment, celà suppose, que je puisse savoir si $sql ( ou son
équivalent chaîne de caractère ) contient ou non le token "^[
\t]*[Ss][Ee][Ll][Ee][Cc][Tt][ \t]+" , et donc dans tous les cas où il y
a affectation dans une variable d'un tel token, mémoriser dans une autre
array requete_debut[$nom_de_variable] la valeur 1 si c'est SELECT, ou 0
sinon. Je suppose quand même, que la requête de mysql_query() (
censément $sql ), comporte au pire une variable ainsi mémorisée par son
nom $nom_de_variable, et savoir ainsi si je dois prendre en compte ce
mysql_query($sql, $conn), et le traduire en MyPDO::query($sql) ou
MyPDO::exec($sql) , et aussi, mémoriser $sql ( ou l'ensemble de la
requête de mysql_query() ), dans requete[$tmp] ou $tmp = "nom_de_variable".

Ainsi, au moment où je rencontre une fonction mysql_num_rows($res),
j'affecte "res" à $tmp par exemple, et puis je remplace
mysql_num_rows($res) par $conn->rowCount($requete[$tmp]) , et le tour
est joué.

Je reconnais, que s'il y a plusieurs indirections entre la première
variable contenant le début de la requête sous forme chaîne de
caractères, et la variable $sql finale, j'ai un bug, mais... ;(

Que pensez-vous de cette approche ?

Dans mon cas, ( celà simplifie la migration ), l'objet de connexion
rendu par MyPDO($dns, $login, $password) , est toujours $conn.


Merci beaucoup de vos réponses.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
donnant des Statistiques, Pronostics et Historiques graphiques
très élaborés.

Les Statistiques sont calculées d'après une base de données
allant du 1er Janvier 2000 jusqu'à très récemment.
Continuer la lecture sur narkive:
Loading...