begin process at 2012 05 28 20:41:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Classes & Objets

 > 

Class requêtes


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Class requêtes

mercredi 28 octobre 2009 à 08:49:58 | Class requêtes

eltyty

Bonjour,

je souhaiterai avoir votre avis quant à la pertinence de ma classe. Il s'agit d'une classe pour l'insertion dans une table. Je souhaitais utiliser prepare pour optimiser cette requête mais j'espère avoir bien compris.
Donc voici le code et merci pour vos avis et conseil.

Code PHP :
class requetes{

    function __construct(){
        $this->connexion=SPDO::getInstance();
    }

	/**
	*	MISE À JOUR ET INSERTION DANS UNE TABLE
	**/
    PUBLIC FUNCTION modifyTable($table, array $set, $condition = NULL)    {
        IF(!EMPTY($condition))    {
			try{
				array_walk($set, create_function('&$val, $key', '$val = "$key = \'$val\'";'));
				$this->req="UPDATE ".$table." SET " . implode(", ", $set) . " WHERE ".$condition;
				$this->connexion->exec($this->req);
			}
			catch(PDOException $e)	{
				throw new myException("Erreur de mise à jour = ".$this->sql." <u>Message</u> : ".$e->getMessage());
			}
		}
        ELSE    {
            try{
				$nb=count(array_keys($set));
				$tab=array_keys($set);
				$this->sql = "INSERT INTO ".$table." (" . implode(", ", array_keys($set)) . ") VALUES (:".implode(", :", array_keys($set)).")";
				$this->statement = $this->connexion->prepare($this->sql);

				FOR ( $i=0; $i<$nb; $i++ ){
					$this->statement->bindParam(':'.$tab[$i], $set[$tab[$i]]);
				}
				$this->statement->execute();
            }
			catch(PDOException $e)	{
                throw new myException("Erreur d'insertion = ".$this->sql." <u>Message</u> : ".$e->getMessage());
            }
        }
    }
}


Et voici comment je l'intérroge :
-L'ajout
Code PHP :
 		$set = array();
		$set["date_erreur"] = addslashes("text");
		$set["texte_erreur"] = addslashes("texte 2");
		$requete_table->modifyTable("table", $set);

-La modification
Code PHP :
 		$set = array();
		$set["date_erreur"] = addslashes("texte");
		$set["texte_erreur"] = addslashes("text 2");
		$valeur_recherche= addslashes("clef de recherche");
		$requete_table->modifyTable("table", $set, "texte_erreur='".$valeur_recherche."'");


Merci pour vos suggestions et vos amélioration. J'aimerai bien que cela me serve de base et que le traitement soit optimiser.
mercredi 28 octobre 2009 à 16:12:01 | Re : Class requêtes

neigedhiver

Salut,

J'ai du mal à comprendre ton array_walk() avec create_function(). Ce serait pas plus clair avec un foreach ? (et plus performant par la même occasion, j'ai déjà benché : array_walk() est lent).

Je pense qu'il serait plus propre d'avoir 2 méthodes distinctes pour l'insertion et pour la mise à jour (mais c'est mon avis perso, hein).

Je ne comprends pas pourquoi ta classe n'étend pas, tout simplement, PDO (ou SPDO qui semble être ta classe étendue). Ca me semblerait plus simple, plus cohérent, mais là encore, libre à toi d'écrire ta classe en suivant le motif de conception de ton choix.

Dans l'utilisation, il n'est pas nécessaire d'utiliser la fonction addslashes() puisque la méthode prepare() de PDO s'occupe d'échapper les caractères spéciaux (y compris les guillemets si besoin est). Ca fait doublon, quoi, mais c'est pas une faille ou une réelle erreur (ça ne plantera pas, et ça ne rendra pas le code plus ou moins vulnérable).

L'utilisation des blocs try...catch ne me parait pas nécessaire, puisque je ne crois pas que PDO::exec() lance d'exception : il n'y a donc rien à attraper... Par contre, vérifier que la requête s'est bien exécutée en comptant le nombre de ligne affectées (attention, en cas d'update, la valeur retournée peut parfois surprendre, notamment lors de l'utilisation de ON DUPLICATE KEY...)

