tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
579
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von dodo123
    dodo123 dodo123 ist offline Mitglied Bronze
    Registriert seit
    Oct 2011
    Beiträge
    32
    Habe folgendes Problem, ich muss einen datenbankbasierten Shop erstellen (MySQL) und bin momentan soweit, dass die ausgewählten Artikel in einer Tabelle gespeichert werden. Diese Artikel sollen nun zum anzeigen der Tabelle wieder entnommen werden, nur leider hakt es da in meinem Script

    PHP-Code:
    <?php
      
    public function auswahl($kunde# zeigt ausgewählte Artikel
      
    {
        
    $sql "SELECT a_name, w_menge
                  FROM ws_warenkorb, ws_artikel
                  WHERE w_kunde = 
    $kunde
                  AND w_artikelnr = a_artikelnr"
    ;
        
    $result $this->dbh->query($sql);
        
    $tmp $result->fetchAll(PDO::FETCH_ASSOC);
        if (
    count($tmp) > 0)
        {
          print 
    "<table>\n";
          print 
    " <tr>\n <th>Artikel</th><th>Anzahl</th>\n</tr>\n";
          foreach(
    $tmp as $key)
          {
            print 
    " <tr>\n";
            print 
    " <td>".$key['a_name']."</td><td>".$key['w_menge']."</td>\n";
            print 
    " </tr>\n";
          }
          print 
    "</table>\n";
        }
        else
          print 
    "Keine Artikel im Warenkorb gefunden.";
    ?>
    Ich bekomme beim ausführen meines Hauptprogramms folgenden Fehler:

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 'AND w_artikelnr = a_artikelnr' at line 4'

    Habe schon versucht die Variable $kunde in einfache Anführungszeichen zu setzen, dann verschwindet zwar der Fehler, aber es werden auch keine ausgewählten artikel angezeigt.
    Wäre für jeden noch so kleinen Hinweis dankbar.

    Grüße

    dodo
     

  2. #2
    Registriert seit
    Jul 2002
    Ort
    Frankfurt (Hessen)
    Beiträge
    2.135
    zwei sachen:
    erstens würde ich klammern setzen um die vergleiche
    AND ( w_artikelnr = a_artikelnr ) "
    und zweitens um den $kunden noch hochkomma wenn da ein leerzeichen drin ist wertet SQL das auch aus und denkt es kommt noch ein Befehl
    also wenn in $kunde sowas drin ist : "karl napf" denkt SQL das Napf was für Ihn ist als Befehl

    WHERE (w_kunde = ' " . $kunde . " ') AND ....

    denke ich mal
    lange kein PHP mehr gemacht
    zwischen ' und " natürlich kein leerzeichen dat ist hier nur zur deutlichkeit drin
    Geändert von melmager (22.12.11 um 22:01 Uhr)
     

  3. #3
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    Bei Leerzeichen nutze ich immer `$kunde`
    Mich würde es aber auch intressieren wie man das normal mit Leerzeichen händelt.

    Zur Query-Logik: Beim Where wird nach der w_artikelnr gesucht. Muss dann w_artikelnr in beiden Tabellen sein (ws_warenkorb, ws_artikel)? Ich weiss es wirklich nicht genau, aber wenn ja muss dann der Query komplett anders aufgebaut werden?
    Etwa sowas in der Art:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
            SELECT
                        t1.*,
                        t2.*
                  FROM
                        ws_warenkorb AS t1,
                        ws_artikel AS t2
                  WHERE 
                        t1.w_kunde = `$kunde`
                  AND 
                        t2.w_artikelnr = t1.a_artikelnr;
    Wobei ich nicht weiss ob a_artikelnr in t1 oder t2 zu finden ist. Muss man noch anpassen. Ist eh nur ein BSP.

    Gruss Joe.
    Geändert von Joe (22.12.11 um 22:19 Uhr)
     

  4. #4
    Avatar von Napofis
    Napofis Napofis ist offline require 'brain.php';
    Registriert seit
    Jun 2007
    Ort
    Bayern
    Beiträge
    587
    Hi,
    nur Bezeichner gehören in Backticks, Strings in Quotes und Zahlen werden direkt geschrieben. Man müssten wissen was in $kunde steht, ich gehe in meinem Beispiel mal von einer id aus.
    # für Kommentare sind veraltet und sollte nicht mehr verwendet werden.

    PHP-Code:
    <?php
      
    public function auswahl($kunde){
        
    $sql 'SELECT `a`.`a_name`, `w`.`w_menge`
                  FROM `ws_warenkorb` AS `w`
                  JOIN `ws_artikel` AS `a` ON `w`.`w_artikelnr`=`a`.`a_artikelnr`
                  WHERE `w`.`w_kunde`='
    .$kunde;
        
    $result $this->dbh->query($sql);
        
    $tmp $result->fetchAll(PDO::FETCH_ASSOC);
        if (
    count($tmp) > 0){?>
          <table>
          <tr>
             <th>Artikel</th>
             <th>Anzahl</th>
          </tr>
          <?php foreach($tmp as $key):?>
          <tr>
            <td><?php echo $key['a_name'];?></td>
            <td><?php echo $key['w_menge'];?></td>
          </tr>
          <?php endforeach;?>
          </table>
        <?php
        
    } else  echo 'Keine Artikel im Warenkorb gefunden.';
    ?>
    Geändert von Napofis (23.12.11 um 00:48 Uhr)
     

  5. #5
    Avatar von dodo123
    dodo123 dodo123 ist offline Mitglied Bronze
    Registriert seit
    Oct 2011
    Beiträge
    32
    Leider scheint es nicht zu funktionieren, entweder taucht die SQL-Fehlermeldung wieder auf oder ich bekomme die Nachricht dass keine Artikel im Warenkorb gefunden wurden. Habe überlegt, ob es vielleicht nicht doch an der Funkton liegt, welche die Daten in die Tabelle speichert. Habe zwar in phpmyadmin geschaut, dort werden die Datensätze angelegt, doch möglicherweise übersehe ich etwas.

    Hier mal das Script, dass die Auswahl zwischenspeichert

    PHP-Code:
    public function waehlen($artikelnummer$kunde)
      {
        if(!empty(
    $artikelnummer) && !empty($kunde))
        {
          try
          {
            
    $sql "UPDATE ws_warenkorb
                       SET w_menge = w_menge + 1
                       WHERE w_artikelnr = :nummer
                         AND w_kunde = :kunde"
    ;
            
    $result $this->dbh->prepare($sql);
            
    $result->bindParam(':nummer'$artikelnummerPDO::PARAM_INT);
            
    $result->bindParam(':kunde'$kundePDO::PARAM_INT);
            
    $result->execute();
            if (
    $result->rowCount() == 1)
              return 
    true;
              
            
    $sql "INSERT INTO ws_warenkorb
                                (w_artikelnr, w_kunde, w_menge)
                           VALUES (:nummer, :kunde, 1)"
    ;
            
    $result $this->dbh->prepare($sql);
            
    $result->bindParam(':nummer'$artikelnummerPDO::PARAM_INT);
            
    $result->bindParam(':kunde'$kundePDO::PARAM_INT);
            
    $result->execute();
            if(
    $result->rowCount() == 1)
            {
              print 
    "Datensatz wurde eingetragen.";
              return 
    true;
            }
            return 
    false;
          }
          catch(
    PDOException $e)
          {
            echo 
    $e->getMessage();
          }
        }
      } 
    Vielleicht liegt ja dort der Hund begraben, bin aber fast sicher, dass es laufen müsste. Bekomme auch jedes Mal die Ausgabe, dass der Datensatz eingetragen wurde.
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Hi, wo wird denn das PDO-Objekt instaziiert? Hast du darauf geachtet, das PDO standardmäßig überhaupt keine Fehlermeldungen liefert und das erst eingeschaltet werden muss?

    Beispiel:

    Code php:
    1
    
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    Hast du außerdem noch die allgemeine Fehleranzeige aktiviert?

    Beispiel:

    Code php:
    1
    2
    3
    
    // Schreib mich in die ersten Zeilen des Scripts
    ini_set('display_errors', 1);
    error_reporting(E_ALL|E_STRICT);
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    Avatar von dodo123
    dodo123 dodo123 ist offline Mitglied Bronze
    Registriert seit
    Oct 2011
    Beiträge
    32
    Das PDO-Objekt wird in der Artikel01.php erzeugt, im Konstruktor der Klasse.

    Habe mal die Scripte angehängt, programm46.php dient als Hauptprogramm. In der class_webshop04.php ist die Funktion zum anzeigen des Warenkorbs public function auswahl($kunde)
    Angehängte Dateien Angehängte Dateien
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Um es richtig testen und analysieren zu können fehlt noch das Datenbank-Schema. Mach einfach einen Export über phpMyAdmin und häng das SQL-File hier an.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    Avatar von dodo123
    dodo123 dodo123 ist offline Mitglied Bronze
    Registriert seit
    Oct 2011
    Beiträge
    32
    Hier mal die Datenbank
    Angehängte Dateien Angehängte Dateien
     

  10. #10
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Dein Problem ist die programm46.php. Dort wird die Methode "auswahl" der Klasse webshop gerufen. Der entsprechende Codeteil sieht so aus:

    Code php:
    1
    2
    3
    4
    5
    6
    
    if(isset($_REQUEST['wk']))
    {
      $art->inhalt($text[3]);
      $art->auswahl (isset($kunde));
      $art->inhalt($text[2]);
    }

    Um dir die Fehlersuche zu erleichtern: Was macht die Funktion isset() denn eigentlich und wird sie an dieser Stelle wirklich benötigt?

    Ich hab grad noch ein bisschen daran rum getestet: Das mit der Kundennummer als Timestamp ist totaler Blödsinn, solange die nicht mit in die Session aufgenommen wird und bei jeden Aufruf auch wieder aus der Session abgeholt. Sonst hat man bei jedem Seiten-Aufruf eine neue Kundennummer, was etwas kontraproduktiv wirkt, wenn man die Kundennummer für die Bestellung verwenden will.
    Geändert von saftmeister (28.12.11 um 10:57 Uhr)
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  11. #11
    Avatar von dodo123
    dodo123 dodo123 ist offline Mitglied Bronze
    Registriert seit
    Oct 2011
    Beiträge
    32
    So habe mal das isset aus der Auswahl rausgenommen. Hatte es ursprünglich reingenommen, da ansonsten immer eine Notice beim Warenkorb ausgegeben wurde (Undefined variable: kunde).

    Mit der Kundennummer als Timestamp gebe ich dir ja recht, ich würde es auch komplett anders machen. Leider ist es ne Übungsaufgabe fürs Fernstudium und ich muss mich an die Vorgaben halten.
    Ich muss dazu sagen, dass der Shop auch noch nicht final ist. Ich muss noch 2 Kapitel durcharbeiten, unter anderem ist eins davon die Kundenverwaltung, denke mal, da wird sich das mit dem Timestamp als Kundennummer nochmal ändern.
     

  12. #12
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Wie schon geschrieben, du musst die Kundennummer mit in die Session auf nehmen und bei jedem Seiten-Aufruf auch dort wieder rausholen, sonst bringt das ganze nix.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

Ähnliche Themen

  1. Fensterinhalt wird nicht angezeit
    Von raptot im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 9
    Letzter Beitrag: 23.04.08, 18:28
  2. Antworten: 8
    Letzter Beitrag: 07.04.07, 20:07
  3. Antworten: 7
    Letzter Beitrag: 10.11.06, 16:59
  4. Antworten: 2
    Letzter Beitrag: 31.05.04, 19:57
  5. anmeldungsfenster wird nicht angezeit
    Von ::emanuel:: im Forum Microsoft Windows
    Antworten: 2
    Letzter Beitrag: 17.03.04, 13:13