Warenkorb wird nicht angezeit, was mache ich falsch?

dodo123

Mitglied
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:
<?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
 
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
 
Zuletzt bearbeitet:
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:
SQL:
	    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.
 
Zuletzt bearbeitet von einem Moderator:
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:
<?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.';
?>
 
Zuletzt bearbeitet:
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:
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', $artikelnummer, PDO::PARAM_INT);
        $result->bindParam(':kunde', $kunde, PDO::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', $artikelnummer, PDO::PARAM_INT);
        $result->bindParam(':kunde', $kunde, PDO::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.
 
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:

PHP:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Hast du außerdem noch die allgemeine Fehleranzeige aktiviert?

Beispiel:

PHP:
// Schreib mich in die ersten Zeilen des Scripts
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);
 
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)
 

Anhänge

  • scripte.zip
    7,7 KB · Aufrufe: 43
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.
 
Dein Problem ist die programm46.php. Dort wird die Methode "auswahl" der Klasse webshop gerufen. Der entsprechende Codeteil sieht so aus:

PHP:
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.
 
Zuletzt bearbeitet:
Zurück