ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
579
579
EMPFEHLEN
-
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
Ich bekomme beim ausführen meines Hauptprogramms folgenden Fehler: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.";
?>
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 drinGeändert von melmager (22.12.11 um 22:01 Uhr)
-
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:
Wobei ich nicht weiss ob a_artikelnr in t1 oder t2 zu finden ist. Muss man noch anpassen. Ist eh nur ein BSP.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;
Gruss Joe.Geändert von Joe (22.12.11 um 22:19 Uhr)
-
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)
-
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
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.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', $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();
}
}
}
-
26.12.11 15:15 #6
- 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 ;-)
-
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)
-
27.12.11 20:00 #8
- 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 ;-)
-
Hier mal die Datenbank
-
28.12.11 10:50 #10
- 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:
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 ;-)
-
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.
-
29.12.11 15:18 #12
- 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
-
Fensterinhalt wird nicht angezeit
Von raptot im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 9Letzter Beitrag: 23.04.08, 18:28 -
Datensatz löschen geht nicht - was mache ich falsch?
Von nilox im Forum PHPAntworten: 8Letzter Beitrag: 07.04.07, 20:07 -
Download geht nicht was mache ich falsch?
Von aargau im Forum PHPAntworten: 7Letzter Beitrag: 10.11.06, 16:59 -
[PHP/MySQL] Bei Datenausgabe wird der erste eintrag nicht angezeit...
Von nDeedy im Forum PHPAntworten: 2Letzter Beitrag: 31.05.04, 19:57 -
anmeldungsfenster wird nicht angezeit
Von ::emanuel:: im Forum Microsoft WindowsAntworten: 2Letzter Beitrag: 17.03.04, 13:13





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren