Bestellformular bei Shop auf mysql-basis

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bestellformular bei Shop auf mysql-basis

    Hallo,
    ein Anfänger-Hilferuf: ich habe - als Lernaufgabe - einen Mini-Mini-Shop, bestehend aus einer Anmeldeseite (verknüpft mit der Datenbank kunden), einer Artikelseite (zieht sich die Daten aus der Tabelle artikel), auf der man bestellen kann, gebastelt. Die Artikel landen in einem Warenkorb (und damit auch in der Tabelle Warenkorb, wobei hier das Feld . Auf dieser Seite kann man dann den Inhalt dieser Warenkorbtabelle bestellen.
    Eine Session läuft im Hintergrund.
    Nun sollen bei Aufruf der Bestellung aus der Warenkorbtabelle die Artikel selektiert werden, die dem Session-Kunden zugeordnet sind, und diese Artikel in die Tabelle "bestellung" geschrieben werden. Dann soll der Bestand in der Tabelle Artikel um diese Artikel reduziert werden und der Warenkorb - resp. der Anteil des Session-Kunden in dieser Tabelle gelöscht werden.
    Abgesehen davon, dass mein Script (nach xfachen Änderungen) sicher noch unanständig viele Fehler beinhaltet, kriege ich zudem immer wieder die Fehlermeldung:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' )' at line 4

    Sieht irgendjemand so auf Anhieb, was das zum einen bedeutet und zum anderen... naja, welche Fehler das Script sonst noch hat??? (Bin ja schon ganz happy, dass der Rest funktioniert, aber hier verließen mich alle guten Inspirationsgeister - und meinen Lehrer erreiche ich seit Tagen nicht, seufz):
    Bestellscript:
    PHP-Code:
    <?php
            
    include("dbconnect.php");
            include(
    "authentifizierung.php");
    $sql "SELECT
            wkid, //Die Warenkorb-ID
                    kundennummer,
                    artikelid
                   FROM
                    warenkorb
                   WHERE
                     kundennummer = "
    .$_SESSION["nummer"];
    $result mysql_query($sql) or die(mysql_error()); 
    while(
    $row mysql_fetch_array($result))

    $sql "INSERT INTO
            bestellungen (artikelid, kundennummer)
            VALUES
            (
    $row[artikelid]$row[kundenummer]"
    /*Hier meldet er als Notice wenn E_ALL eingeschaltet ist: 
    Undefined index: kundenummer in ...bestellung.php 
    on line 21*/
    $result =  mysql_query($sql) or die(mysql_error());

    $sql "UPDATE artikel SET bestand=".($row['bestand']-1)." where id=$id";
    $result mysql_query($sql) or die(mysql_error());
    }
    $sql "delete * from warenkorb where kundennummer = ".$_SESSION['nummer'];      
    ?>
    VIELEN DANK!
    Grüße
    Steffi
    Zuletzt geändert von stef3; 30.07.2005, 18:27.

  • #2
    auf anhieb gibt's eine pflichtlektüre und php-tags:
    http://www.php-resource.de/forum/sho...threadid=50454

    des weiteren gibt es eine testausgabe der query vor dem ausführen.

    Kommentar


    • #3
      Sorry, die php tags habe ich natürlich direkt geändert, ich hatte mich schon gewundert - hatte aber die Einleitung ehrlich gesagt wohl zu schnell gelesen.
      Das mit dem error report habe ich wiederum gemacht :-)
      Wie rufe ich die Testausgabe auf? Ich habe es mit echo $result versucht, aber er läßt mich nicht, die Fehlermeldung variiert zwar ein wenig, bezieht sich jedoch wieder auf die ominöse Zeile 4....

      Kommentar


      • #4
        du sollst die query ausgeben lassen und nicht die resource.
        und notices lügen nicht - d.h. dieses elemt wird es echt nicht geben.

        Kommentar


        • #5
          umpf :-)
          ich hoffe, dann war echo $sql; besser...
          die Antwort war zumindestens besser:

          SELECT wkid, kundennummer, artikelid FROM warenkorb WHERE kundennummer = 3You have an error in
          your SQL syntax; check the manual that corresponds to
          your MySQL server version for the right syntax to use near '' at line 4

          Daraufhin habe ich in die Warenkorbtabelle geschaut, der "Kunde", der bestellt hat, war tatsächlich Kundennummer 3.

          ... hm?
          Zuletzt geändert von stef3; 30.07.2005, 19:15.

          Kommentar


          • #6
            Der Kommentar in Zeile 5 scheint mir dort fehlplatziert, das Syntax-Highlighting sieht das genauso. Also mal weg damit.

            Und welchen Datentyp hat die Spalte Kundennummer?

            Kommentar


            • #7
              Guten Morgen,
              den Kommentar habe ich erst hier dazu geschrieben, da ich wkid so gar nicht aussagekräftig fand. Ich gebe zu :-) dass für Außenstehende die Langbezeichnung auch nicht besser wird. Ich habe inzwischen wkid aus dem Script gestrichen, weil sie eigentlich für die Bestellung nicht gebraucht wird. Ändert leider nichts am Ergebnis.
              Die Kundennummer hat ebenso wie die artikelid den Typ integer.
              Sonntägliche Grüße
              Steffi

              Kommentar


              • #8
                Re: Bestellformular bei Shop auf mysql-basis

                authentifizierung.php startet hoffentlich die Session.

                Die Queries mal anders:
                PHP-Code:
                $sql 'SELECT kundennummer, artikelid '
                       
                .'FROM warenkorb '
                       
                .'WHERE kundennummer = '.$_SESSION['nummer'];

                $sql "INSERT INTO bestellungen (artikelid, kundennummer) "
                       
                ."VALUES ({$row['artikelid']}{$row['kundenummer']})"

                $sql 'UPDATE artikel SET bestand = '
                       
                .($row['bestand']-1)." where id = $id";

                $sql "DELETE * FROM warenkorb "
                       
                ."WHERE kundennummer = {$_SESSION['nummer']}"
                Zuletzt geändert von onemorenerd; 31.07.2005, 12:40.

                Kommentar


                • #9
                  Hallo,
                  habe ich direkt eingefügt.
                  Wenn ich den error report nicht einschalte, bedankt er sich brav für die Bestellung :-) aber tut nichts in der Datenbank.
                  Bei Error Report meldet er dann
                  Notice: Undefined variable: row in Q:\xampplite\htdocs\SGD_Uebungen\bestellung.php on line 10

                  Notice: Undefined variable: row in Q:\xampplite\htdocs\SGD_Uebungen\bestellung.php on line 13

                  Notice: Undefined variable: id in Q:\xampplite\htdocs\SGD_Uebungen\bestellung.php on line 13

                  wobei ich denke, das mit der letzten Notiz müsste ich hinkriegen, wenn ich den Weg der Variablen nochmal nachverfolge. Aber er erkennt die row nicht. Hm. Ich probiere nachher mal noch ein paar Umstellungen, denn artikelid und kundennummer sind eindeutig in der Tabelle warenkorb, sie landen da brav und auch dem Kunden zugeordnet. Aber anscheinend will mein Warenkorb sie dann auch nicht wieder rausrücken ;-)
                  Vielleicht noch einen Tipp, warum er so besitzergreifend sein könnte?
                  Dankeeeee!!!

                  Kommentar


                  • #10
                    $row['bestand'] kanns zumindest schon mal gar nicht geben. Woher sollte das kommen?

                    Vielleicht liest du nochmal auf
                    http://www.php.net/mysql_fetch_array
                    http://www.php.net/mysql_fetch_row
                    und
                    http://www.php.net/manual/de/language.types.string.php

                    Kommentar


                    • #11
                      Einige Lesemomente später....
                      jetzt bin ich soweit, dass die Bestellung wie folgt funktioniert:
                      er liest den Inhalt des Warenkorbs aus - die Kundennummer ist nach Korrektur eines blöden (!) Schreibfehlers jetzt auch da -
                      er fügt die Daten in die Bestelltabelle ein (dazu gleich mehr),
                      er reduziert den richtigen Bestand um eins und er löscht die Warenkorbtabelle bezogen auf die Kundennummer.
                      Drei von vier Sachen funktionieren wunderbar.
                      Leider landet der jeweilige Artikel anstatt einmal exakt viermal (!!) in der Bestelltabelle.
                      Äh....
                      ich habe keine Ahnung....
                      Anbei der korrigierte Code:
                      PHP-Code:
                      <?php
                      error_reporting
                      (E_ALL);
                              include(
                      "dbconnect_xampp.php");
                              include(
                      "authentifizierung.php");
                      $sql "SELECT bestand, kundennummer, artikelid FROM artikel, warenkorb WHERE kundennummer = ".$_SESSION['nummer'];
                      $result mysql_query($sql) or die(mysql_error()); 
                      echo 
                      $sql;
                      while(
                      $row mysql_fetch_assoc($result)) {
                      $sql "INSERT INTO bestellungen (artikelid, kundennummer) VALUES ($row[artikelid]$row[kundennummer])"
                      mysql_query($sql) or die(mysql_error()); 
                      $sql "UPDATE artikel SET bestand = ($row[bestand]-1) where id = ($row[artikelid])";
                      mysql_query($sql) or die(mysql_error()); 
                      echo 
                      $sql;
                      $sql "DELETE FROM warenkorb WHERE kundennummer = ".$_SESSION['nummer'];
                      mysql_query($sql) or die(mysql_error()); 
                      echo 
                      $sql;
                      }
                      ?>
                      Wieso durchläuft er die Bestellung viermal???
                      (Aber immerhin - trotz des Frustes... dieses Basteln ist zumindestens lerneffektiv )

                      Kommentar


                      • #12
                        vermutlich weil die while-schleife 4 mal abgearbeitet wird.
                        teste die erste query mit pma - wird wohl 4 ergebnisse geben.

                        übrigens, wenn du eh nur einen datensatz erwartest, brauchst du keine schleife.

                        einfach
                        PHP-Code:
                        $row mysql_fetch_assoc($result); 
                        füllen und weiter geht's.

                        Kommentar


                        • #13
                          Guten Morgen,
                          nein, natürlich brauche ich das nicht nur für einen Artikel, die Schleife ist schon richtig. Und er reagiert gleich bei mehreren Artikeln - dann habe ich halt jeden viermal in der Bestelltabelle.
                          Ich weiß nicht, was pma ist, hatte aber überall ein echo dazwischen und er gibt mit das insert into auch brav viermal aus.
                          also so betrachtet dünkte mir auch schon, dass die Schleife viermal abgearbeitet wird.... allein mir fehlt die Erleuchtung, warum dies rätselhaft'Wesen dies tut....

                          Kommentar


                          • #14
                            pma ist die Abkürzung von PhpMyAdmin.
                            Und für das Wort 'Testausgaben' gibt es keine.

                            PHP-Code:
                            echo '<pre>';

                            $sql "SELECT bestand, kundennummer, artikelid FROM artikel, warenkorb WHERE kundennummer = ".$_SESSION['nummer'];
                            $result mysql_query($sql) or die(mysql_error()); 


                            while(
                            $row mysql_fetch_assoc($result)) {

                              
                            print_r($result);
                              
                            print_r($_SESSION);
                              
                            print_r($row);

                              
                            $sql "INSERT INTO bestellungen (artikelid, kundennummer) VALUES ($row[artikelid]$row[kundennummer])"
                              
                            mysql_query($sql) or die(mysql_error()); 

                              
                            $sql "UPDATE artikel SET bestand = ($row[bestand]-1) where id = ($row[artikelid])";
                              
                            mysql_query($sql) or die(mysql_error()); 

                              
                            $sql "DELETE FROM warenkorb WHERE kundennummer = ".$_SESSION['nummer'];
                              
                            mysql_query($sql) or die(mysql_error()); 

                            }

                            echo 
                            '</pre>';
                            ?> 

                            Kommentar


                            • #15
                              Hallo,
                              :-) ich dachte, phpmyAdmin wäre schon eine Abkürzung. Aber es geht wie so oft noch kürzer, smile.
                              Ich habs!!!
                              Nach dem Grübeln, warum den gerade 4 mal jeweils in die Bestelltabelle
                              und nach Ausgabe des print merkte ich, dass es sich auf die Kunden
                              bezog. Und nach einem netten Tipp von dritter Stelle (nein, kein crossposting, woanders her) wußte ich, dass ich vergessen habe
                              noch eine zweite Bedingung hinzuzufügen. So durchlief er nicht
                              nur den Warenkorb sondern auch die Artikeltabelle (derzeit vier Artikel),
                              da wiederum griff anscheinend nicht die Begrenzung auf die Kundennummer
                              (wie auch) und so arbeitete er die vier Reihen brav ab.... umpf. Jetzt
                              habe ich die Kundennummer/Sessionnummer auf den Warenkorb UND
                              die artikelid auf den Warenkorb begrenzt. Und siehe da.... ich bestelle
                              nur jedes Buch einmal.

                              Vielen lieben Dank für Eure Unterstützung!!!!
                              Erleichterte Grüße
                              Steffi

                              Kommentar

                              Lädt...
                              X