Com reduir la quantitat d’articles en estoc? – PHP – Fòrums de SitePoint

Per exemple, hi ha 20 productes a la taula d’existències, quan es redueix el nombre 5, digueu que hi ha 15 a la taula d’existències.

taula d’estoc

vendre taula
2022-08-29_191253


Hauríeu d’utilitzar una consulta UNION ALL per calcular el total quan sigui necessari, obtenint el SUM() de la taula d’estocs, agrupat per l’identificador de l’article, menys el SUM() de la taula de vendes, agrupat per l’identificador de l’article. Com que no heu publicat la informació completa de la columna i suposant que voleu el total de l’identificador de l’element = 62 (o qualsevol conjunt d’identificadors), la consulta es veuria així:

SELECT i.name, SUM(x.qty) qty
 FROM items i
 LEFT JOIN (
 SELECT item_id, SUM(qty) qty FROM stock WHERE item_id IN(62) GROUP BY item_id
 UNION ALL
 SELECT item_id, -SUM(qty) qty FROM sell WHERE item_id IN(62) GROUP BY item_id
) x ON i.id = x.item_id
GROUP BY i.id
ORDER BY i.name

Això suposa que les vostres dades estan correctament normalitzades i teniu una taula d’elements, on es defineixen els elements. Això produeix un identificador de l’article que ens posaríeu en qualsevol registre d’existències o de venda per relacionar l’article amb la seva definició.

Si el camp del formulari Implant_s és l’identificador del sistema d’implant seleccionat, no utilitzaríeu aquest valor per determinar en quina fila de la taula de seccions cal operar?

