utilisation procedure stoké

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

utilisation procedure stoké

Par diallo  -  42 reponses  -  Le 13/06/2017 18:58  -  Editer  - 

bjr
jaimerai savoir comment utiliser une procedure stocké sur une requete sql en php

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 14/06/2017 05:51  -  Haut de page  - 

Salut,
la question est très vague, il serait utile de préciser.

La procédure est-elle écrite et fonctionne-t-elle ?
À partir de quel contexte cette procédure doit-elle être exécutée ?

 
Par diallo  -  Le 14/06/2017 21:44  -  Haut de page  - 

bonjour MR
concretement voici mon problème
je realise une application de gestion de stock j'ai creer les
tables produits, fournisseur, site et jai deux table relationnelle livraison et commande
dans la table commande jai mis la qtite_cmande
j'ai réalisé ce trigger ci dessous pour qu' a chaque fois que la qtité
commandé est superieur a la qtité en stock que le systeme m'informe a travers un message
sinon il enregistre la commande dans la table commande
je voulais passer par une procedure stockée mais apres qlq heure de recherche j'ai decouvert les triggers
mais sa ne marche pas se moi
voici le code

DELIMITER $$
CREATE TRIGGER `before_isert_commande` 
BEFORE INSERT 
ON commande
  FOR EACH ROW 
 BEGIN
SET @qtite=NEW.qtite_livr;
SET @stock=(SELECT stock FROM produits
        WHERE num_prod=NEW.num_prod);
IF @qtite<=@stock THEN
INSERT INTO commande VALUES(NEW.num_prod, NEW.num_site, NEW.date_livr, NEW.qtite_livr);
ELSE
SELECT'la quantite commander doit etre inferieur a la quantite en stock';
END IF;
END $$
 
Par Cyrano  -  Le 14/06/2017 23:48  -  Haut de page  - 

Il y a une synmntace douteuse dans la définition d'une variable utilisateur @stock. Voici une suggestion de correctif :

DELIMITER $$
CREATE TRIGGER before_isert_commande
  BEFORE INSERT
  ON commande
  FOR EACH ROW
BEGIN
  SET @qtite=NEW.qtite_livr;
  SELECT stock INTO @stock FROM produits WHERE num_prod=NEW.num_prod;
  IF @qtite <= @stock THEN
    INSERT INTO commande VALUES(NEW.num_prod, NEW.num_site, NEW.date_livr, NEW.qtite_livr);
  ELSE
    SELECT'la quantite commander doit etre inferieur a la quantite en stock';
  END IF;
END $$

À tester, je ne garantis pas que ça fonctionne, mais la modification est sur la ligne 8 du trigger.

 
Par diallo  -  Le 15/06/2017 00:38  -  Haut de page  - 

Merci pour la réponse rapide je vai testé voir
Mais au cas ou sa marche comment je doit faire en PHP pour informer l'utilisateur que la quantité en stock est inférieur a la quantité commandé via un message

 
Par diallo  -  Le 15/06/2017 02:16  -  Haut de page  - 

J'ai essayé le code sa n'a pas marché voici le code d'erreur qui s'affiche
ERROR 1415(0A000): not allowed to return a result set from a trigger

 
Par diallo  -  Le 15/06/2017 02:16  -  Haut de page  - 

J'ai essayé le code sa n'a pas marché voici le code d'erreur qui s'affiche
ERROR 1415(0A000): not allowed to return a result set from a trigger

 
Par Cyrano  -  Le 15/06/2017 08:48  -  Haut de page  - 

Ok, logique, j'aurais du y penser : c'est la requête dans le ELSE qui plombe le trigger. Le trigger, c'est généralement utilisé pour modifier ou préparer une donnée avant ou après une insertion, mais ça ne retourne rien du tout, ce n'est pas fait pour ça. Et là, je réalise que l'insertion ne devrait pas être faite dans le trigger non plus, parce que là, de la manière dont c'est fait, ça va effetuer deux insertions : celle du trigger d'abord, et celle de la requête qui a déclenché le trigger ensuite.

La solution ne passe pas par un trigger : une simple requête exécutée avant l'insertion sera le plus appropriée. La requête de base qui effectue l'insertion doit être conditionnelle et précédée de la requête de vérification de l'état des stocks, comme une requête normale.