Les noms des fonctions et les mots clés sont supposés être écrits en minuscules (PHP est sensible à la casse, il est fort possible que PHP renvoit des erreurs de type WARNING, mais que la configuration ne les affiche pas).

Euh voilà tout ce que je peux en dire pour le moment ;)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 28 octobre 2009 à 16:39:35 | Re : Class requêtes

eltyty

Et bien ça fait beaucoup de chose. Par contre comment veut tu remplacer ma fonction array_walk() avec create_function() par foreach ?

Quant au fait de mettre try catch et ça me lance une exception en cas d'erreur

Toi tu utilise une class de se genre ? car sur le net je ne trouve pas d'exemple donc c'est pas évident

Merci pour ces infos je vais essayer de rectifier ça même si j'aimerai bien avoir des exemples

Bonne journée
mercredi 28 octobre 2009 à 18:02:45 | Re : Class requêtes

neigedhiver

array_walk() parcourt un tableau pour appliquer une fonction sur chaque élément du tableau. Donc, ça, on peut le faire avec foreach(). Quant à create_function(), étant donné ta fonction anonyme, il est tout à fait possible de la remplacer par... du code PHP qui fait la même chose. Mais j'ai du mal à voir ce que tu veux faire avec cette fonction anonyme...

Ton bloc try...catch ne va jamais lancer d'exception, parce qu'il n'en interceptera jamais. Les fonction PDO::exec() et PDOStatement::execute() renvoient uniquement un booléen et ne lancent pas d'exception. Ton bloc try...catch est donc inutile : il faut vérifier si la fonction s'exécute correctement ou non (si elle renvoit TRUE ou FALSE) pour savoir si une erreur s'est produite.
PDO::__construct() lance une exception, mais elle est en dehors de tes bloc try...catch

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 28 octobre 2009 à 20:16:06 | Re : Class requêtes

kohntark

Membre Club
Salut,

Ton bloc try...catch ne va jamais lancer d'exception, parce qu'il n'en interceptera jamais. Les fonction PDO::exec() et PDOStatement::execute() renvoient uniquement un booléen et ne lancent pas d'exception.


Toutes deux peuvent lever des exceptions, tout dépend du traitement demandé (via PDO::ATTR_ERRMODE)

Cordialement,

Kohntark -

mercredi 28 octobre 2009 à 20:27:04 | Re : Class requêtes

neigedhiver

Ok. Au temps pour moi (une fois de plus pfffffffffffffffff). C'est que je ne configure jamais cette option, je laisse par défaut la valeur à ERRMODE_SILENT.
Mais encore une fois de plus supplémentaire (et sans vouloir faire de pléonasme) quand on n'a pas toutes les infos sur ce que fait/veut la personne, on fait c'qu'on peut avec c'qu'on a ^^ (ça, c'est pour mon autodéfense)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
mercredi 28 octobre 2009 à 21:31:01 | Re : Class requêtes

eltyty

ok merci pour ces infos. En fait je cherche à produire une classe regroupent toutes les fonctions d'action sur une table : add, supp et up
Il est vrai que j'avais l'option PDO::ATTR_ERRMODE donc un message avec try catch

Je vais essayer d'optimiser tout ça alors. Par contre qq'un connaît une classe similaire à ce que je veux faire car j'ai beau chercher

Merci déjà.
jeudi 29 octobre 2009 à 06:27:08 | Re : Class requêtes

neigedhiver

Ce que tu veux faire, c'est implémenter le modèle CRUD (Create / Read / Update / Delete). Et des classes basées sur PDO qui implémentent ce modèle, ça doit déjà exister... jette un oeil par là : http://www.google.fr/#q=crud+pdo

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
jeudi 29 octobre 2009 à 08:34:03 | Re : Class requêtes

eltyty

Encore une fois merci, pffff ... je ne connaissais pas le terme CRUD donc toutes mes recherches étaient vaines