Aquí teniu una llista de problemes i coses que es poden simplificar al codi publicat:

  1. Una sentència header() no atura l’execució del codi php. Necessiteu una declaració de sortida/mor després de la redirecció “administrador” per evitar que s’executi la resta del codi.
  2. El mètode de publicació de processament del codi hauria d’estar per sobre de l’inici del document html, de manera que pugueu decidir què fer a la pàgina en funció del resultat del codi de processament del formulari.
  3. No feu servir mai el supressor d’errors @. Un cop s’hagi enviat el formulari, excepte els camps de caselles de verificació/ràdio no marcats, tots els camps del formulari s’establiran i existiran. Si rebeu errors d’índex no definits d’aquest codi, va ser a causa d’alguna cosa que calia trobar i corregir, no amagar els errors.
  4. No intenteu provar si el botó d’enviament està configurat. Hi ha casos en què no serà. En lloc d’això, hauríeu de detectar si s’ha enviat un formulari de mètode de publicació. Si podeu tenir més d’un codi de processament de formularis en una pàgina, utilitzeu un camp ocult amb un valor únic per controlar quin codi de processament de formularis s’ha d’executar.
  5. Qualsevol que sigui el codi de la funció de sortida () probablement sigui incorrecte per a les dades d’entrada. Excepte per retallar les dades, perquè pugueu detectar si s’han introduït tots els caràcters d’espai en blanc, NO hauríeu de modificar les dades d’entrada abans d’utilitzar-les.
  6. Hauríeu de mantenir les dades del formulari com a conjunt en una variable de matriu php i, a continuació, operar amb elements d’aquesta variable de matriu durant la resta del codi.
  7. Un cop fet l’article #6 en aquesta llista, podeu retallar totes les dades d’entrada alhora utilitzant una única línia de codi PHP.
  8. Després de retallar les dades, heu de validar cada entrada per separat, emmagatzemant els errors d’usuari/validació en una matriu utilitzant el nom del camp com a índex de matriu. Per exemple, si Implant_s i Impalnt_n són “obligatoris”, heu de validar que continguin valors permesos. Si no ho fan, es tracta d’un error i heu de configurar missatges per a l’usuari que els indiqui què passa amb les dades que ha enviat.
  9. Un cop finalitzada tota la lògica de validació, si la matriu que conté els errors d’usuari/validació està buida, utilitzeu les dades del formulari enviat.
  10. Si teniu més d’uns 2 o 3 camps de formulari, hauríeu d’utilitzar un disseny basat en dades, on tingueu una estructura de dades (matriu) que conté una definició dels camps de formularis esperats, quina validació cal fer en cadascun i quin processament actuar. Aleshores, hauríeu de fer un bucle sobre aquesta definició i el codi de propòsit general de l’usuari per validar i processar les dades.
  11. Sovint, el codi de “falla” de la lògica condicional és molt més curt que el codi d'”èxit”. Si inverteix la condició que s’està provant i primer el codi de “falla”, serà més fàcil seguir el que està fent el teu codi.
  12. Hauríeu de crear consultes sql en variables php. Això facilita la depuració. Podeu fer ressò de la declaració de consulta sql per veure què és. Això també separa la sintaxi de la consulta sql del codi php, reduint el nombre d’errors d’ortografia.
  13. Hauríeu d’enumerar les columnes que seleccioneu en una consulta. Això ajuda a prevenir errors i fa que la vostra consulta es documenti automàticament.
  14. No copieu variables a altres variables per res.
  15. Si configureu el mode d’obtenció per defecte a assoc quan feu la connexió a la base de dades, no cal que l’especifiqueu a cada instrucció de recuperació.
  16. Si utilitzeu l’enllaç implícit, proporcionant una matriu de dades a ->execute([…]), podeu simplificar molt tot el vostre codi.
  17. Si utilitzeu posicionals? marcadors de posició, podeu simplificar molt tot el vostre codi.
  18. Deixeu columnes fora d’una consulta d’inserció si no proporcioneu valors, per exemple, la columna id.
  19. Si aquesta consulta INSERT pot donar lloc a dades duplicades, cal que hàgiu de gestionar els errors perquè la consulta detecti si s’ha produït un error duplicat i configureu un missatge per a l’usuari que els avisi què passava amb les dades que va enviar.
  20. Després del final de tota la lògica de processament del formulari, si no hi ha errors, redirigeix ​​exactament el mateix URL de la pàgina actual per provocar una sol·licitud d’obtenció de la pàgina. Això evitarà que el navegador intenti tornar a enviar les dades del formulari.
  21. Si voleu mostrar un missatge d’èxit únic, emmagatzemeu-lo en una variable de sessió i, a continuació, proveu, visualitzeu i esborra la variable de sessió a la ubicació adequada del document html.
  22. Un atribut buit action=”” no és realment html5 vàlid. Per aconseguir que el formulari s’enviï a la mateixa pàgina, només heu de deixar fora l’atribut d’acció sencer.
  23. Si poses el etiquetes al voltant del camp al qual pertanyen, podeu ometre l’atribut for=’…’ i l’atribut id=’…’ coincident (que la majoria falten/no coincideixen de totes maneres). Utilitzeu només els atributs al vostre marcatge quan estiguin necessari.
  24. El primer en una llista hauria de ser una indicació per seleccionar una de les opcions. El valor d’aquesta primera opció hauria de ser una cadena buida. Això requerirà que l’usuari faci una elecció, us permetrà validar l’entrada (una cadena buida no passarà la validació) i permetrà que l’atribut “requerit” funcioni.
  25. Sembla que el codi per establir l’atribut “seleccionat” per al camp “doctor” és sobrant d’una altra cosa i s’ha de depurar.
  26. Necessiteu codi per al camp “Implant_s” per establir l’atribut “seleccionat”.
  27. Si utilitzeu un camp type=’data’ per a les dates, tots els navegadors moderns presentaran un selector de dates.
  28. La selecció/opció type_of_c (tipus de corona) ha de tenir els seus valors definits en una taula de base de dades, utilitzar l’id com a valor de camp i com a valor inserit, i establir l’atribut “seleccionat”, de manera similar a l’altre select/ camps d’opcions.

Finalment, us recomano que feu que el vostre codi funcioni completament amb UN camp de formulari de cada tipus general, i us podeu preocupar per tot el codi necessari per a la resta de camps.



2 m’agrada

Per què el vostre formulari per a un pacient felicita l’usuari per haver afegit un estudiant en kurd?

Aquí teniu alguns punts més per afegir a la llista:

  1. Emmagatzema només l’identificador de l’usuari en una variable de sessió per indicar qui és l’usuari que ha iniciat sessió.
  2. Consulteu a cada sol·licitud de pàgina per obtenir els permisos de l’usuari actual o qualsevol altra informació d’usuari.
  3. Apliqueu entitats html a qualsevol valor dinàmic quan l’envieu en un context html per ajudar a prevenir els scripts entre llocs.

