oci / php while problem

  • Hi!

    folgendes Problem:

    Die Page ist so eine Art Webshop - der Kunde sucht sich die Artikel aus, kann sie stornieren (einzelne und alle), kann Favoriten hinzufügen und nach Artikeln suchen, ausserdem kann er bis 1 Woche im Vorraus bestellen. Wenn er nun aber 2 Artikel für eine Woche aussucht und diese mit dem Button "alle stornieren" stornieren will, wird der Eintrag "Vorbestellt" welcher in der DB steht nicht richtig upgedatet.. ich weiss zwar wieso aber nicht wie ich es lösen soll ;)

    also bitte helft mir *g*

    Hier der Code:

    <?php
    session_start();
    require('auth.php');
    require('connect.php');

    $sql= ociparse($c,"select b.id,l.vorbestellt,b.bestnr from bestellungen b, lager l where b.fixiert is Null and b.kurzz = '" . $_SESSION['kuerzel'] ."' and b.bestnr=l.bestnr");
    ociexecute($sql);

    while($res=oci_fetch_array($sql))
    {
    $vorbestellt = $res['VORBESTELLT'] - 1;
    $sql0= ociparse($c,"update lager set vorbestellt = " . $vorbestellt . " where bestnr = '". $res['BESTNR'] ."'");
    ociexecute($sql0);
    $sql1= ociparse($c,"delete from bestellungen where fixiert is Null and ID = '".$res['ID']."' and kurzz = '".$_SESSION['kuerzel'] ."'");
    ociexecute($sql1);

    ocicommit($c);
    }

    //header('location:bestellungen.php');
    ?>

    Die beiden Sätze werden zwar aus der DB gelöscht, aber eben von vorbestellt wird nicht 2 abgezogen sondern nur 1 weil ja das erste Select (ausserhalb der while schleife) nur einmal ausgeführt wird und dadurch auch wenn das update schon einmal durchlief noch immer 2 als Wert in Vorbestellt enthält.


    Ich danke schonmal fuer die Hilfe!

  • Ich denke mal ohne dass du uns einen tieferen einblick in deine datenbankstruktur gibst und hier und da ein wenig dokumentierst wie du genau intern arbeitest wird es ziemlich schwer für uns dir da zu helfen...


    aber wenn ich da halbswegs durchgestiegen bin, müsste es dieser Code tun:

    [php:1:b304b2352a]<?php
    session_start();
    require('auth.php');
    require('connect.php');

    $sql= ociparse($c,"select b.id,l.vorbestellt,b.bestnr from bestellungen b, lager l where b.fixiert is Null and b.kurzz = '" . $_SESSION['kuerzel'] ."' and b.bestnr=l.bestnr");
    ociexecute($sql);

    while($res=oci_fetch_array($sql))
    {
    $res['VORBESTELLT']--;
    $vorbestellt = $res['VORBESTELLT'];
    $sql0= ociparse($c,"update lager set vorbestellt = " . $vorbestellt . " where bestnr = '". $res['BESTNR'] ."'");
    ociexecute($sql0);
    $sql1= ociparse($c,"delete from bestellungen where fixiert is Null and ID = '".$res['ID']."' and kurzz = '".$_SESSION['kuerzel'] ."'");
    ociexecute($sql1);

    ocicommit($c);
    }

    //header('location:bestellungen.php');
    ?> [/php:1:b304b2352a]

  • [php:1:aa6a572827]<?php
    <?php
    session_start();
    require('auth.php'); // ueberpruefung ob session vorhanden oder nicht nicht -> weiter interessant
    require('connect.php'); //datenbank connect

    $sql= ociparse($c,"select b.id,l.vorbestellt,b.bestnr from bestellungen b, lager l where b.fixiert is Null and b.kurzz = '" . $_SESSION['kuerzel'] ."' and b.bestnr=l.bestnr"); //selektiert alle eintraege im table bestellungen (wo die bestellungen der einzelnen kunden hinterlegt werden) die auf den user dieser session zutreffen
    ociexecute($sql);

    while($res=oci_fetch_array($sql))
    {
    $vorbestellt = $res['VORBESTELLT'] - 1;
    $sql0= ociparse($c,"update lager set vorbestellt = " . $vorbestellt . " where bestnr = '". $res['BESTNR'] ."'"); //im lager table ist die produktpalette verspeichert mit den Beständen und vorbestellten mengen des produkts -> da ja hier ein storno vorgenommen wird, soll hier die vorbestellte menge wieder zurückgerechnet werden, wenn aber nun von einem artikel 2 einträge im bestellungen table sind funktioniert das nicht (auch nicht das von modula)
    ociexecute($sql0);
    $sql1= ociparse($c,"delete from bestellungen where fixiert is Null and ID = '".$res['ID']."' and kurzz = '".$_SESSION['kuerzel'] ."'"); // und hier soll en eben dann endgültig die bestellungen des users aus dem bestellungen table gelöscht werden und somit ist der kunde wieder "bestellungslos"...
    ociexecute($sql1);

    ocicommit($c);
    }

    header('location:bestellungen.php');
    ?>
    ?>[/php:1:aa6a572827]

    hier bitte :) deins funktioniert nicht modula

  • Ah, ich glaub so langsam kapiere ichs...

    $res sieht beispielsweise so aus?
    [php:1:73fe3d4732]<?php
    $res = array(
    'id' => '123456', // primary_key, interne identifizierung?
    'vorbestellt' => '2', // menge / anzahl die von dem artikel aus dem Lager vorbestellt wurde?
    'bestnr' => '56789', // bestellnummer des artikels, für die Buchhaltung, eindeutig?
    );
    ?>[/php:1:73fe3d4732]

    soweit richtig? wenn nicht, bitte korrigieren :)

  • jop richtig :)

    ID is eindeutig definiert und fortlaufend (also bei jedem insert von einem satz wird automatisch weitergezählt)
    vorbestellt wie du schon sagtest
    und bestnr ist eindeutig, sieht aber entweder so aus: "H1234" oder so "G1234", wobei 1234 beliebige zahlen sein koennen.

  • Na, dann fehlt in dem Array aber die Angabe, wie oft denn der Kunde den Artikel bestellt hat - du müsstest quasi deinen SELECT ändern:

    Code
    select b.id,l.vorbestellt,b.bestnr

    - so, dass du auch auf die anzahl zugreifen kannst die der Kunde bestellt hat, verstehst du was ich meine?

    Weil das ist ja die anzahl die du aus dem Lager abziehen musst - und nicht bloß immer "1" sondern auch mal 2,3,4 oder je nachdem wieviel halt der kunde vorbestellt hat

  • so endlich mal dazu überwunden mich anzumelden :>

    der Kunde kann nicht eine größere anzahl an artikel bestellen sondern immer einen von der gleichen sorte pro tag aber bis zu einer woche im vorraus. so kann es eben sein dass im table bestellungen vom gleichen benutzer mehrere sätze stehen wo aber das gleich bestellt wurde nur eben ein anderes datum ;)

    du musst dir das nicht als webshop wie amazon oder was weiss ich vorstellen es is nur ähnlich... wenn ich dir nun sage dass es eine interne mittagessensauswahl page is wirst du dir auch ned viel vorstellen könnnen *g* es is so dass jeder benutzer in der firma nen pc und nen login fuer diese page hat, hier kann er: fuer jeden tag das essen bestellen (im vorraus) / stornieren / suchen / überblick über seine bestellungen etc. das prinzip eines webshops nur ohne bezahlung und mengen ^^

  • wenn also im table mehrere sätze von einem Benutzer sind gibt deine SQL Abfrage ja auch mehere an $res=oci_fetch_array($sql) zurück - oder nicht?

    d.h. du müsstest bei jedem Durchlauf der while schleife "vorbestellt" um EINS zurücksetzen, oder nicht?

    Code
    ociparse($c,"update lager set vorbestellt = vorbestellt - 1 where bestnr = '". $res['BESTNR'] ."'")

    Wenns das nicht ist, dann brauch ich mal nen Beispieldatensatz - entweder über print_r($res) in der while schleife ausgegeben oder sonst wie ;)

  • genau das war mein ansatz nur nun ist das problem, dass ich in $res die sätze stehen hab, und wenn der da die while schleife durchgeht und vorbestellt - 1 rechnet wird trotzdem weiter drinnen stehen vorbestellt=1.

    stell dir das doch mal vor...

    Du hast das Array $res sagen wir mit 2 bestellungen von einem user wo nur das datum unterschiedlich ist
    wuerde als so aussehen:

    ID vorbestellt BestNr
    1 2 H1235
    2 2 H1235


    nun geht php her laeuft den ersten satz durch, rechnet vorbestellt - 1, macht das update und löscht den ersten satz. fertig nun 2. durchlauf -> es steht wieder 2 vorbestellt im array also wird wieder update gemacht mit vorbestellt=1....

    ich hoffe das is verständlich :/

  • ja die id waere beliebig muss nicht fortlaufend sein aber vorbestellt und bestnr wuerde so aussehen wenn er 4 mal das gleiche essen fuer die woche bestellt hat

  • [php:1:72ee491966]<?php
    session_start();
    require('auth.php'); // ueberpruefung ob session vorhanden oder nicht nicht -> weiter interessant
    require('connect.php'); //datenbank connect

    $sql= ociparse($c,"select b.id,l.vorbestellt,b.bestnr from bestellungen b, lager l where b.fixiert is Null and b.kurzz = '" . $_SESSION['kuerzel'] ."' and b.bestnr=l.bestnr"); //selektiert alle eintraege im table bestellungen (wo die bestellungen der einzelnen kunden hinterlegt werden) die auf den user dieser session zutreffen
    ociexecute($sql);

    $temp_bnr = array();
    while($res=oci_fetch_array($sql))
    {
    if(!in_array($res['BESTNR'], $temp_bnr)) {
    $sql0= ociparse($c,"update lager set vorbestellt = vorbestellt - {$res['VORBESTELLT']} where bestnr = '". $res['BESTNR'] ."'"); //im lager table ist die produktpalette verspeichert mit den Beständen und vorbestellten mengen des produkts -> da ja hier ein storno vorgenommen wird, soll hier die vorbestellte menge wieder zurückgerechnet werden, wenn aber nun von einem artikel 2 einträge im bestellungen table sind funktioniert das nicht (auch nicht das von modula)
    ociexecute($sql0);
    $temp_bnr[] = $res['BESTNR'];
    }
    $sql1= ociparse($c,"delete from bestellungen where fixiert is Null and ID = '".$res['ID']."' and kurzz = '".$_SESSION['kuerzel'] ."'"); // und hier soll en eben dann endgültig die bestellungen des users aus dem bestellungen table gelöscht werden und somit ist der kunde wieder "bestellungslos"...
    ociexecute($sql1);

    ocicommit($c);
    }

    header('location:bestellungen.php');
    ?>[/php:1:72ee491966]

    So sollte es dann gehen.

    Brauchst du die änderungen erklärt oder verstehst du das so?

  • [php:1:b86af61a0c]<?php

    /*
    Array, der die Bestellnummern enthält die bereits storniert wurden
    */
    $temp_bnr = array();
    while($res=oci_fetch_array($sql))
    {
    if(!in_array($res['BESTNR'], $temp_bnr))
    /*
    Prüfen, ob für die aktuelle Bestellnummer die Bestellungen schon storniert wurden
    wenn ja, ist diese im array und die Bedingung gibt true zurück
    */
    {
    /*
    Die Bestellungen für die aktuelle Bestellnummer wurden noch nicht storniert
    $res['VORBESTELLT'] enthält die Anzahl in der $res['BESTNR'] vorbestellt wurde
    muss also aus dem lager von der vorbestellten Menge abgezogen werden.
    */
    $sql0= ociparse($c,"update lager set vorbestellt = vorbestellt - {$res['VORBESTELLT']} where bestnr = '". $res['BESTNR'] ."'");
    ociexecute($sql0); // Datenbank String senden
    /*
    Damit die aktuelle Bestellnummer nicht erneut storniert wird schreiben wir sie in einen Array
    */
    $temp_bnr[] = $res['BESTNR'];
    }
    /*
    Löschen der Bestellung
    */
    $sql1= ociparse($c,"delete from bestellungen where fixiert is Null and ID = '".$res['ID']."' and kurzz = '".$_SESSION['kuerzel'] ."'");
    ociexecute($sql1);

    ocicommit($c);
    }

    ?>[/php:1:b86af61a0c]

    besser?

    Ich muss jetzt erstmal nach Hause fahren, schaue aber später nochmal ins Forum.