Jump to content

parcourir un resultat mysql


Recommended Posts

Bonjour a tous,

 

ce post est mon premier, je me présente donc, je m'appel Ruben, j'ai 24 ans et j'habite sur Marseille.

Je débute dans le développement sous prestashop :)

 

J'ai ajouter a la classe Order une méthode assez simple et qui ne fonctionne pourtant pas :

        public static function getOrderByProductId(){
            	$result =  (Db::getInstance()->ExecuteS('
			SELECT * FROM `'._DB_PREFIX_.'order_detail`
			'));
                $tab = array();
                foreach($result as $row){
                    $tab =  $row['id_order'];
                }
                return $tab;
        }

et voici mon appel de test qui est censé me retourner deux résultats : 

Order::getOrderByProductId(132505)

Cet appel ne me retourne rien.

 

Merci d'avance pour vos réponses.

Link to comment
Share on other sites

Bonjour et bienvenue,

 

Quelques infos pour t'aiguiller :

 

- Ta requête SQL est-elle vraiment ce que tu veux en faire ?

-> En l'occurence, tu essayes de récupérer toute la table ps_order_detail pour après récupérer la liste de tous les id_order dans un foreach (en gros récupérer l'ensemble des id_order depuis le détail des commandes, c'est assez étrange comme raisonnement)

- Il ne te manque pas un WHERE par hasard ? (WHERE id_product = ...)

- Tu appelles ta méthode avec un paramètre, sauf que dans le prototype de la méthode, il n'y a pas d'arguments : public static function getOrderByProductId(?????)

 

Si tu veux quelques conseils un peu plus de l'ordre de la bonne pratique et du MVC en général :

 

- Ne pas toucher au coeur du logiciel, faire un override de la classe dans le dossier /override/ (cf. documentation Prestashop sur la surcharge)

- On est dans les objets métiers, les requêtes ne doivent contenir QUE ce qui concerne le métier. Le traitement (foreach & co) doit se faire dans les controlleurs.

- La méthode devrait se trouver dans un environnement de produit, non pas de commande. En effet, tu appelles une requête de filtrage de commande a partir d'un identifiant produit.

J'aurai plutôt fait une instanciation du produit, avec après un appel de la méthode sur mesure : $product->getOrders() (comme ça, tu as déjà l'identifiant du produit dans l'objet).

- Donner un alias toutes les tables de la requête (SELECT od.`id_order` FROM '._DB_PREFIX_.'order_detail od), ainsi qu'alias sur l'ensemble des colonnes (même pour les petites requêtes, question de lisibilité).

 

Si avec tout ça tu ne trouves pas, je t'invite à nous expliquer plus en détail quel est le but de cette requête, on te filera un bout de code (mais c'est dommage pour un développeur de ne pas trouver soit-même les solutions à ses problèmes).

 

Bon dev !

Link to comment
Share on other sites

Desole pour la version du code que j'ai  fournie, je me suis decider a poser ma questions apres multiples test et j'ai posté ma methode alors que j'etait entre deux tests (j'ai essaye de faire un gros select sans parametre pour simplifier la methode).

 

Par ailleurs merci pour tout ces conseil qui me sont très utiles... Je commence a créer mes nouvelles classes dans le dossier override  ;)

 

Par contre, je ne vois pas bien comment le traitement de mes méthodes peuvent se retrouver dans les contrôleurs ?

 

Et je suis en effet d'accord avec toi ma fierté ne supporterais pas que je fasse a appel au forum pour résoudre mes problèmes de dev et non pas ceux liés au fonctionnement de prestashop lui meme  :)

Link to comment
Share on other sites

Bonjour ruben06 et bienvenue,
 
un peu de lecture sur le les requêtes : http://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/
 
Sinon, ton code n'est pas très bon, (comme la signalé Whoami), il faudrait plutôt mettre :

public function getOrderByProductId($id_product = False)
 {
 $where = ($id_product)? ' WHERE `product_id` = '.(int)$id_product : '';
 return Db::getInstance()->ExecuteS('SELECT `id_order` FROM `'._DB_PREFIX_.'order_detail`'.$where);
 }