Schématiquement :

SELECT état_des_stocks - commande INTO @reste;
SI @reste >= 0 ALORS
    INSERT commande;
AUTREMENT
    Message d'avertissement
FIN SI;
 
Par diallo  -  Le 15/06/2017 09:57  -  Haut de page  - 

Merci pour la réponse rapide
Mais après plusieurs heures de réflexion je n'arrive pas a trouver comment retrouvé les valeur état_des_stock et commande pour déterminer le reste
Est-il possible d'utiliser New comme par ex SET @commande=NEW.qtite_cmd Pour trouver la quantité en cours et select stock lnto @stock from produit where num_produit=new.num_produit pour trouver le produit conserver ?

 
Par Cyrano  -  Le 15/06/2017 10:09  -  Haut de page  - 

Non mais il ne faut pas utiliser de trigger pour faire ça : il faut le faire au même endroit que le code qui traite l'enregistrement de la commande et donc faire précéder cette partie de la requête de vérification.

Là je n'ai pas vu ce code pour l'instant, mais quelque part dans le PHP, il y a le lancement d'une requête d'enregistrement de commande : c'est là qu'il faut que ça se passe et non dans un trigger qui ne peut pas retourner quoi que ce soit.

 
Par diallo  -  Le 15/06/2017 10:37  -  Haut de page  - 

J'ai compris seulement mon problème est le suivant comment déterminer les paramètres me permettant de déterminer le reste
Pour pouvoir faire le test ?

 
Par Cyrano  -  Le 15/06/2017 10:46  -  Haut de page  - 

Je ne saisis pas où est la difficulté.

J'ai montré plus tôt un bout de pseudo-code pour régler le problème : il se trouve que ça ressemble à ce qu'il y avait dans le trigger, mais ce n'est pas dans un trigger qu'il faut faire ça, mais en amont dans le PHP.

Très simplement, le processus est le suivant :

  1. Récupérer la quantité demandée par le client;
  2. Effectuer une requête pour vérifier que cette quantité ne dépasse pas le stock disponible;
  3. Si le stock est suffisant, effectuer l'enregistrement de la commande;
  4. Sinon, afficher un message d'avertissement.

C'est tout simple et pour ça, il n'y a pas besoin d'un trigger. La requête de vérification qu'il y avait dans le trigger doit être exécutée au point 2 ci-dessus.

 
Par Cyrano  -  Le 15/06/2017 11:40  -  Haut de page  - 

Je vais quand même ajouter une suggestion : pour le confort de l'utilisateur, il serait encore mieux de récupérer le stock disponible au moment de la saisie avec une requête AJAX. Comme ça, l'utilisateur sera averti AVANT de poster son formulaire.

 
Par diallo  -  Le 15/06/2017 14:04  -  Haut de page  - 

bonjour je vous remercie infiniment pour votre aide
j'ai reussi a trouver une reponse possible en php
voici le cheminement que j'ai suivi
1-j'ai recuperé la quantité commandé via la variable POST du formulaire ($qtite=$_POST['qtite']) ensuite
a traver une requete preparer j'ai recuperé le stock dans la table produit comme suit

    $req = $bdd-> prepare('SELECT stock FROM produits WHERE num_prod=:num_prod');  
    $req->execute( array('num_prod'=>$_POST['num_prod']));  
    $etat_stock=$req-> fetch();

ensuite jai calculé la difference pour trouver le reste

    $reste = $etat_stock['stock'] - $qtitelivrer;  

ensuite j'ai fait le test sur reste

    if($reste>=O){  
        enregistrement commande  
    }else{  
        message  
    }  

jespere que sava aider d'autre personnes
merci
en se qui conserne je n'ai pas encore des notions dessus je souhaiterai votre aide

 
Par diallo  -  Le 15/06/2017 14:07  -  Haut de page  - 

concernant ajax je n'ai pas assez de notion dessus je sollicite votre aide pour la documentation

 
Par diallo  -  Le 15/06/2017 15:03  -  Haut de page  - 

Bjr j'aimerai que vous me donnez un peut d'idée pour pouvoir commencer votre proposition sur Ajax car j'ai trouvé que c'est bien réfléchi

 
Par Cyrano  -  Le 15/06/2017 15:47  -  Haut de page  - 