Vull la idea en dos camps en dues taules diferents,
Vull reduir el nombre de Impalnt_n culomun de les formes directament reduir de la columna Implant_s d’una altra taula

La programació implica definir quines entrades teniu, quin processament fareu en funció d’aquestes entrades i quin resultat esteu intentant produir o sortir.

Per a qualsevol valor d’Implant_s i Implant_n enviat, què fareu si el valor de Implant_n és més gran que la columna de la secció de la fila corresponent al valor d’identificador de l’Implant_s? Què fareu si el valor d’Implant_n és inferior o igual a la columna de la secció de la fila corresponent al valor d’identificador de l’Implant_s?

Contesteu aquestes preguntes en el vostre idioma nadiu, poseu les dues respostes al vostre codi com a comentaris i, a continuació, intenteu dissenyar, escriure, provar i depurar el codi i les consultes necessàries per dur a terme aquestes dues declaracions.



1 M’agrada

He posat el codi font complet

Heu de realitzar aquesta actualització com una única operació (atòmica) o heu de bloquejar la taula per evitar que múltiples instàncies del codi canviïn els valors entre la consulta SELECT i la consulta UPDATE (que es mostrava al codi a la resposta ara suprimida). #3.)

Per fer-ho tot en una sola consulta UPDATE i comprovar si el valor s’ha canviat, vegeu el següent:

$sql = "UPDATE classes SET section = IF(section>=?,section-?,section) WHERE id=?";
$stmt = $db->prepare($sql);
$stmt->execute([ $Impalnt_n, $Impalnt_n, $Implant_s ]);

if($stmt->rowCount())
{
	// the section value was updated, i.e. section was >= $Impalnt_n
	echo 'update was successful';
}
else
{
	// the section value was unchanged, i.e. section was < $Impalnt_n
	echo 'there was not sufficient quantity to update';
}



1 M'agrada

Podeu ampliar el tema "no va funcionar", si us plau?



1 M'agrada

El que volia dir era, què va passar que no hauria d'haver passat, o què no va passar que hauria de passar? De quina manera el codi "no va funcionar"?



2 m'agrada

No apareixen resultats a la taula

quan les dades afegides a la taula mostraven aquest > eco 'no hi havia prou quantitat per actualitzar';


                              

Això no generarà html que proporcionarà un valor a l'objecte de publicació. Hauria de ser


                              



1 M'agrada

mateix shing, no funciona

Falta alguna cosa

Heu fet ressò dels valors de $Impaltn_n i $Implant_s per assegurar-vos que els valors són els que espereu?

Heu pres la vostra instrucció SQL amb aquests valors i l'heu executat per assegurar-vos que funciona i que no hi ha cap problema com que el nom d'un camp no s'hagi nomenat incorrectament?

I això sembla malament... rowcount() no retorna un nombre de files afectades?

if($stmt->rowCount())

Així que no hauria de ser això

if($stmt->rowCount() > 0) // maybe -1, been a while with PHP



1 M'agrada

A la imatge ara suprimida (resposta #3) dels valors de la taula de la base de dades, ja teníeu un -300 per a un dels valors de fila de la secció. És aquest el que estàs seleccionant per utilitzar? Si és així, NO hi ha una quantitat suficient en aquesta fila.



1 M'agrada

Es teu id la columna està content d'haver-hi inserit NULL? Si es tracta d'un identificador únic d'increment automàtic, només cal deixar-lo fora de la consulta.



1 M'agrada

treballant ara, gràcies per ajudar el meu germà i altres amics

Ara, si només feu les coses de les llistes proporcionades, de manera que el vostre codi estigui segur en tots els contextos, proporcioneu una bona experiència d'usuari (UX), serà senzill sense moltes tecles innecessàries i funcionarà o bé. et dirà per què no.



1 M'agrada

Podria ser útil per a altres persones en el futur si pugueu publicar la solució; com heu solucionat el problema?

Leave a Comment

Your email address will not be published. Required fields are marked *