soit tu précises l'id_product (quand tu appelles la fonction) et tu as les résultats correspondant, soit tu mets rien et tu as tous les résultats

Link to comment
Share on other sites

Bonjour ruben06 et bienvenue,

 

un peu de lecture sur le les requêtes : http://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/

 

Sinon, ton code n'est pas très bon, (comme la signalé Whoami), il faudrait plutôt mettre :

public function getOrderByProductId($id_product = False)
 {
 $where = ($id_product)? ' WHERE `product_id` = '.(int)$id_product : '';
 return Db::getInstance()->ExecuteS('SELECT `id_order` FROM `'._DB_PREFIX_.'order_detail`'.$where);
 }

soit tu précises l'id_product (quand tu appelles la fonction) et tu as les résultats correspondant, soit tu mets rien et tu as tous les résultats

oui oui j'ai fais un ctrl + z de trop avant de copier mon code desolé pour ca  :wacko:

 

Merci beacoup pour le lien sur les requetes, ca va m'etre bien utile... Ca ne pose pas de probleme si je suis en version 1.4.8 ? Le principe reste le meme?

Link to comment
Share on other sites

oui oui j'ai fais un ctrl + z de trop avant de copier mon code desolé pour ca  :wacko:

 

Merci beacoup pour le lien sur les requetes, ca va m'etre bien utile... Ca ne pose pas de probleme si je suis en version 1.4.8 ? Le principe reste le meme?

 

j'ai trouvé : http://www.prestashop.com/blog/fr/les_bonnes_pratiques_de_la_classe_db_sur_prestashop_14/

 

Merci  ;)

Link to comment
Share on other sites

j'allais te donner le lien mais tu as été plus rapide, globalement c'est +/- la même chose, sauf qu'en 1.4 tu as par exemple :

Db::getInstance()->autoExecute(..., 'INSERT');

alors qu'en 1.5 c'est 

Db::getInstance()->insert(...

et en 1.4 il faut préciser ps_ (_DB_PREFIX_) pour la table utilisée alors qu'en 1.5 non

Link to comment
Share on other sites

Pour revenir a la remarque de Whoami concernant mon choix de la classe order plutôt que celle de product je suis assez étonné par ce qu'il me semble qu’étant donné que je récupère des orders, meme si le tri se fais sur un product_id sa place est dans la classe order non?

 

Link to comment
Share on other sites

C'est une question de point de vue, de contexte, de visibilité et d'utilisation, plein de méthodes fonctionnent.

Je pense qu'on dériverait sur un sujet qui concerne plus l'analyse même du projet que le code en lui-même.

 

Le fait est que, de le faire dans un contexte produit, permet de bénéficier directement des propriétés du produit lui-même, et de traiter la donnée dans un contexte produit.

Par exemple dans ton cas, c'est utile si on veut afficher ces informations sur une page du catalogue ou dans une fiche produit.

 


Exemple : 

// Si le produit est déjà instancé, dans un Controlleur produit par exemple, on déjà toutes les données produit
foreach($this->product->getOrderDetails($this->product->id) as $orderDetails){...}
Alors que de le faire dans l'order via un id product te permet plus de faire ça dans le résumé des commandes, des stats, etc.

En l'occurence, tu sembles faire une boucle sur les order, donc reste dans le contexte order :)

 

C'est un peu moins souple cependant, étant donné qu'il te faut :

 

1°) Récupérer un ID produit passé dans un paramètre quelconque (POST, GET, etc.)

2°) Utiliser statiquement une méthode avec ce paramètre + les contrôles qui vont avec (vérifier que les données en entrée sont valides)

3°) Faire ta boucle d'affichage

 

Néanmoins et je le redis deux fois dans le post, cette question est plus de l'ordre de l'analyse, pas du développement.

 

Les deux solutions marchent bien ;)

Edited by Whoami (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...