Ben là j'ai pas vraiment le temps pour u cours complet, mais grosso-modo, il s'agit d'ajouter du JavaScript avec un gestionnaire d'événement pour détecter la saisie de quantité dans le formulaire de commande. Le gestionnaire d'événement va alors envoyer une requête XHR (XML HTTP Request) vers le serveur, un script va traiter la demande, effectuer la requête de calcul et retourner une valeur. Le JavaScript récupère cette valeur et selon le cas ne fait rien si tout va bien ou affiche une alerte si la quantité inscrite est supérieure au stock disponible.

Il existe pas mal de tutos sur Internet pour ça et ça peut éventuellement être simplifié avec l'utilisation de certaines librairies du style jQuery. Mais il vaut mieux avoir quelques notions essentielles en JavaScript.

 
Par diallo  -  Le 15/06/2017 16:13  -  Haut de page  - 

Est il possible de passer par une liste lier en Ajax ? c a d quand je sélectionne un produit sur liste sur l'autre liste la quantité en stock de ce produit s'affiche j'ai un bout de que j'ai sur mon projet entre produit et type produit quand je sélectionne un type de produit sur une liste seulement le produit de ce type s'affiche sur l'autre

 
Par Cyrano  -  Le 15/06/2017 19:32  -  Haut de page  - 

Oui, c'est possible. Pas simple pour autant sans les notions dont j'ai parlé plus tôt.

Mais j'avais publié un tuto là-dessus sur PHPFrance il y a plusieurs années.
Il y a trois méthodes dont une utilisant AJAX. Le tuto date de 2005, mais il est toujours valide.

 
Par diallo  -  Le 16/06/2017 10:12  -  Haut de page  - 

Bjr Mr
Concernant ajax je me documente
Y'a une autre idée que je veux exploité sur mon application. Je veux faire un script PHP qui permettra a l'utilisateur de vérifier les informations d'une commande avant de les les mettre dans la base de données c a d tous ce qu'il enregistre soit affiché sur un tableaux avant la validation jaimeri que vous me donné une idée si c'est possible en PHP

 
Par Cyrano  -  Le 16/06/2017 10:28  -  Haut de page  - 

Typiquement, c'est l'affichage du panier dans une boutique en ligne.

Le processus fonctionnel reste simple, c'est à dire que chaque commande est d'abord stockée par exemple en session, puis au moment de confirmer la commande, on fait afficher le panier. À ce stade, rien n'est encore enregistré dans la base de données. Le panier indiquera alors si certaines quantité sont trop importantes par rapport aux stocks disponibles.

Le système de panier n'est du reste pas compliqué et j'avais écrit un autre tuto sur ce sujet, tuto où justement on ne s'occupe pas d'enregistrer quoi que ce soit en base de données et où on utilise une session. Le tuto donne les clés de compréhension. Le code montré n'est pas fait pour être utilisé tel quel dans une application réelle, mais il peut largement servir d'inspiration pour développer un code personnalisé.

 
Par diallo  -  Le 16/06/2017 11:07  -  Haut de page  - 

Merci
C'est vraiment intéressant je vai prendre le maximum de temps pour maîtriser le concept
seulement moi je travail en locale est il possible pour moi d'utiliser ce système de panier ?

 
Par Cyrano  -  Le 16/06/2017 11:41  -  Haut de page  - 

Oui, tout ce qu'on développe doit même toujours être d'abord développé en local et quand ça fonctionne seulement on peut le mettre en ligne. On ne développe jamais en ligne.

 
Par diallo  -  Le 17/06/2017 12:15  -  Haut de page  - 

Bjr j'aimerai savoir qu'elle différence existe t'il entre une modélisation du type
cmd->ligne_cmd->produit
|
Clients
C a d utilisé la table ligne de cmd

Et
2- produit->cmd->clients
Sans utilisé la table ligne_cmd dans le second cas

 
Par Cyrano  -  Le 17/06/2017 14:22  -  Haut de page  - 

C'est une question de souplesse de modèle. Il est préférable de subdiviser en commande/ligne-de-commande plutôt que commande tout court.
Une commande pourra comporter 1 à n lignes sans limite particulière, tandis que simple table commande limite forcément le nombre de produits et/ou oblige à avoir plusieurs colonnes avec des valeurs NULL multiples et inutiles.

 
Par diallo  -  Le 17/06/2017 15:16  -  Haut de page  - 

