Classes "extendue" de PDO

ViPHP
ViPHP | 3607 Messages

26 nov. 2006, 17:41

Désolé d'avoir répondu aussi tardivement mais des fois en est pas maître de son temps.
je n'accepte pas tes excuses, étant donné qu'elles n'ont pas lieues d'êtres :oops: et j'en profite pour te remercier encore pour le temps que tu as pris (et prendra :langue: ) pour m'aider!!!
Bon j'ai appliqué tes conseils, et ça marhce à merveille!!!
Maintenant que j'ai résolu à peu près les problèmes de méthodologie, et qe je comprend mieu PDO, je vais me lancer pour construire réellement ma classe "extendue"...
Première partie résolue, mais je laisse le post ouvert, parceque je suis pas encore au bout :roll:

Invité
Invité n'ayant pas de compte PHPfrance

26 nov. 2006, 18:59

Désolé, j'avais posté sans voir ton message.
foreach itère, que retourne $dbh->query ?
$dbh->query() Retourne une ressource

EDIT :
Et là je m'apperçois que c'est QQ d'autre. Je crois que je ne vois plus clair, ça doit être l'heure :oops:
c'est vrai que dans la doc il notes:
Une fonctionnalité intéressante de PDO::query() est qu'il vous permet d'itérer à travers un jeu de résultats retourné par une requête SELECT exécutée avec succès.
Et un peu plus bas dans les réactions on peut lire
When query() fails, the boolean false is returned.

ViPHP
ViPHP | 3607 Messages

26 nov. 2006, 23:56

Bon je sais pas si je fait bien de continuer de poster içi...?
en tout cas j'ai une question supplémentaire...
dans ma méthode pour récupérer le nombres de requêtes, je souhaite mettre un argument pour choisir si on veut le nombres de requêtes préparées, non-préparées, ou les deux...
et j'aimerai définir ça avec des constantes, la question que je me pose, c'est où définir ces constantes... dans la fonction ou dans la classe?
public function getnbrQuery($opt=BOTH){
  switch ($opt) {
    case 1:
      $valeurderetour = self::$nbrQuery;
      break;
    case 2:
      $valeurderetour = self::$nbrPreparedQuery;
      break;
    case 3:
      $valeurderetour = array('query'=>self::$nbrQuery,'preparedquery'=>self::$nbrPreparedQuery);
      break;
    default:
      $valeurderetour = self::$nbrQuery + self::$nbrPreparedQuery;
  }
  return $valeurderetour;
}
merci d'avance

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 00:33

Bonsoir,

Avant de poursuivre, une petite mise en garde.

Une requête préparée n'utilise pas la méthode $dbh->query().

Elle utilise la méthode $dbh->prepare() pour la préparation (soit en SELECT, UPDATE, INSERT, DELETE, ....), pour toutes.

Une fois la requête préparée elle n'utilise pas non plus $dbh->query() mais $dbh->execute().

