Andreas: Warenkorbproblem mit PHP/MySQL

Hallo!
Ich bin gerade dabei einen Warenkorb zu stricken! Bis jetzt habe ich mir das so vergestellt, das ich am Anfang, wenn etwas in den Warenkorb gelegt wird, dem user eine Session ID verpasse und die in einem Cookie speichere, denn sonst müßte ich ja die Sessionvariable an ´jeden Link hängen, nur die Frage was besser ist, wenn jetzt IE anfängt automatisch cookies zu deaktivieren, von wegen "Sicherheit":-(
Jedenfalls würdeich dann jedes gewählte Produkt mit der SessionID in einer MySQL Tabelle schreiben(alle Bestellungen in die eine Tabelle) und dann am Ende, wenn die Bestellung abgeschickt wird, alle Datensätze auslesen und in eine txt schreiben, da ich leider an die Daten in der SQL Datenbank lokal nur über den Webbrowser drankomme(kein ODBC) und ich die in meiner lokalen Datenbank (Access) speichern will.
Theoretisch so weit so gut, das mit in die txt schreiben funktioniert mit einer Bestellung bis jetzt auch ganz gut, aber wie schreibe ich mehreren Datensätze in die txt?
Und noch eine Frage zu MySQL, wie kann ich denn mehrere Datensätze auslesen, mit einem ist das klar, hab dann für jedes Feld eine Variable, aber wie ist das bei 2 oder mehr Datensätzen, da hab ich bis jetzt keine Idee, wie das geht!
Weiß hier vielleicht jemand, wie ich das am besten mache?
Vielen Dank schon im voraus,

Andreas

  1. Hallo!

    Und noch eine Frage zu MySQL, wie kann ich denn mehrere Datensätze auslesen, mit einem ist das klar, hab dann für jedes Feld eine Variable, aber wie ist das bei 2 oder mehr Datensätzen, da hab ich bis jetzt keine Idee, wie das geht!
    Weiß hier vielleicht jemand, wie ich das am besten mache?
    Vielen Dank schon im voraus,

    Andreas

    mhhh, bin mir nicht ganz sicher ob ich dich richtig verstehe, probiers deswegen mal

    $Textdatei = fopen("output.txt","a+"); // Dateiöffnen
    $SQL = "SELECT Name,Vorname FROM Kunden"; // SQL definieren
    $Ergebnis = mysql_query($SQL); // SQL senden
    if ($Ergebnis) { // Wenn SQL-Anweisung ok war
      // Solange Daten auslesen  wie vorhanden
      while ($Datensatz = mysql_fetch_array($Ergebnis,MYSQL_ASSOC)) {
        $OutputText = $Datensatz["Name"].",".$Datensatz["Vorname"];
        fwrite($Textdatei,$OutputText);
        }
      }

    fclose($Textdatei);

    Ich hoffe so etwas kommt hin.
    jedes mysql_fetch_array(...) liest einen Datensatz, beginnt mit dem ersten, beim nächsten mysql_fetch_array(...) wird dann der nächste Datensatz gelesen, durch die while-Schleife werden alle nacheinander ausgelesen.

    gruss

    Curt

    1. Hi!
      Danke für die Anleitung! Das probiere ich gleich mal aus. Leide habe ich mit MySQL bis jetzt noch keine besonderen Erfolgserlebnisse gehabt, aber ich lerne ja gerne dazu!
      Jedenfalls hätte ich noch die Frage, wie ich den Warenkorb dann in html abbilde, muß ich das ja mit Echo untereinander schreiben. Das geht natürlich auch nur mit einer Schleife, nur weiß ich in deiner Anleitung nicht, wo steht dass eine neue Zeile in der Textdatei geschrieben wird, nicht einfach dahinter, genau das Problem hätte ich mit echo, wie komme ich dann in eine neue Zeile, oder kann man das irgendwie mit einer Tabelle machen, die dem entsprechend eine neue Zeile bekommt?
      Vielen Dank nochmal,

      Andreas

      1. Jedenfalls hätte ich noch die Frage, wie ich den Warenkorb dann in
        html abbilde, muß ich das ja mit Echo untereinander schreiben. Das
        geht natürlich auch nur mit einer Schleife, nur weiß ich in deiner
        Anleitung nicht, wo steht dass eine neue Zeile in der Textdatei
        geschrieben wird,

        Er hat das "\n" am Ende von $OutputText weggelassen. Wenn du Windows
        benutzt, mußt du wahrscheinlich eher "\r\n" benutzen, aber ich kenne deine Datenbank nicht.

        wie komme ich dann in eine neue Zeile, oder kann man das irgendwie
        mit einer Tabelle machen, die dem entsprechend eine neue Zeile
        bekommt?

        Also bei HTML springt einem <table> ja geradezu an den Hals, wenn man tabellenförmige Daten wie einen Warenkorb ausgeben will.

        Gruß,
          soenk.e

        PS: Mir ist bei meinem Beispiel hier und da auch eine Variable runtergefallen, aber das wirst du schon merken :)

        1. Hi!

          Er hat das "\n" am Ende von $OutputText weggelassen.

          Ja, hätte ich auch selbst drauf kommen können:-)

          Also bei HTML springt einem <table> ja geradezu an den Hals, wenn man tabellenförmige Daten wie einen Warenkorb ausgeben will.

          Ja, denke ich mir auch, nur kann ich mir da überhaupt nichtvorstellen, wie sowas code-mäßig aussehen würde, denn man gibt doch oben in der Tabelle die Anzahl der Zeilen an, oder? Ok, mit Echo kann man ja was in jedes Feld schreiben, muß ja auch eine Schleife sein, aber wie mache ich das dann, das je nach Anzahl der Datensätze verschiedene Anzahlen an TabellenZeilen im html-Code stehen???
          Wie gesagt, theoretisch ist das sehr logisch das man das so macht, nur kann ich mir beim besten Willen nicht vorstellen, wie der Code für so eine Tabelle aussehen müßte!
          Aber wahrscheinlich ist das wieder viel einfacher als ich gedacht hatte:-)

          Gruß
          Andreas

          1. Also bei HTML springt einem <table> ja geradezu an den Hals,
            wenn man tabellenförmige Daten wie einen Warenkorb ausgeben will.

            Ja, denke ich mir auch, nur kann ich mir da überhaupt nicht
            vorstellen, wie sowas code-mäßig aussehen würde, denn man
            gibt doch oben in der Tabelle die Anzahl der Zeilen an, oder?

            Nein, seit wann denn das? Eine ganz einfache Tabelle sieht so aus:

            <table>
            <tr><td>Zeile 1, Spalte 2</td><td>Zeile 1, Spalte 2</td></tr>
            <tr><td>Zeile 2, Spalte 2</td><td>Zeile 2, Spalte 2</td></tr>
            </table>

            http://selfhtml.teamone.de/html/tabellen/

            Deine Ausgabeschleife kann zum Beispiel so aussehen:

            echo "<table>\n";
            while ($row=mysql_fetch_row($db_result))
             {
              echo "<tr><td>$row[0]</td><td>$row[1]</td></tr>\n";
             };
            echo "</table>\n";

            Die \n sind nicht unbedingt erforderlich, erhöhen aber die Lesbarkeit des Quelltextes ungemein.

            Die Anzahl an Datensätzen erhältst du im übrigen mit mysql_num_rows().

            Aber wahrscheinlich ist das wieder viel einfacher als ich gedacht hatte:-)

            Ich habe auch den Eindruck, daß du momentan ein ganz klein wenig auf dem Schlauch stehst ;)

            Gruß,
              soenk.e

  2. Warenkorb gelegt wird, dem user eine Session ID verpasse und die
    in einem Cookie speichere, denn sonst müßte ich ja die Sessionvariable
    an ´jeden Link hängen, nur die Frage was besser ist, wenn jetzt IE
    anfängt automatisch cookies zu deaktivieren, von wegen "Sicherheit":-(

    Das Cookie-Problem hast du nicht nur beim IE, sondern bei allen Browsern. Beim IE kann man praktischerweise die Sites in verschiedene Zonen eintragen.
    Du solltest irgendwo eine Info hinterlassen, daß dein Server kein IIS ist und Cookies bei dir sicher sind.

    Jedenfalls würdeich dann jedes gewählte Produkt mit der SessionID
    in einer MySQL Tabelle schreiben(alle Bestellungen in die eine
    Tabelle) und dann am Ende, wenn die Bestellung abgeschickt wird,
    alle Datensätze auslesen und in eine txt schreiben, da ich leider

    Theoretisch so weit so gut, das mit in die txt schreiben
    funktioniert mit einer Bestellung bis jetzt auch ganz gut, aber
    wie schreibe ich mehreren Datensätze in die txt?

    Wie meinst du das? In einer Schleife natürlich.

    Und noch eine Frage zu MySQL, wie kann ich denn mehrere Datensätze
    auslesen, mit einem ist das klar, hab dann für jedes Feld eine
    Variable, aber wie ist das bei 2 oder mehr Datensätzen, da hab ich
    is jetzt keine Idee, wie das geht!

    Komplettbeispiel:

    $kunde=gib_mir_kundennummer();
    $datei=fopen("bestellung_".$kunde.".txt");
    mysql_query("kaufhaus_kleckermann","select artikel,menge,kommentar from warenkorb where kunde=$kunde");
    while ($row=mysql_fetch_row())
     {
      fputs($datei,"$row[0]\t$row[1]\t$row[2]\n");
     };
    mysql_query("delete from bestellungen where kunde=$kunde");
    fclose($datei);

    Gruß,
      soenk.e

    1. Hallo!

      Das Cookie-Problem hast du nicht nur beim IE, sondern bei allen Browsern. Beim IE kann man praktischerweise die Sites in verschiedene Zonen eintragen.
      Du solltest irgendwo eine Info hinterlassen, daß dein Server kein IIS ist und Cookies bei dir sicher sind.

      Also was meinst Du, soll ich das mit Cookies machen, oder nicht? Man kann das ja hinschreiben, dass das nurmit Cookies geht, und deine iis Info dazu, aber das weiß doch eh kaum jemand, oder? Für die kann ich ja die Apache Version hinschreiben:-)

      Oder über die Links, nur muß ich dann ja alle Seiten ändern!

      Komplettbeispiel:

      Werd ich auch mal probieren!

      Gruß
      Andreas

      1. Das Cookie-Problem hast du nicht nur beim IE, sondern bei allen Browsern.

        Also was meinst Du, soll ich das mit Cookies machen, oder nicht?

        Wenn du den Aufwand mit SessionID an die Verweise dranhängen nicht haben willst, mußt du wohl oder übel auf Cookies ausweichen. Anders geht's nicht, die Entscheidung liegt bei dir :)

        Aber davon abgesehen haben die meisten Leute nichts dagegen, wenn Cookies benutzt werden, solange die Dinger mit Beenden des Browsers wieder verschwinden (also solche, die ohne expires-Angabe gesetzt werden).

        Wenn du es ganz clever machen willst, kannst du auch noch eine Prüfung einbauen, ob der Browser Cookies annimmt oder nicht, und falls nicht, eine entsprechende Warnung ausgeben.

        Gruß,
          soenk.e

        1. Hi!
          Ja, wird wohl das beste sein. Aber wenn ich das mit Links machen wollte, muß ich ja aus allen Seiten PHP-Seiten machen, die jedesmal nach der SessionID fragen. ist zwar immer derselbe Code, aber sind doch ein paar mehr Seiten, die das bei mir betrifft. Naja, muß ich mir nochmal in Ruhe überlegen. Problem sehe ich eigenlich nicht in den Leuten die Ahnung  haben, eher die die keine haben und nur noch immer verrückter gemacht werden, mit den bösen Cockies, und da vor allem das mit dem IE6.0, die meisten Leute kennen sich mit Cockies nicht aus, haben die mal in nem negativen Zusammenhang gehört und ich weiß nicht ob die extra die Standardeinstellung verändern werden!
          Gruß
          Andreas

  3. Hallo Andreas,

    Jedenfalls würdeich dann jedes gewählte Produkt mit der SessionID in einer MySQL Tabelle schreiben(alle Bestellungen in die eine Tabelle) und dann am Ende, wenn die Bestellung abgeschickt wird, alle Datensätze auslesen und in eine txt schreiben, da ich leider an die Daten in der SQL Datenbank lokal nur über den Webbrowser drankomme(kein ODBC) und ich die in meiner lokalen Datenbank (Access) speichern will.

    Ich arbeite gerade an einem Beispielwarenkorb fuer die Ausbildung und mache das dort ebenso mit der Session-ID, die mit jedem Link uebergeben wird und im Warenkorb die User identifiziert.

    Am Anfang jeder Folgedatei wird noch geprueft, ob die uebergebene ID mit der Session-ID uebereinstimmt und falls nicht, auf die Startseite geleitet.

    Und noch eine Frage zu MySQL, wie kann ich denn mehrere Datensätze auslesen, mit einem ist das klar, hab dann für jedes Feld eine Variable, aber wie ist das bei 2 oder mehr Datensätzen, da hab ich bis jetzt keine Idee, wie das geht!

    In meinem Beispiel gehe ich so vor:

    SELECT ... FROM warenkorb WHERE PID='$PID' AND UID='$PHPSESSID'

    (In der Tabelle warenkorb gibt es die Felder UID, PID und ANZ, in der Tabelle katalog PID, PNAME, PINFO und PREIS.)

    Daraus kann man dann wahlweise in einer SAchleife mit mysql_fetch_array(), mysql_fetch_row(), mysql_result() die erhaltenen Reihen abfragen und weiter auswerten.

    Zum Probieren: http://www.datenverdrahten.de/minishop/

    Klappt soweit recht gut, ist aber nur zum Erklaeren von Prinzipien gedacht und deshalb auf wesentliche Dinge beschraenkt.

    MfG, Thomas

    1. Hallo Andreas,

      Ich arbeite gerade an einem Beispielwarenkorb fuer die Ausbildung und mache das dort ebenso mit der Session-ID, die mit jedem Link uebergeben wird und im Warenkorb die User identifiziert.

      Ist nur bei einem vorhandenen Shop etwas schwer nachträglich zu realisieren.

      Am Anfang jeder Folgedatei wird noch geprueft, ob die uebergebene ID mit der Session-ID uebereinstimmt und falls nicht, auf die Startseite geleitet.

      Dann ist der Warenkorb natürlich leer. Aber wie kann das denn passieren? Ich hatte nur mal das Problem, dass ich über mehrere Domains ging, und da war dann auch immer alles weg.

      In meinem Beispiel gehe ich so vor:

      SELECT ... FROM warenkorb WHERE PID='$PID' AND UID='$PHPSESSID'

      (In der Tabelle warenkorb gibt es die Felder UID, PID und ANZ, in der Tabelle katalog PID, PNAME, PINFO und PREIS.)

      Daraus kann man dann wahlweise in einer SAchleife mit mysql_fetch_array(), mysql_fetch_row(), mysql_result() die erhaltenen Reihen abfragen und weiter auswerten.

      Zum Probieren: http://www.datenverdrahten.de/minishop/

      Hab ich probiert, nicht schlechtn nur das löschen von Produkten aus dem Warenkorb mit  -1 finde ich blöd, kann man da nicht einfach einn link machen, der eine Delete-Abfrage aussführt?

      Gruß
      Andreas

      1. Hab ich probiert, nicht schlechtn nur das löschen von Produkten aus dem Warenkorb mit  -1 finde ich blöd, kann man da nicht einfach einn link machen, der eine Delete-Abfrage aussführt?

        Klar, kann man das so machen, es wird ja in meinem Beispiel auch nur abgefragt, ob die Anzahl==-1 ist und dann folgend:
        DELETE FROM warenkorb WHERE PID='$PID' AND UID='$PHPSESSID'

        Meine Kursteilnehmer/innen sollen ja auch noch eigene Ideen einbringen koennen ;-). Ansonsten ist das ein erweiterbarer Prototyp.

        MfG, Thomas