Jump to content

[Résolu] Requête SQL - Impossible de récupérer les données


Recommended Posts

Bonjour,

Je suis en train de développer un module de réservation de produit.
Ce développement m'amène à éxecuter un script SQL dans mon reservation.php.
Le voici:

$result = Db::getInstance()->getRow("
           SELECT id_reservation
           FROM `prestashop`.`"._DB_PREFIX_."reservation`
           WHERE id_product='".$idProduit."' AND id_customer='".$idCustomer."'
           LIMIT 0,1
           ");


Lorsque j'exécute ce code sur MySQL, no problème mais impossible de récupérer la valeur dans mon code :o
(J'ai demandé à mon code qu'il m'affiche la requête, puis je la colle dans phpMyAdmin)

Je me prend la tête depuis plusieurs heures sur ce problème... si vous aviez une idée du problème ça serait un soulagement !

Voici un code qui fonctionne (toujours dans reservation.php :o):

$result = Db::getInstance()->ExecuteS("
       SELECT r.id_product, p.name
       FROM `prestashop`.`"._DB_PREFIX_."reservation` r
       JOIN  `prestashop`.`"._DB_PREFIX_."product_lang` p ON r.id_product=p.id_product
       WHERE r.id_customer='".$idCustomer."' AND p.id_lang='$idLang'
       ORDER BY `order`
       ");

       $smarty->assign(array(
           'this_path' => $this->_path,
           'products' => $result));
       return $this->display(__FILE__, 'reservation.tpl');



Ce code envoi la variable à mon .tpl qui va se charger d'afficher les réservations.

Merci!

Link to comment
Share on other sites

Bonjour, vous avez essayé $result['id_reservation']
Vous devriez utiliser des noms plus spécifiques : products en smarty ça risque d'etre déjà pris et de poser problème.

nb : désolé d'être franc mais vos quelques lignes de codes sont vraiment pas très jolies jolies. Je suis surpris que le 2eme code fonctionne quand je vois : id_lang='$idLang'

Link to comment
Share on other sites

Bonjour,

J'ai essayé plusieurs non de variables...
Et ce n'est pas dans smarty que je le gère ça !

Je voudrais en faite récupérer l'ordre de réservation en vue de l'incrémenter pour l’insérer lors de l'ajout de la ligne de réservation en BDD.

id_lang=’$idLang’ => La franchisse c'est ce que je préfère ^^
En effet, cela n'aurait pas du marcher mais je ne vous ai pas donné tout le code !

Ce que je vais faire de suite:

public function hookleftColumn($params)
   {
       global $smarty, $cookie;
       $idCustomer=$cookie->id_customer;
       $idLang=$cookie->id_lang;

       Tools::addCSS(($this->_path).'global.css', 'all');

       if (Tools::isSubmit('Submit')){

           $idProduit=Tools::getValue('id_product');


           $result = Db::getInstance()->getRow("
           SELECT id_reservation
           FROM `prestashop`.`"._DB_PREFIX_."reservation`
           WHERE id_product='".$idProduit."' AND id_customer='".$idCustomer."'
           ");
           // echo $result['id_reservation'];

           if (!$result['id_reservation']) {

               $result = Db::getInstance()->getRow("
               SELECT COUNT(*) AS i
               FROM `prestashop`.`"._DB_PREFIX_."reservation`
               WHERE id_customer='".$idCustomer."'
               ");

               $nbReservation=$result['i'];

               $result = Db::getInstance()->ExecuteS("
               INSERT INTO `prestashop`.`"._DB_PREFIX_."reservation`
               (`id_reservation`, `id_product`,
               `id_customer`, `date_add`,`order`) 
               VALUES (NULL, '$idProduit',
               '$idCustomer', '".time()."','$nbReservation');
               ");
           }
       } elseif (Tools::isSubmit('SubmitAnnuler')) {
           $idProduit=Tools::getValue('id_product');
           $resultCount = Db::getInstance()->ExecuteS("
           DELETE FROM `prestashop`.`"._DB_PREFIX_."reservation`
           WHERE id_product='".$idProduit."' AND id_customer='".$idCustomer."'
           ");
       }

       $result = Db::getInstance()->ExecuteS("
       SELECT r.id_product, p.name
       FROM `prestashop`.`"._DB_PREFIX_."reservation` r
       JOIN  `prestashop`.`"._DB_PREFIX_."product_lang` p ON r.id_product=p.id_product
       WHERE r.id_customer='".$idCustomer."' AND p.id_lang='$idLang'
       ORDER BY `order`
       ");

       $smarty->assign(array(
           'this_path' => $this->_path,
           'products' => $result));
       return $this->display(__FILE__, 'reservation.tpl');
   }



merci de votre aide

Link to comment
Share on other sites

Par pitié faites quelque chose de propre, il y a tellement de choses qui me choquent que je ne sais pas pas d’où le problème peut venir.
Préférez les ' (touche 4) au lieu de " (touche 3),

mettez des ` (touche 7) autour des noms de colonnes,

inutiles de préciser `prestashop`,

mettez des . (=> p.`id_lang`='.$idLang.'),

vous insérez des valeurs dans la table: utilisez autoExecute au lieu de ExecuteS,

Si vous voulez incrémenter alors utilisez une colonne en autoincremente, c’est plus simple et rapide.

J'ai pas compris :
J’ai essayé plusieurs non de variables…
Et ce n’est pas dans smarty que je le gère ça !

Tout ce qui est entre accolades pour if (!$result['id_reservation']) me gène... on compte le nombre d'enregistrements dans la table reservation pour immédiatement après enregistrer ce nombre d'enregistrements dans la même table (reservation), et en plus j'ai l'impression que l’enregistrement se fait automatiquement dès qu'un visiteur voit un produit...

Exemple de code un peu plus propre :

$result = Db::getInstance()->ExecuteS('
       SELECT r.`id_product`, p.`name`
       FROM `'._DB_PREFIX_.'reservation` r
       JOIN `'._DB_PREFIX_.'product_lang` p ON (r.`id_product` = p.`id_product`)
       WHERE r.`id_customer`='.(int)$idCustomer.' 
       AND p.`id_lang` = '.(int)$idLang.'
       ORDER BY `order`ASC
       ');


order à la fin c'est r.`order` ou p.`order` ? à préciser...

Link to comment
Share on other sites

Merci de votre réponse.

Je suis nouveau dans le développement de module mais je connais bien PHP/ MySQL...

Je vous explique en détail mon projet:

Les clients en pourront pas utiliser le panier pour faire leurs achats mais devront faire des réservations.
Pour cela, au clic sur le bouton réservation, je récupère l'ID du produit et je regarde s'il n'est pas déjà dans la liste des réservations avant de l'insérer.
Je ne peux pas utiliser d'auto-incrément étant donné que c'est un ordre et non un ID !
Exemple:

Le client 1 à 2 réservations avec comme ordre (bien évidemment) 0 et 1
Le client 2 à 5 réservations avec comme ordre 0, 1, 2, 3 et 4.

Pour définir l'ordre, il faut donc bien que je compte le nombre de produit déjà présents dans la liste de réservation pour pouvoir l'incrémenter !

J’ai pas compris :
J’ai essayé plusieurs non de variables…
Et ce n’est pas dans smarty que je le gère ça !

Explication:
Je voudrais récupérer le nombre de produits déjà réservés.

Voici ma requête (très sale je vous l'accorde, mais je vais changer cela au plus vite, c'est promis ^^):

$result = Db::getInstance()->getRow("
       SELECT COUNT(*) AS i
       FROM `prestashop`.`"._DB_PREFIX_."reservation`
       WHERE id_customer='".$idCustomer."'
       ");

// je récupère la donnée et je la stock dans une variable
$nbReservation=$result['i'];

// j'insère en base la nouvelle réservation avec comme ordre X (X=nombre de produits déjà réservés)
$result = Db::getInstance()->ExecuteS("
   INSERT INTO `prestashop`.`"._DB_PREFIX_."reservation`
   (`id_reservation`, `id_product`,
   `id_customer`, `date_add`,`order`) 
   VALUES (NULL, '$idProduit',
   '$idCustomer', '".time()."','$nbReservation');
   ");



Lorsque je test la valeur de $nbReservation... elle est nulle !!!
Alors que si j'exécute le code dans phpmyadmin, pas de problème je trouve bien le nombre recherché...

Link to comment
Share on other sites

"Pour définir l’ordre, il faut donc bien que je compte le nombre de produit déjà présents dans la liste de réservation pour pouvoir l’incrémenter !"

Non, puisque vous avez `date_add`

Faites des testes, c'est comme ça que vous apprendrez (est ce que count fonctionne avec getRow?, est ce que les " sont nécessaires dans '".$idCustomer."' ?, et pourquoi pas mettre un (int) comme tout le monde ?, si je ne suis pas connecté (donc pas de idCustomer) que va donner ma requête ?...)

En tout cas pour $nbReservation je n'en vois pas l’intérêt et je pense qu'il est préférable de s'en débarrasser.


EDIT Lorsque je test la valeur de $nbReservation… elle est nulle !!!

Normal, au premier enregistrement on recherche nbReservation dans la tbale : il n'existe pas donc il vaut 0, ensuite on l'enregistre, donc 0. Puis à la réservation suivante on recherche nbReservation dans la table, il vaut 0, on l'enregistre (0), et ainsi de suite, il faudrait mettre $nbReservation+1 lors de l'enregistrement, ou alors ne pas l'utiliser car il ne sert à rien.

Link to comment
Share on other sites

Dans ma table se trouvent déjà 4 enregistrements donc non, ce n'est pas normal que cela me donne aucun résultat !
Si je vous dis que j'ai testé dans phpmyadmin, c'est que je l'ai fait, et je trouve bien 4...

"il faudrait mettre $nbReservation+1 lors de l’enregistrement, ou alors ne pas l’utiliser car il ne sert à rien." => sauf si mon ordre commence à 0 ;)

"Non, puisque vous avez `date_add`" => l'ordre sera modifiable par la suite

"Normal, au premier enregistrement on recherche nbReservation dans la tbale : il n’existe pas donc il vaut 0, ensuite on l’enregistre, donc 0. Puis à la réservation suivante on recherche nbReservation dans la table, il vaut 0, on l’enregistre (0), et ainsi de suite, il faudrait mettre $nbReservation+1 lors de l’enregistrement, ou alors ne pas l’utiliser car il ne sert à rien."
=> Regardez bien ma requête, on COMPTE le nombre de réservations pour le client.
Donc s'il y a un enregistrement il devrait retourner.... 1 et non pas 0.

Mais comme je l'ai dis précédemment, sous phpmyadmin la requête retourne ce que j'attend, alors que dans le code non!

Ma demande concerne juste le problème de récupération de données depuis la base (et non pas "si je suis pas connecté, comment faire", ce sera géré plus tard).

Merci

Link to comment
Share on other sites

Ce genre de détail sera géré PLUS TARD!
Pour l'instant merci de bien vouloir répondre à ma question initiale, qui est :

Pourquoi je n'arrive pas à récupérer dans une valeur, une donnée provenant de ma base de données ??

Merci

Link to comment
Share on other sites

Non, si vous le gérer maintenant vous comprendrez que count pose problème faites plutôt un getRow avec ORDER BY `nbReservation`DESC WHERE `id_customer`...ça vous donnera le nbReservation le plus grand et vous ne l'aurez pas en double

Link to comment
Share on other sites

$result = Db::getInstance()->ExecuteS('
SELECT `order`,
FROM `'._DB_PREFIX_.'reservation`
WHERE `id_customer`='.(int)$idCustomer.' 
ORDER BY `order`DESC
');

$nbReservation=$result['order'];
echo 'valeur:'.$nbReservation;



Voila ce que cela m'affiche: "valeur:"

Si je test sur phpmyadmin (avec EXACTEMENT la même requête car je fais un

echo '
SELECT `order`,
FROM `'._DB_PREFIX_.'reservation`
WHERE `id_customer`='.(int)$idCustomer.' 
ORDER BY `order`ASC
';

), j'ai ceci: order
1

Link to comment
Share on other sites

$result = Db::getInstance()->ExecuteS('
SELECT `order`
FROM `'._DB_PREFIX_.'reservation`
WHERE `id_customer`='.(int)$idCustomer.' 
ORDER BY `order`DESC
');

$nbReservation=$result['order'];
echo 'valeur:'.$nbReservation;



Voila ce que cela m'affiche: "valeur:"

Si je test sur phpmyadmin (avec EXACTEMENT la même requête car je fais un

echo '
SELECT `order`
FROM `'._DB_PREFIX_.'reservation`
WHERE `id_customer`='.(int)$idCustomer.' 
ORDER BY `order`DESC
';

), j'ai ceci: order
1

EDIT: correction d'erreurs

Link to comment
Share on other sites

Ok j'ai trouvé, cela venait du fait que oui je n'avais pas mis getRow mais également que.... le echo fonctionne mal apparemment :o
En effet, impossible d'afficher la valeur, mais l'incrémentation se fait bien en base !

Merci à vous de vous être pris la tête avec moi sur ce sujet ^^
La prochaine fois je post un code propre :)

Link to comment
Share on other sites

Si vous voulez travailler plus rapidement et efficacement, vous trouverez 2 de mes modules (gratuits) "debug" et "table viewer" et sinon j'ai la version ultimate (payante) qui permet de débugger et d'optimiser vos requêtes (le lien est dans la signature, il est aussi sur le prestastore)

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...