Je ne vois pas du tous ce que vous dite dans mon cas j'ai deux table client et produit et une table relationnelle commander qui a pour clé id_cl, id_produit et date je pense que la table cmder me pertera de saisir plusieur ligne a la fois

 
Par Cyrano  -  Le 17/06/2017 15:40  -  Haut de page  - 

Ce que je veux dire est basé sur un modèle comme celui-ci :

    +---------+         +------------+  
    | client  |         | commande   |  
    +---------+         +------------+  
    | cli_id  |---------| cmd_id     |  
    | cli_nom |         | cli_id     |  
    +---------+         | cmd_date   |  
                        | cmd_numero |  
                        +------------+  
                              |  
                              |  
                        +-----------+  
    +---------+         | ligne_cmd |  
    | produit |         +-----------+  
    +---------+         | cmd_id    |  
    | prd_id  |---------| prd_id    |  
    | prd_nom |         | cmd_qte   |  
    +---------+         +-----------+  

On a quatre tables dont une table relationnelle.

  1. La table client, entité bien distincte;
  2. La table Produit, entité également distincte;

La gestion des commandes est réparties sur une entité et une relation :

  1. La table commande, entité distincte qui précise quel client, quelle date pour la commande et éventuellement un numéro de commande par exemple;
  2. Ensuite une table relationnelle qui établit les liens entre la commande et les produits, où on identifie donc quelle commande, quel produit et quelle quantité.

Est-ce que ce schéma est plus clair comme ceci ?

 
Par diallo  -  Le 17/06/2017 16:23  -  Haut de page  - 

J'ai compris maintenant mais seulement est ce que ce schéma me permettra d'afficher le nom du client son adresse ...et la liste détaillé des produits qu'il a commandé( désignation, qtite..)
J'ai fait ceci mais sa ne me donne pas le résultat que je veux
Select nomcl.clien, nom_prod.Produit, qtite.ligne_cmd From produit, commande, ligne_cmd, client
Where produit.id=ligne_cmd.idprod
And cmd.id=ligne_cmd.id cmd
And client.id=cmd.id cl;

Je veux faire un bon de commande

 
Par Cyrano  -  Le 17/06/2017 17:30  -  Haut de page  - 

Par rapport au modèle que j'ai motré précédemment, voici ce qu'on pourrait faire, j'ajouterai quelques explications après :

SELECT
  cl.cli_nom,
  pr.prd_nom,
  lc.cmd_qte
FROM client             cl
  INNER JOIN commande   cm ON cl.cli_id = cm.cli_id
  INNER JOIN ligne_cmd  lc ON cm.cmd_id = lc.cmd_id
  INNER JOIN produit    pr ON lc.prd_id = pr.prd_id
WHERE cm.cmd_id = xxx;

Alors cette syntaxe n'est pas la même, j'y fait ce qu'on appelle des jointures normalisées (INNER JOIN)
La clause WHERE permet d'identifier la commande et chaque ligne qui sera retournée piochera logiquement les lignes de commandes correspondantes et les informations sur les produits qui s'y rattachent.

 
Par diallo  -  Le 17/06/2017 18:18  -  Haut de page  - 

Merci bcp la pour la reponse rapide sa marche mais je suis bloqué ici encore voici mon problème je veux a chaque fois que je valide une commande dans la bdd que le bon de commande correspondant s'affiche automatiquement en pdf j'ai déjà préparer le bon de commande avec html2pdf est ce que ce possible de le faire en php ?

 
Par Cyrano  -  Le 17/06/2017 18:22  -  Haut de page  - 

Possible de faire quoi en PHP exactement ?

 
Par diallo  -  Le 17/06/2017 18:37  -  Haut de page  - 

Je veux imprimé mes bon de commande en pdf
J'aimerai après avoir enregistré une commande dans la bdd de pouvoir imprimé le bon de commande correspondant

 
Par Cyrano  -  Le 17/06/2017 19:10  -  Haut de page  - 

Ben pour ça, il faut générer un document PDF. C'est tout à fait possible, mais pas forcément simple et ça ne s'expliquera pas en quelques minutes.

