
13732
20.03.2010
Datenbank insert vereinfachen
Hallo zusammen!
Ich hab mal ne Frage zu nem code wo es mir darum geht ihn ein bisschen zu vereinfachen.
Ich habe zwei Button die dann jeweils 1 Zeile aus einer Datenbank auslesen, ein paar Werte hinzufügen und in eine andere Datenbank reinschreiben.
Also das Produkt auswählen-> Session ID hinzufügen-> in Warenkorb reinschreiben.
Mein Code sieht folgendermaßen aus:
Wie kann ich das denn schreiben das ich im prinzip immer gleichen code habe und vom Button irgendwie bestimmen lasse was gelesen und geschrieben wird.
Möglichst ohne für jedes Produkt den codeblock komplett zu schreiben.
Könnt ihr mir da helfen?
Ich hab auch schon probiert den Link zu einem Bild, die Artikelbezeichnung, Artikelnummer, Preis, und den Code für einen Button in SQL zu speichern und dann auszugeben. Dann müsste ich nur ein Produkt in die Datenbank eintragen und es wär sofort verfügbar. Nur weis ich dann nicht wie ich die einzelnen Buttons auswerten soll. Weil sie haben dann ja eigentlich die gleichen Namen. Vielleicht hat dazu auch jemand ne Idee ob das so gehen würde.
MfG
PCChecker
Ich hab mal ne Frage zu nem code wo es mir darum geht ihn ein bisschen zu vereinfachen.
Ich habe zwei Button die dann jeweils 1 Zeile aus einer Datenbank auslesen, ein paar Werte hinzufügen und in eine andere Datenbank reinschreiben.
Also das Produkt auswählen-> Session ID hinzufügen-> in Warenkorb reinschreiben.
Mein Code sieht folgendermaßen aus:
<?php
//Produkt 1
//überprüfen ob Button gedrückt wurde
if (isset($_POST["produkt1"])&&
$_POST["produkt1"] == "Senden") {
//Auswahl des Artikel mit PID 1
$produkt1 = mysql_query("select * from produkt where pid ='1'");
//Aufsplittung der einzelnen Spalten der Zeile mit PID 1
while ($row = mysql_fetch_array ($produkt1)){
$artikelbez = $row['artikelbez'];
$artikelnr = $row['artikelnr'];
$pid = $row['pid'];
$preis = $row['preis'];
//Abfrage der Daten in der Spalte Menge im Warenkorb für SID und PID 1
$mengentest = mysql_query("SELECT menge FROM warenkorb WHERE sid = '$sid' AND pid = '$pid'");
$num = mysql_fetch_array($mengentest);
$menge = $num['menge'];
//Abfrage Menge von SID und PID 1 im Warenkorb
if ($menge == 0){
//Schreiben in Warenkorb wenn Menge = 0 für PID 1 (WKID, SID, PID, Artikelbez, Artikelnr, Menge=1, Preis)
mysql_query("insert into warenkorb values ('','$sid','$pid','$artikelbez','$artikelnr','1','$preis')");
//Menge-IF--Klammer schliessen
}
//Else Befehl wenn Menge im Warenkorb nicht 0 ist
else {
//erhöhen der Menge im Warenkorb von SID und PID 1 um 1
mysql_query("UPDATE warenkorb SET menge=menge+1 WHERE sid = '$sid' AND pid = '$pid'");
//Menge-Else--Klammer schliessen
}
//while-Schleife Ausführung beenden
}
//Button-IF--Klammer schliessen
}
//Produkt 2
//überprüfen ob Button gedrückt wurde
if (isset($_POST["produkt2"])&&
$_POST["produkt2"] == "Senden") {
//Auswahl des Artikel mit PID 1
$produkt2 = mysql_query("select * from produkt where pid ='2'");
//Aufsplittung der einzelnen Spalten der Zeile mit PID 2
while ($row = mysql_fetch_array ($produkt2)){
$artikelbez = $row['artikelbez'];
$artikelnr = $row['artikelnr'];
$pid = $row['pid'];
$preis = $row['preis'];
//Abfrage der Daten in der Spalte Menge im Warenkorb für SID und PID 2
$mengentest = mysql_query("SELECT menge FROM warenkorb WHERE sid = '$sid' AND pid = '$pid'");
$num = mysql_fetch_array($mengentest);
$menge = $num['menge'];
//Abfrage Menge von SID und PID 1 im Warenkorb
if ($menge == 0){
//Schreiben in Warenkorb wenn Menge = 0 für PID 2 (WKID, SID, PID, Artikelbez, Artikelnr, Menge=1, Preis)
mysql_query("insert into warenkorb values ('','$sid','$pid','$artikelbez','$artikelnr','1','$preis')");
//Menge-IF--Klammer schliessen
}
//Else Befehl wenn Menge im Warenkorb nicht 0 ist
else {
//erhöhen der Menge im Warenkorb von SID und PID 2 um 1
mysql_query("UPDATE warenkorb SET menge=menge+1 WHERE sid = '$sid' AND pid = '$pid'");
//Menge-Else--Klammer schliessen
}
//while-Schleife Ausführung beenden
}
//Button-IF--Klammer schliessen
}
?>
Wie kann ich das denn schreiben das ich im prinzip immer gleichen code habe und vom Button irgendwie bestimmen lasse was gelesen und geschrieben wird.
Möglichst ohne für jedes Produkt den codeblock komplett zu schreiben.
Könnt ihr mir da helfen?
Ich hab auch schon probiert den Link zu einem Bild, die Artikelbezeichnung, Artikelnummer, Preis, und den Code für einen Button in SQL zu speichern und dann auszugeben. Dann müsste ich nur ein Produkt in die Datenbank eintragen und es wär sofort verfügbar. Nur weis ich dann nicht wie ich die einzelnen Buttons auswerten soll. Weil sie haben dann ja eigentlich die gleichen Namen. Vielleicht hat dazu auch jemand ne Idee ob das so gehen würde.
MfG
PCChecker
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138712
Url: https://administrator.de/forum/datenbank-insert-vereinfachen-138712.html
Ausgedruckt am: 18.04.2025 um 09:04 Uhr
15 Kommentare
Neuester Kommentar
Einfach eine Variable benutzen bei
Ich würde es so machen:
PS: Ich vermisse irgentwie das du deine Werte validierst. Befasse dich mal mit dem Thema SQL-Injection
$produkt2 = mysql_query("select * from produkt where pid ='2'");
Ich würde es so machen:
$pid = (isset($_POST["produkt1"]) && $_POST["produkt1"] == "Senden") ? 1 : 2;
// Man könnte hier natürlich auch noch den anderen Button überprüfen mit einer 2. IF Frage
$produkt = mysql_query("select * from produkt where pid ='$pid'");
PS: Ich vermisse irgentwie das du deine Werte validierst. Befasse dich mal mit dem Thema SQL-Injection
Hallo!
pfeif auf POST, nimm GET
für jedes Produkt ein link, der in etwa so aussieht
danach ersetzt Du in Deinem Code die $_POST in $_GET bzw. in der Abfrage
$produkt1 = mysql_query("select * from produkt where pid ='1'");
die 1 gegen $_GET["pid"] sowie das $produkt1 gegen $produkt
usw.
alles andere scheint mir wenig sinnig zu sein.
gutes gelingen
hoffe, mich verständlich ausgedrückt zu haben.
lg
Edi
pfeif auf POST, nimm GET
für jedes Produkt ein link, der in etwa so aussieht
<a href="warenkorb.php?pid=1&sid=12345">in den Warenkorb</a>
danach ersetzt Du in Deinem Code die $_POST in $_GET bzw. in der Abfrage
$produkt1 = mysql_query("select * from produkt where pid ='1'");
die 1 gegen $_GET["pid"] sowie das $produkt1 gegen $produkt
usw.
alles andere scheint mir wenig sinnig zu sein.
gutes gelingen
hoffe, mich verständlich ausgedrückt zu haben.
lg
Edi
Anmerkung 1:
Bist Du sicher, dass deine Datenbank wirklich ökonomisch ist?
wozu hast Du in der Tabelle warenkorb die Bezeichnung, den Preis, usw.
diese Daten stehen doch bereits in der Tabelle Produkt!
Der wesentliche Unterschied zwischen einer Datenbank (access, mysql, etc.) zu einem Tabellenkalkulationsprogramm liegt in der Vermeidung redundanter Daten!
Mach Dir die Arbeit/Freude und googel mal nach relationalem Datenmodell oder Entity Relationship Model!
Vergiss daher meinen 1. Hinweis (bzw. gilt er nur bedingt als Antwort auf Deine
Frage):
Die richtige Antwort wäre:
1.) Datenbankdesign komplett ändern (sodass redundante Daten verhindert werden)
2.) Dein Insert kannst Du in einem einzigen SQL-Befehl abarbeiten (wenn das DB-Design stimmt, aber auch jetzt schon...)
3.) $_GET ist Dein Freund
Sorry, und ich hoffe, ich habe Dir den Mut nicht geraubt...
Falls obiger Code Teil einer Projektarbeit o.ä. ist, besteht der Sinn ohnehin darin, sich eine neue Welt zu erschliessen, und dann könnte Dir mein Hinweis behilfich sein.
Doppelt sorry, falls ich Dich irgendwie gekränkt habe, nichts liegt mir ferner.
Falls Du Hilfe beim Design der DB brauchst: Poste hier mal, wie dein aktueller Ansatz aussieht...
gutes gelingen
lg
Edi
Bist Du sicher, dass deine Datenbank wirklich ökonomisch ist?
wozu hast Du in der Tabelle warenkorb die Bezeichnung, den Preis, usw.
diese Daten stehen doch bereits in der Tabelle Produkt!
Der wesentliche Unterschied zwischen einer Datenbank (access, mysql, etc.) zu einem Tabellenkalkulationsprogramm liegt in der Vermeidung redundanter Daten!
Mach Dir die Arbeit/Freude und googel mal nach relationalem Datenmodell oder Entity Relationship Model!
Vergiss daher meinen 1. Hinweis (bzw. gilt er nur bedingt als Antwort auf Deine
Frage):
Datenbank insert vereinfachen
Die richtige Antwort wäre:
1.) Datenbankdesign komplett ändern (sodass redundante Daten verhindert werden)
2.) Dein Insert kannst Du in einem einzigen SQL-Befehl abarbeiten (wenn das DB-Design stimmt, aber auch jetzt schon...)
3.) $_GET ist Dein Freund
Sorry, und ich hoffe, ich habe Dir den Mut nicht geraubt...
Falls obiger Code Teil einer Projektarbeit o.ä. ist, besteht der Sinn ohnehin darin, sich eine neue Welt zu erschliessen, und dann könnte Dir mein Hinweis behilfich sein.
Doppelt sorry, falls ich Dich irgendwie gekränkt habe, nichts liegt mir ferner.
Falls Du Hilfe beim Design der DB brauchst: Poste hier mal, wie dein aktueller Ansatz aussieht...
gutes gelingen
lg
Edi
Moin urobe73,
finde deinen Kommentar sehr gut und auch sehr gut rübergebracht.
Nichtsdestotrotz - in diesem Businesscase - die zum Zeitpunkt des Bestellvorgangs gültigen Artikelbezeichnungen und zum Zeitpunkt des Bestellvorgangs gültigen Preise sollten durchaus plattgeklopft/de-normalisiert/redundant in einer neuen Tabelle "Warenkorb" gespeichert werden.
Denn die sind ja möglicherweise nicht nach 2 Jahren oder 2 Monaten reproduzierbar,
Und der Kunde würde evtl ein bisschen traurig sein, wenn er am 1.Feb. unter ProduktID 4711 einen Artikel "Restpostenramsch" für € 0,50 bestellt hat, der zum Zeitpunkt der Lieferung am 6.April dann "Unser Nostalgie-Retro-Renner" heißt und € 12,95 kostet.
Grüße
Biber
finde deinen Kommentar sehr gut und auch sehr gut rübergebracht.
Nichtsdestotrotz - in diesem Businesscase - die zum Zeitpunkt des Bestellvorgangs gültigen Artikelbezeichnungen und zum Zeitpunkt des Bestellvorgangs gültigen Preise sollten durchaus plattgeklopft/de-normalisiert/redundant in einer neuen Tabelle "Warenkorb" gespeichert werden.
Denn die sind ja möglicherweise nicht nach 2 Jahren oder 2 Monaten reproduzierbar,
Und der Kunde würde evtl ein bisschen traurig sein, wenn er am 1.Feb. unter ProduktID 4711 einen Artikel "Restpostenramsch" für € 0,50 bestellt hat, der zum Zeitpunkt der Lieferung am 6.April dann "Unser Nostalgie-Retro-Renner" heißt und € 12,95 kostet.
Grüße
Biber
Hi!
Vor allem in einer Zeit, wo der Fiskus jeden Pups der mal irgendwo, irgendwann in der tiefen Provinz abgelassen wurde, auch nach Jahren noch nachvollziehen will, muss man mit dem Begriff "Redundanz vermeiden" vorsichtig umgehen. Nicht alles was im Lehrbuch für Datenbankdesign steht kann man wirklich in der alltäglichen Praxis umsetzen...
mrtux
Vor allem in einer Zeit, wo der Fiskus jeden Pups der mal irgendwo, irgendwann in der tiefen Provinz abgelassen wurde, auch nach Jahren noch nachvollziehen will, muss man mit dem Begriff "Redundanz vermeiden" vorsichtig umgehen. Nicht alles was im Lehrbuch für Datenbankdesign steht kann man wirklich in der alltäglichen Praxis umsetzen...
mrtux
hallo!
Im Code kann ich soweit keinen Fehler entdecken, der müsste laufen!
die Zeilen
kannst Du rauswerfen, die geben so keinen Sinn mehr...
stattdessen gäbe vielleicht im Anschluss an Deinen code in der warenkorb.php eine Meldung wie
Der Artikel $artikelbez wurde in Ihren Warenkorb gelegt...
kurze Rückmeldung, obs klappt würde mich freuen
lg
Edi
Achso ja. Der PHP-Code muss ja in der "warenkorb.php" Datei stehen oder? weil ja der link darauf verweist.
richtig!Im Code kann ich soweit keinen Fehler entdecken, der müsste laufen!
die Zeilen
/*if (isset($_GET["produkt"])&&
$_GET["produkt"] == "in den Warenkorb") {
*/
kannst Du rauswerfen, die geben so keinen Sinn mehr...
stattdessen gäbe vielleicht im Anschluss an Deinen code in der warenkorb.php eine Meldung wie
Der Artikel $artikelbez wurde in Ihren Warenkorb gelegt...
kurze Rückmeldung, obs klappt würde mich freuen
lg
Edi
Hallo!
Speicher mal folgenden Code als warenkorb1.php und verändere den html-code entsprechend nach
Gib anschliessend die Bildschirmausgabe der warenkorb1.php mal in phpmyadmin als Query ein und schau, ob Du da was rausbekommst...
wenn nicht, stimmt die SQL-Abfragen nicht;
wenn doch, dann können wir weitertun bei der Fehlersuche..
lg
Speicher mal folgenden Code als warenkorb1.php und verändere den html-code entsprechend nach
<a href="warenkorb1.php?pid=1">in den Warenkorb</a>
<?php
session_start ();
$sid = session_id ();
$pid = $_GET["pid"];
//Auswahl des Artikel mit PID
$produkt = "('select * from produkt where pid = ".$pid."')";
echo $produkt;
?>
Gib anschliessend die Bildschirmausgabe der warenkorb1.php mal in phpmyadmin als Query ein und schau, ob Du da was rausbekommst...
wenn nicht, stimmt die SQL-Abfragen nicht;
wenn doch, dann können wir weitertun bei der Fehlersuche..
lg
Hi PCChecker,
ich hab' das mal mit 2 Dateien(artikel.php, warenkorb.php) durchgespielt
und funktioniert so zumindest einwandfrei.
Gruß
Günni
ich hab' das mal mit 2 Dateien(artikel.php, warenkorb.php) durchgespielt
und funktioniert so zumindest einwandfrei.
<?php
/*
* Datei artikel.php
*/
/*
* Warenkorb abfragen und anzeigen, wieviel Artikel sich darin befinden
*/
$sql="select * from warenkorb";
$result=mysql_query($sql);
echo "Im Warenkorb befinden sich ".mysql_num_rows($result)." Artikel<br><br>";
/*
* **************************************************************************
* Hier würde ich noch einen Link zu einer Seite einfügen, um den Inhalt des
* Warenkorbs anzuzeigen
* **************************************************************************
*/
/*
* Tabelle Artikel abfragen und zu jedem Artikel einen Link ausgeben, wobei es reicht,
* z.B. nur die Artikelnummer als Variable anzuhängen, denn damit ist ein Artikel ja
* eindeutig identifiziert
*/
$sql="select * from artikel";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
echo "$row[art_bez] - Preis: $row[preis] EUR <a href=\"warenkorb.php?art_nr=$row[art_nr]\">In den Warenkorb</a><br>";
}
?>
<?php
/*
* Datei warenkorb.php
*/
include("net-comm/inc/session.inc.php");
/*
* Warenkorb abfragen.
*/
$sql="select * from warenkorb where art_nr=$_GET[art_nr]";
$result=mysql_query($sql);
/*
* Wenn der Artikel sich noch nicht im Warenkorb befindet, . . .
*/
if(mysql_num_rows($result)==0){
$sql="select * from artikel where art_nr=$_GET[art_nr]";
$result=mysql_query($sql);
$row=mysql_fetch_array($result,MYSQL_ASSOC);
$art_nr=$row['art_nr'];
$art_bez=$row['art_bez'];
$preis=$row['preis'];
/*
* . . . Artikel eintragen und zurück nach artikel.php . . .
*/
$sql="insert into warenkorb(id,art_nr,art_bez,preis,menge)values('','$art_nr','$art_bez','$preis',1)";
mysql_query($sql);
header("location:artikel.php");
}else{
/*
* . . . ansonsten Menge um eins erhöhen und zurück nach artikel.php
*/
$sql="update warenkorb set menge=menge+1 where art_nr=$_GET[art_nr]";
mysql_query($sql);
header("location:artikel.php");
}
?>
Gruß
Günni
@pcchecker,
zu prüfen, ob $_GET['variable'] leer ist oder nicht, ist
m.M. nach sinnfrei. Denn wer den Link angeklickt hat, oder auch
nur mit dem Mauszeiger über den Link fährt, sieht ja, welche
Variablen am Link angehangen sind.
Von daher könnte man die Seite warenkorb.php ja auch direkt aufrufen
und z.B. warenkorb?art_nr=irgend_ein_blödsinn in die Adresszeile
eingeben.
Ich würde da jetzt mal drei Möglichkeiten sehen, um zu prüfen, ob die
Seite warenkorb.php korrekt aufgerufen wurde.
1. Man kann die Variable $_SERVER["HTTP_REFERER"] überprüfen.
Da wird die Seite gespeichert, von welcher Seite man via Link kommt.
2. Zugangsdaten anfordern(Login) und in einer Session-Variablen ablegen.
In der Seite warenkorb.php prüfen, ob Zugangsdaten vorliegen.
3. Prüfen, ob $_GET['variable'] überhaupt ein gültiger Wert ist, dann
die Tabelle abfragen, ob dieser Wert vorhanden ist.
Gruß
Günni
zu prüfen, ob $_GET['variable'] leer ist oder nicht, ist
m.M. nach sinnfrei. Denn wer den Link angeklickt hat, oder auch
nur mit dem Mauszeiger über den Link fährt, sieht ja, welche
Variablen am Link angehangen sind.
Von daher könnte man die Seite warenkorb.php ja auch direkt aufrufen
und z.B. warenkorb?art_nr=irgend_ein_blödsinn in die Adresszeile
eingeben.
Ich würde da jetzt mal drei Möglichkeiten sehen, um zu prüfen, ob die
Seite warenkorb.php korrekt aufgerufen wurde.
1. Man kann die Variable $_SERVER["HTTP_REFERER"] überprüfen.
Da wird die Seite gespeichert, von welcher Seite man via Link kommt.
2. Zugangsdaten anfordern(Login) und in einer Session-Variablen ablegen.
In der Seite warenkorb.php prüfen, ob Zugangsdaten vorliegen.
3. Prüfen, ob $_GET['variable'] überhaupt ein gültiger Wert ist, dann
die Tabelle abfragen, ob dieser Wert vorhanden ist.
Gruß
Günni