Concernant la déclaration des constantes de class, tu dois utiliser le mot-clé const comme ceci
<?php
class MyClass {
   const QRY_TYPE_SELECT = 0;
Cette constante peut être utilisée en dehors de la class sans avoir instentier la class, elle s'utilise de la même manière, dans la class ou à l'extérieur.
switch($choix){
   case MyClass::QRY_TYPE_SELECT :
      .....
      break;
   default :
      ....
}
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 01:01

Merci pour la mise en garde, j'avais bien noté cette différence...
je vais donc avoir :
  • variable qui compte le nombre de requête directe (que ce soit avec query ou exec, si ce n'est pas une requête préparée...)
    variable qui compte le nombre de préparation de requêtes.
    variable qui compte le nombre requête préparée éxécutée.
en même temps, je ne sais pas si la distinction est forcément nécessaire, c'était juste pour améliorer, mais disons que je me servirai seulement du nombre de requête en général...
enfin bon tu as un avis sur la méthode pour affiner le omptage des types de requêtes?
merci pour la réponse au sujet des constantes

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 01:17

Re,

Comme tu l'as déjà compris avec les requêtes préparées la chose se complique avec la façon que tu emploies.

En plus $dbh->execute(), elle même peut être exécutée de manières différentes,
si tu utilises un tableau en paramètres ou bien si tu as utilisé la méthode $dbh->BidnParams() avant (dans ce cas, sans paramètres).

Ceci est valable pour toute requête (sense SQL - select, insert, drop, ...)

Et ça se compliquera d'avantage si tu utilises les transactions (InnoDB).

Je te laisse réflechir à tout ça (pense à la démonstration par l'absurde)
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 19:00

Bon j'ai essayer de mettre un peu à plat ce que je sais sur les méthodes qui utilisent des querys...
Je pense déja qu'il n'y a que trois types de choses à compter:
  • Les requêtes directe: $nbrDirectQuery;
  • Les préparations de requêtes: $nbrPreparedQuery;
  • les requêtes préparées et éxécutées: $nbrExecutedPreparedQuery;
Bon alors tout d'abord, les requêtes directes et leurs méthodes:
  • PDO::query
  • PDO::exec
sur chaque appel à ces méthodes, je fait un self::$nbrDirectQuery+=1
ensuite les préparations de requêtes:
  • PDO::prepare
la je fait sur chaque appel un self::$nbrPreparedQuery+=1
et les éxécutions de requêtes préparées:
  • PDOStatement::execute
la c'est self::$nbrExecutedPreparedQuery+=1

J'ai aps trop compris lorsque tu me demandes d'utiliser la démonstration par l'absurde?

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 19:59

Bonjour,

C'est le type de réflexion, la démonstration par l'absurde, en simplifiant beaucoup consiste à démontrer que le contraire est absurde (pas de démontrer que ce qui est affirmé est juste)

En gros je voulait te dire "si avec la partie en avant (query, prepare, execute) j'ai des soucis, si je m'y prennais dans l'autre sens ?"

C'est à dire une fois la requête exécuté (sans dépendre du type ni de la méthode) j'ai seulement 2 types (je ne compte pas les erreurs) de résultats possibles....

Tu vois où je veux en venir ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 20:07

Tu voudrais que je fasse le traitement en aval?
Par exemple sur les méthodes fetchxxx ?
ou sinon j'ai rien compris :cry:

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 20:14

Pas sur les méthodes fetch(), une méthode fetch() ne sera jamais utilisée pour un "INSERT, etc...".
Mais avant le retour des execute.

Je fais mon execute (succès), je retourne quoi ? un objet PDOStatment ou autre chose (je vérifirais mais je crois c'est un entier)

Si c'est un PDOStatment -> Requête de type "SELECT"
Si c'est un entier (à vérifier) -> requête de type "ACTION"

tu vois ????
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 20:21

bon alors si j'ai bien compris, je fait quelquechose comme ça:(sur toutes les méthodes)
public function query($q)
    {
      try{
        self::$nbrQuery+=1;
        $retour = parent::query($q);
      }catch(PDOException $e){
          throw $e;
      }
      if(is_numeric($retour)){
        self::$nbrequetedetypeselect+=1;
      } else {
        self::$nbrrequetedetypeaction+=1;
      }
      return $retour;
    }

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 20:44

Mais NON........

Qui te pose PB ?
C'est les execute, non?
pour les query tu sais quelle ne supporte que le type "SELECT"
Parcontre execute() supporte les deux (avec prepare()).

Aussi ton test est inversé
numérique -> action
PDOStatment -> "SELECT"
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 21:40

bon je croit que faut déja remettre à plat ce que je souhaite avoir...
Je veux simplement faire la différence entre requête directe (que ce soit select, update, delete ou autre...) et requêtes préparées (toutes requêtes confondues également)....
en fait je croit que je m'embrouille dans la semoule de purée =P~

Invité
Invité n'ayant pas de compte PHPfrance

27 nov. 2006, 23:04

Bon je sais pas si je fait bien de continuer de poster içi...?
C'est une blague ?!
Tu postes des questions sur une erreur en rapport avec un message d'erreur que tu n'attends pas, 2 intervenants te donnent des éléments de réponse et tu les méprises ainsi !! Tu ferais mieux de changer de mentalité que simplement de forum !

Pour en revenir aux types de retour de la méthode en question, en bon français elle dit qu'en cas de succès un ensemble de résulats est retourné (en gros un tableau sur lequel on peut itérer) et si ça foire un booléen == FALSE. Dans ce dernier cas (et si tu ne testes pas le retour) tu itères (d'après ton code) sur un booléen, exemple simplifié :

Code : Tout sélectionner

$resultat = FALSE; foreach($resultat as $value) {...}
Normal que ça plante et que ça retourne le message d'erreur que tu as toi-même donné, non ? Sauf si la doc n'est pas bonne...

ViPHP
ViPHP | 3607 Messages

27 nov. 2006, 23:40

C'est une blague ?!
Tu postes des questions sur une erreur en rapport avec un message d'erreur que tu n'attends pas, 2 intervenants te donnent des éléments de réponse et tu les méprises ainsi !! Tu ferais mieux de changer de mentalité que simplement de forum !
Dis donc l'ami, je pense être loin de mépriser qui que se soit, et je suis bien le dernier à demander des solutions toutes faites à la manière de beaucoup, j'aide également beaucoup de personnes (du moins dans le cadre de mes compétences), et je n'appréci vraiment pas le fait de me faire remballer par des personnes qui n'ont rien à voir avec le sujet et qui ne savent pas les contributions que j'ai apporté sur ce forum!!!!!!
Quand j'ai dis je ne sais pas s'il faut que je continu de poster içi, c'était simplement que c'était tout de même un sujet un peu différent que le post de départ, nouveau sujet, nouveau post!
Et je te prierai simplement de laisser le boulot de modérateur aux modérateurs (la personne qui m'a aidé sur ce sujet et également modérateur, et ne manquera pas de me rappeler à l'ordre si le besoin s'en fait sentir!)...
sur ce bonne soirée