Von-Bis-Werte in einer Datenbank?

Nemesis_FF

Grünschnabel
Hallo Leute,

ich habe ein Problem und finde keine Lösung. Ich schildere es gleich mal:

Ich habe die Aufgabe einen Online-Shop für die Uni zu programmieren. Jetzt ist es so, dass meine Versandkosten nach dem Gewicht schwanken soll.

$gewicht ist also das Gewicht der Bestellung.

Jetzt soll es so sein, 0-5kg 6,90€ Versandkosten, 5-10kg 7,90€ Versandosten, 10-20kg 8,90€ Versandkosten, 20-30kg 9,90€ Versandkosten, 30-50kg 18,90e Versandkosten.... usw...

Wie löse ich das jetzt am besten? ich habe eine Tabelle mit dem Namen versandkosten. JEtzt könnte ich ja in eine spalte schreiben "gewicht" und in die andere Spalte "kosten" nur was trage ich da ein? Muss ich jetzt schreiben:

gewicht//kosten

1 // 6,90
2 // 6,90
3 // 6,90
4 // 6,90
5 // 6,90
6 // 7,90
7 // 7,90
.
.
.
40 // 18,90
41 // 19,90

****?

Und was mache ich, wenn beim Gewicht eine Kommerzahl rauskommt? Das wird ja fast immer Der Fall sein. Hat jemand eine Idee, dass wenn z.B. das Gewicht 7,45kg rauskommt, dass ich dann die passenden Versandkosten aus der Spalte ziehen kann?

Ihr würdet mir sehr helfen.

Liebe Grüße
Nemesis
 
Hi und Willkommen bei tutorials.de,

mach doch einfach eine entsprechende DB-Tabelle mit den Spalten Von-Bis-Preis
Abfrage dann ca. "WHERE meingewicht >= VonGewicht AND meingewicht < BisGewicht"
Vom Sinn her jedenfalls.

PS: Kommazahl...
 
Ahhh ich verstehe, also ich überprüfe in einer verketteten if-Anweisung if versandkosten >= 0kg AND <=5kg, $abc= 1

else if versandkosten >= 5kg AND <=10kg, $abc= 2
....

Dann suche ich SELECT preis FROM versandkosten WHERE ID="$abc";

ID ist die laufende Nummer.

So, was mache ich nun aber, wenn dummerweise das Gewicht genau 5kg ist? :D

Liebe Grüße

P.S. Vielen Dank für deien Hilfe schonmal.

P.S.S Mit dem Komma ist mir sehr peinlich.:p
 
Zuletzt bearbeitet:
Vom Prinzip her verstehst du, aber ich meinte eig.,
das Ganze direkt in der SQL-Anweisung zu machen statt in PHP.

Du willst ja den Preis zu einem bestimmten Gewicht, mehr nicht?
Wenn die Tabellenspalten Preis, VonGewicht und BisGewicht heißen
geht das genau so wie oben
SQL:
SELECT Preis FROM Gewichtspreise WHERE meingewicht >= VonGewicht AND meingewicht < BisGewicht
Nur statt meingewicht kommt eben der Inhalt einer PHP-Variable hin.


Zum "genau 5kg"
Das ist eine offene Frage am Ganzen, ob ein "Grenzwert"
zur billigeren oder teureren Preisgruppe gehört.
Programmieren kann man beides, aber wie es sein soll liegt an dir
(Lehrer/irgendwen fragen, oder einfach selbst was aussuchen...)

Mit der aktuellen Abfrage gehören Grenzwerte zur teureren Gruppe.
(Achtung: >= und <. Nicht >= und <=. Sonst passen Grenzwerte in zwei Gruppen)
 
Ah, also mache ich 3 Spalten? Einmal Preise, einmal Vongewicht und einmal Bisgewicht? GEnial...


Vielen Dank dir.:D Wenn ich da noch Probleme habe, frage ich nochmal.:D
 
Hi,

ich habe noch ein Problem, vllt. mache ich einen neuen Thread auf, aber es gibt generell Probleme, beim Auslesen der Werte aus der Datenbank. Bei Versandkosten steht z.B. in der Tabelle nur

"Resource id #7"

Das ist mein Code, es geht vllt. besser, aber es soll auf keinen Fall perfekt sein, sondern nur funktionieren::

SQL:
///Versandkosten
                                                                                                                       
$verbindenn = mysql_connect("localhost", "***", "***")
or die ("Fehler im System");

mysql_select_db("***")
or die ("Verbidung zur Datenbank war nicht möglich...");
$abfrage1 = "SELECT kosten FROM versandkosten WHERE $gewicht >= vongewicht AND $gewicht < bisgewicht";
$versandkosten = mysql_query ($abfrage1)
OR die("Error: $abfrage1 <br>".mysql_error());
mysql_close($verbindenn);
$gewicht hat aber einen Wert der auch in dem Rahmen der Tabelle verteten ist.

Lasse ich mir $versandkosten jetzt mit var_dump ausgeben, steht dort:

"resource(7) of type (mysql result)"

Dieses Problem habe ich mit allen aus der Datenbank ausgelesenden Werten, wie z.B. Produktnummer. Habe auch mit meinem LogIn und Registrierungs-, wie Gästebuch-Skript verglichen und kann den Fehler einfach nicht finden, dort klappt der Befehl so wunderbar.

Habt ihr eine Idee?

Liebe Grüße
 
Zuletzt bearbeitet:
Das ist mein Code, es geht vllt. besser, aber es soll auf keinen Fall perfekt sein, sondern nur funktionieren::
Perfekt wäre doch auch schön :D