Il existe des librairies dédiés à ça, c'est de la programmation objet, pas forcément très difficile, mais complexe si on a pas l'habitude. Une visite sur le site de fpdf.org pourrait être des plus utiles

 
Par diallo  -  Le 18/06/2017 19:04  -  Haut de page  - 

Bjr avec le schéma que vous mavavez donné client->cmd->ligne_cmd->produit
Ma posé un problème au niveau du codage des fenêtre sa me donne ce que je veux réalisé est ce possible de lui remplacer par ce schéma

+-------+       +--------+
| clt.  | ------|lignecmd|---|cmd|
--------+.      +--------+
|       |       |        |
+-------         +-----|--+
                        Produit
 
Par diallo  -  Le 18/06/2017 19:10  -  Haut de page  - 

Bjr avec le schéma que vous mavavez donné client->cmd->ligne_cmd->produit
Ma posé un problème au niveau du codage des fenêtre sa me donne ce que je veux réalisé est ce possible de lui remplacer par ce schémq
Client->lignecmd->cmd
---------------^
---------------|_produit
C a dire je veux lier lignecmd avec client au lier de client->cmd

 
Par Cyrano  -  Le 18/06/2017 19:13  -  Haut de page  - 

Ce ne serait pas cohérent du tout.

  • Un client effectue 0 à n commandes;
  • Une commande comporte 1 à n lignes de commandes

Lier directement client à ligne-de-commande rend le modèle faux et la table commande pratiquement sans objet.

Donc la réponse : oui, c'est possible, mais c'est idiot ;)

 
Par diallo  -  Le 18/06/2017 19:26  -  Haut de page  - 

OK merci
Le problèmes que j'ai est le suivant
sur la fenêtre enrement commande je n'arrive pas a ressortir quel client a lancer tel commande par ce que le nom du client ne ressort pas sur ce dernier c'est seulement la datecmd le nom du produit et la qtite qui ressort et pourtant il est important de connaiti le clt qui a lancé la cmd je pense comment resouri se problème

 
Par Cyrano  -  Le 18/06/2017 19:52  -  Haut de page  - 

Faites voir votre requête SQL, il doit en manquer un bout

 
Par diallo  -  Le 19/06/2017 09:20  -  Haut de page  - 

Bjr Mr
Je veux savoir s'il est possible de créer en HTML5/php un formulaire dynamique
Pour faire une insertion multiple par exemple dans mon cas je veux si une commande contient 5 produits ou plus davoir un formulaire me permettant d'enregistré tous ces produit en même temps dans la bdd

 
Par Cyrano  -  Le 19/06/2017 09:49  -  Haut de page  - 

Bonjour,
oui bien sûr que c'est possible, mais il va falloir passer par du JavaScript pour ajouter dynamiquement les champs appropriés dans le formulaire.

Un peu la même chose que pour AJAX, ce n'est pas quelque chose qui peut s'expliquer en quelques lignes, il faut programmer ça en JavaScript éventuellement en s'appuyant sur une librairie du type Jquery ou assimilé. Quand on a un petit peu l'habitude, c'est assez simple, mais sans connaitre les bases de la programmation en JS, c'est autrement plus compliqué.

Ceci dit, on est en train de dériver là : au départ, il était question d'une procédure stockée, on en est au formulaire alors que le problème de la procédure est résolu. Il serait approprié de créer un nouveau sujet dans ces cas là.

 
Par diallo  -  Le 19/06/2017 10:06  -  Haut de page  - 

OK merci le problème est que plus j'avance sur le projet plus des idées nouvelles me viennent raisons pour laquelle je déborde parfois sur le sujet
Pour l'apprentissage de JavaScript quels sites ou qu'elle tutoriels vous me recommandé de visiter?

 
Par Cyrano  -  Le 19/06/2017 10:13  -  Haut de page  - 

Ça fait bien longtemps que je ne cherche plus ces sites, mais je dirais que la référence en matière de tutoriels pour ça, ce serait OpenClassroom

 
Par diallo  -  Le 19/06/2017 10:21  -  Haut de page  - 

OK merci j'ai déjà plusieurs certificats sur ce site je vai m'inscrire encore en JavaScript et Ajax
Merci infiniment pour la disponibilité que dieux vous paie par le plus grd bonheur

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !