13732
Goto Top

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:

<?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

Content-Key: 138712

Url: https://administrator.de/contentid/138712

Printed on: April 23, 2024 at 20:04 o'clock

Member: EvilMoe
EvilMoe Mar 20, 2010 at 10:31:38 (UTC)
Goto Top
Einfach eine Variable benutzen bei
$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
Member: Edi.Pfisterer
Edi.Pfisterer Mar 20, 2010 at 10:47:10 (UTC)
Goto Top
Hallo!
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
Member: Edi.Pfisterer
Edi.Pfisterer Mar 20, 2010 at 10:58:53 (UTC)
Goto Top
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):
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
Member: Biber
Biber Mar 20, 2010 at 11:25:01 (UTC)
Goto Top
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
Member: Edi.Pfisterer
Edi.Pfisterer Mar 20, 2010 at 11:29:05 (UTC)
Goto Top
hallo Biber,
wo du recht hast, hast du recht! face-wink
lg
Member: mrtux
mrtux Mar 20, 2010 at 14:28:35 (UTC)
Goto Top
Hi!

Zitat von @Edi.Pfisterer:
wo du recht hast, hast du recht! face-wink

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
Mitglied: 13732
13732 Mar 22, 2010 at 17:32:23 (UTC)
Goto Top
Hi urobe73

Ich bin mir nicht ganz sicher ob ich dich richtig verstanden habe. Vielleicht kannst du dirs ja nochmal anschauen. Ich hab das jetzt so gemacht (bzw verstanden):

<?php 
session_start ();
echo session_id ();
$sid = session_id ();
include("config.php");  

//überprüfen ob Button gedrückt wurde              Ich hab das hier komplett auskommentiert. ich weis nicht ob ich das noch braucht. es geht aber weder mit noch ohne
/*if (isset($_GET["produkt"])&& 
	$_GET["produkt"] == "in den Warenkorb") { 
*/
	//Auswahl des Artikel mit PID 1
	$produkt = mysql_query('select * from produkt where pid = $_GET["pid"]');  

	//Aufsplittung der einzelnen Spalten der Zeile mit PID 1
	while ($row = mysql_fetch_array ($produkt)){

		$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    auch auskommentiert 
}*/
?>
In HTML hab ich dann geschrieben
<a href="warenkorb.php?pid=1">in den Warenkorb</a>  
<a href="warenkorb.php?pid=2&sid=<?php $sid ?>">in den Warenkorb</a>  
Er zeigt mir dann zwar den Warenkorb an aber es wird nichts hinzugefügt. Egal ob bei dem Link mit oder ohne SID.
Ich weis noch nicht so genau was ich falsch machen. Befass mich erst seit 2 Wochen mit PHP. Sorry wegen der dummen Fragen.
Achso ja. Der PHP-Code muss ja in der "warenkorb.php" Datei stehen oder? weil ja der link darauf verweist.

mfg
PCChecker
Member: Edi.Pfisterer
Edi.Pfisterer Mar 23, 2010 at 11:06:08 (UTC)
Goto Top
hallo!

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
Mitglied: 13732
13732 Mar 23, 2010 at 16:44:31 (UTC)
Goto Top
Leider gehts nicht.

Folgende Fehlermeldung wird angezeigt:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /users/toxicspeed/www/warenkorb.php on line 31

$produkt = mysql_query('select * from produkt where pid = $_GET["pid"]');  

//Aufsplittung der einzelnen Spalten der Zeile mit PID 1
while ($row = mysql_fetch_array ($produkt)){

	$artikelbez	=	$row['artikelbez'];  
	$artikelnr	=	$row['artikelnr'];  
	$pid		=	$row['pid'];  
	$preis		=	$row['preis'];  
Die Zeile 31 ist die "while"-Zeile. Wobei ich durch rumprobieren und das $_GET["pid"] in ne Variable geschrieben habe und die Variable anstelle des $_GET["pid"] eingesetzt hab rückt der Fehler nach oben.
Irgendwie geht das $_GET["pid"] nicht glaub ich. ich weis nur nicht warum.
Member: Edi.Pfisterer
Edi.Pfisterer Mar 24, 2010 at 10:24:20 (UTC)
Goto Top
Hallo!
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
Member: Edi.Pfisterer
Edi.Pfisterer Mar 24, 2010 at 10:26:55 (UTC)
Goto Top
Anmerkung:
Fehlt da nicht etwas in der Zeile 31?

Schau mal hier...
Member: Guenni
Guenni Mar 25, 2010 at 19:18:50 (UTC)
Goto Top
Hi PCChecker,

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
Mitglied: 13732
13732 Mar 27, 2010 at 08:03:35 (UTC)
Goto Top
Hi

Danke für eure Mühe. Wenn ich heute Nachmittag mal Zeit hab werd ichs probieren.

MfG
Mitglied: 13732
13732 Mar 28, 2010 at 12:31:16 (UTC)
Goto Top
So jetzt hab ich mal Zeit gehabt das ganze auszuprobieren. Und ich muss sagen das es geht. Hab dann nur noch eine kleine Frage.

<?php

include("config.php");  

$getnr = $_GET[art_nr];

$result		= mysql_query ("select * from warenkorb where artikelnr = $getnr");  


if(mysql_num_rows($result)==0 && (!empty($getnr))){
	
$result2	= mysql_query ("select * from artikel where art_nr = $getnr");  
$row		= mysql_fetch_array($result2,MYSQL_ASSOC);
$pid		= $row['id'];  
$art_nr		= $row['art_nr'];  
$art_bez	= $row['art_bez'];  
$preis		= $row['preis'];  


mysql_query("insert into warenkorb(sid,pid,artikelbez,artikelnr,menge,stkpreis) values ('$sid','$pid','$art_bez','$art_nr','1','$preis')");  
header("Location: artikel.php");  
}

else

{
mysql_query("update warenkorb set menge=menge+1 where artikelnr = $getnr");  
header("Location: artikel.php");  
}
?>

1. Frage
Kann ich beim IF-Befehl in Zeile 10 das (!empty....) so schreiben um zu überprüfen ob die Seite über den Link aufgerufen wird oder direkt. Sollte doch so gehen. Weil wenn ich das weglass und dann die "zumwarenkorb.php" direkt aufruf wird trotzdem was in den Warenkorb gelegt. Allerdings nur mit Session ID und Menge 0. So sollte ich das doch umgehen können wenn ich einfach frag ob die Variable $getnr nicht leer ist.

Wär super wenn ihr mir da auch noch helfen könnt.

MfG
PCChecker
Member: Guenni
Guenni Mar 31, 2010 at 18:08:49 (UTC)
Goto Top
@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