Zwei nicht problembezogene Hinweise:
Wenn $gewicht per GET/POST reinkommt darf es nicht so einfach in die Abfrage.
Und auch, wenn es anscheinend sinnlos ist, das jedem User zu sagen:
Mysqli verwenden. Die mysql_-Funktionen sind deprecated.

Lasse ich mir $versandkosten jetzt mit var_dump ausgeben, steht dort:

"resource(7) of type (mysql result)"
Im Code seh ich nirgends, wie du das ausgibst.
Du kannst nicht einfach die Variable selbst reus-echo-en,
sondern musst dir das/die Abfragenergebnisse mit fetch-irgendas rausholen.
 
Eigentlich reicht es doch aus wenn ich eine "Gewichtsspalte" nehme und hier das Gewicht eintrage bis zu dem dieser Preis gilt.

Code:
bis kg | Preis
 1       5,00
 2       7,50
 3       9,00
 5      12,50
10      15,00

SQL:
SELECT kosten FROM versandkosten WHERE gewicht >= $gewicht ORDER BY gewicht LIMIT 1

Wenn ich jetzt 3,5 kg habe, erhalte ich 12,50 als Ergebnis.
 
Im Code seh ich nirgends, wie du das ausgibst.
Du kannst nicht einfach die Variable selbst reus-echo-en,
sondern musst dir das/die Abfragenergebnisse mit fetch-irgendas rausholen

Verstehe ich nicht? Habhe es doch uauf $abfrage1 rausgeholt und dann auf $versandkosten gespeichert!? Aber das will nicht...

Wenn $gewicht per GET/POST reinkommt darf es nicht so einfach in die Abfrage.
Und auch, wenn es anscheinend sinnlos ist, das jedem User zu sagen:
Mysqli verwenden. Die mysql_-Funktionen sind deprecated.

Das verstehe ich auch nicht.:(

@Tombe

Danke, so hätte man es vllt. auch machen können, aber die Tabelle steht ja jetzt.:p Nur das auslesen klappt nicht.:p
 
Zu ersten Teil:
Deine Abfrage ist ja so, dass genau ein Wert rauskommt
(falls ein entsprechender Gewischtsbereich für das gegebene Gewicht
in der Tabelle eingetragen ist.)
Es gibt aber auch Abfragen, die mehrere Zeilen mit jedweils mehreren Spalten als Ergebnis haben.
PHP/MySQL kann zuerst nicht wissen, dass deine nur ein Ergebnis hat,
und behandelt sie wie jede Andere auch.

Das hätte so gelöst werden können, dass man ein zweidimensionales Array
mit allen Werten bekommt. Weils aber auch Abfragen mit 100 Milliarden Ergebnissen gibt
und das viel Speicher brauchen würde gehts so auch nicht.

Was es jetzt wirklich ist: Man bekommt vorerst überhaupt kein Ergebnis.
Dafür ist in $versandkosten jetzt was drin, aus dem man nach und nach zweilenweise die
Ergebnisse abfragen kann (zB. per Schleife)
Fürs Abfragen gibts verschiedene Möglichkeiten, zB. mysql_fetch_array

Du erwartest einen einzelnen Wert, also eine Zeile mit einer Spalte.
Mach einen Aufruf von mysql_fetch_array, gibt dir die Zeile als Array,
und davon das Element [0] ist dein gesuchter Wert.

(Dass es irgendwo anders so funktioniert, wie du gerade hast, glaub ich nicht.)



Zum Teil mit GET/POST:
Hast du schon mal was von mysql_real_escape_string gehört?

Irgendwas, was von "außen" kommt (Benutzereingaben in Formularen...)
sollte man nicht direkt in SQL-Abfragen verwenden,
weil man mit passenden Eingaben alles manipulieren kann.

Beispiel:
SELECT nachname FROM mitarbeiter WHERE vorname = "$name"
$name ist in PHP etwas, dass ursprünglich vom Webseitenbenutzer eingegeben wurde

Eingabe Hans
SELECT nachname FROM mitarbeiter WHERE vorname = "Hans"
Alles in Ordnung.

Eingabe Peter
SELECT nachname FROM mitarbeiter WHERE vorname = "Peter"
Auch alles in Ordnung.


Eingabe Hans" OR vorname = "Peter
SELECT nachname FROM mitarbeiter WHERE vorname = "Hans" OR vorname = "Peter"
Damit hätt ich eine andere Abfrage.
Je nachdem, was PHP mit dem Ergebnis macht, passiert eventuell noch mehr ungewolltes.

Und mit bla"; DROP TABLE mitarbeiter; SELECT "haha
ergibt
Code:
SELECT nachname FROM mitarbeiter WHERE vorname = "bla";
DROP TABLE mitarbeiter; SELECT "haha"
lösch ich dir die ganze Mitarbeitertabelle.
(es sind drei einzelne Anweisungen geworden.
Zuerst die normale Abfrage, dann das Löschen, dann noch ein Select
um die Anführungszeichen ordentlich zu haben.)



Und zu MySQLi und deprecated:
Die Art, wie du auf die Datenbank zugreifst, sollte man schon lange nicht mehr verwenden.
Nur eine Frage der Zeit, bis es so nicht mehr funktioniert.
Leider gibts viele (alte) Einsteigertutorials, die das noch so zeigen,
und bei Google ziemlich oben stehen oder so und deswegen oft gelesen werden.
 
Zurück