mais grâce à toi je pense que j'ai trouver un exemple qui m'aidera sûrement.

Penses-tu que cet exemple est un bonne exemple à suivre ? : http://www.phpro.org/classes/PDO-CRUD.html

Merci et bonne journée.
jeudi 29 octobre 2009 à 21:50:42 | Re : Class requêtes

eltyty

Je reviens vers ce sujet car après avoir trouvé une class sympa, je trouve des difficultés à utiliser cette fonction :
Code PHP :
PUBLIC FUNCTION queryObjectArray()    {
        try        {
            $this->stmt->execute();
            while ($result = $this->stmt->fetch(PDO::FETCH_OBJ))            {
                $resultsObjectArray[] = $result;
            }
            if (isset($resultsObjectArray))            {
                return $resultsObjectArray;
            }
        }
        catch (PDOException $e)        {
            printf("<p>Exception: %s</p>\n", $e->getMessage());
            exit();
        }
    }  


La requête préparé est correct mais je n'arrive pas à afficher quoi que ce soit.
Code PHP :
$db->select('*', 'rubriques', 'id_rubrique > ?');
$db->bindValues(array('8'));
$rows = $db->queryObjectArray();
$nb=count($rows);

$nb me donne bien le nombre correct mais ça :
Code PHP :
for ($i=0;$i<$nb;$i++){
   echo $i." - Test ".$rows['id_rubrique']."<br />";
}

ne donne rien... et j'ai essayer plusieurs autre manière. Là je ne comprend pas.
Pour infos, il s'git de la class : http://oopgarden.richardknop.com

Si qq'un peux me dire s'il estime cette classe correcte et comment faire pour afficher la liste via cette fonction. Merci.

1 2

Cette discussion est classée dans : set, table, code, erreur, array


Répondre à ce message

Sujets en rapport avec ce message

pepin avec un mysql_fetch_array() [ par justine75 ] bonjour!voilà j'ai un petit problème que je n'arrive pas à éluciderle voici : Warning: mysql_fetch_array(): supplied argument is not a valid MySQL res erreur php [ par zebu238 ] Bonjour,Celà fait quelques heures que je bute sur une erreur qui doit être toute bête.[code]while($array = mysql_fetch_array-($requete)){   echo' Besoin d'aide pour comprendre Array_walk [ par eltyty ] Bonjour, j'ai vu dans google code la ligne suivante : [code=php] array_walk($set, create_function('&$a', 'if(isset($a)): $a = "\'".AddSlashes($a)."\' Message d'erreur [ par docteursas ] Salut à tous, j'ai un probleme avec un code. J'utilise un fichier include.php pour appeler d'autres page sur ma page index.php voici le code dans le f recherche bdd et mise a jour dans la table [ par Jarod1980 ] Bonjour, Je suis en train de mettre en place une petite application permettant de rechercher une personne dans ma base de données. Une fois la person erreur de codage avec une condition si dans tableau (td) [ par sebing ] Bonjour, Je souhaite rajouter une condition à mon tableau. je voudrais que le lien "modifier" apparaissent que si c'est le membre qui est connecter. affichage d'une erreur lors de connection a ma base de données [ par jcoq6340 ] slt, je viens de débuter avec php. voila mon problème ce code permet de saisir des infos(un pseudo et un message) et les sauvegarder dans une base de bonjour, petit soucis une erreur bete je pense [ par jerome33610 ] Bonjour, Pouvez-vous m'éclairer ? J'ai une erreur mais je ne met pas le doigt dessus, voyez ci-dessous voici l'erreur trouvé : Warning: mysql_fetch erreur : Warning: mysql_fetch_row() [ par laloire33150 ] Bonjour, j'ai une erreur que je ne trouve pas, pouvez vous m'aider : erreur : [code=autre]Warning: mysql_fetch_row(): supplied argument is not a va Problème simple de tableau (enfin je pense) [ par wiz4rd ] Bonjour, j'ai un soucis quand j'utilise la fonction [url=http://www.manuelphp.com/php/function.array-multisort.php]array_multisort()[/url]: Voici le


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,385 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales