PHP Array Position raus finden?

volcem

Lieutenant
Registriert
Dez. 2007
Beiträge
1.021
Guten Tag,

ich dachte ich hätte alles richtig gemacht, doch anscheinend habe ich irgend wo einen Denkfehler.

Es geht um folgendes:

Ich schreibe in der Datenbank paar werte und suche dann anhand von array_search die Postion und lasse dann den Wert ausgeben.

Klappte auch soweit alles wenn alle werte identisch sind. Kurzes Beispiel:

Code:
3.00;10.00 ( Gebindegröße ) 
3.00;00.00;10.00;00.00 ( Preis pro Gebinde ) 

->
3.90;13.00 Gewicht!

So nun mache ich aus diesen Werten ein Array um alle Werte zu erhalten. ( entspricht nur von den Funktionen meinem Code..)

PHP:
DB -> liefert ->
$weight = "3.90;13.00";

$gewicht = explode(";", $weight);

//Verarbeite das weiter -> 

//gebinde wird geliefert von einer Auswahl, also 3.00ltr oder eben 10.00Ltr
$post = $_GET["gebinde"];
$weight = array_search($post, $gewicht);

Dann die Ausgabe:

echo "Gewicht: <b>" . $gewicht[$weight] . " Kg</b>";

So dass kann ganz klar nicht werden da Gebinde != Gewicht ist.
Doch nur wie bekomme ich die Postion nun raus?

Bei ltr = gebinde ( 10.00 - 10.00 )
Ist logisch das was ausgegeben wird...

Gebinde und Gewicht sind immer identisch von der Anzahl her.

Vielleicht denke ich auch zu kompliziert?
Hat jemand vielleicht einen Lösungsansatz, oder Tip ?


Vielen Lieben Dank
 
Zuletzt bearbeitet:
Hast du in deiner DB nicht eine Zeile in der Preis, Gewicht und Gebinde stehen?

Dann könntest du einfach abfragen:
PHP:
SELECT gewicht FROM tabelle WHERE gebinde = $post
 
Zuletzt bearbeitet:
Preis und Gebinde stehen in einer DB ->

Code:
3.00;10.00;20.00 ( Gebinde ) 
3.00;0.00;10.00;0.00;20.00;0.00 (Gebinde:Preis)
Grau (TVT 4001);Rötlich braun (TVT 4000);Abtönung (Temaspeed Farbtonkarte)

Gewicht steht in den Produktdetails:

Code:
Temaprime EUR LM
0.00
6
000051
tikkurila.jpg
3.90;13.00;26.00 <<----
2011-03-27 09:25:10
2011-03-27 09:24:46
etc etc

Gebinde hole ich aus der DB und verarbeite dass halt weiter ->

PHP:
<form action="/home/products&product_details='.$product_id.'" method="POST"><select name="gebinde">'; foreach($gebinde as $waehlegebinde) { echo'<option>'.$waehlegebinde.'</option>'; } echo '</select><input type="submit" value="Auswählen"></form>

Oder ich mache es wie beim Preis: Gebinde:Gewicht

Und dann einfach :

PHP:
$artikel = array_search($post, $weight);
$ausgabe = $artikel + 1;
echo "<b>" . $gewicht[$ausgabe] . "  Kg</b>";

Das Muster ist IMMER gleich.
Ist sowas überhaupt empfehlenswert?

*edit*

Hmm, so geht es natürlich, doch kann ja nicht sein dass man solchen schmarrn machen muss.
Leider hab ich für so einen Fall nichts brauchbareres gefunden...
 
Zuletzt bearbeitet:
Könntest du deine DB vlt. Als Relationsmodell posten ? ich steige da nich durch......
 
Entschuldigt bitte, war gestern mit meine Nichte unterwegs..

Also die DB ist wie folgt aufgebaut:

Code:
`products_additional` (
  `id` int(22) unsigned NOT NULL,
  `gebindegroesse` varchar(100) NOT NULL,
  `preis` varchar(250) NOT NULL,
  `farbton` varchar(500) NOT NULL DEFAULT 'Farblos',
  `tk` varchar(500) NOT NULL DEFAULT 'none'
) 
Datensatz
-->>
`products_additional` (`id`,`gebindegroesse`,`preis`,`farbton`,`tk`) VALUES ('16','0.375;0.750;2.50;10.00','0.375;12.48;0.750;16.65;2.50;46.68;10.00;174.60','Farblos','none');
-->

`products_shop` (
  `product_id` int(20) NOT NULL AUTO_INCREMENT COMMENT 'ID des Produkts',
  `product_title` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'Produkt Name',
  `product_price` varchar(10) COLLATE utf8_bin NOT NULL COMMENT 'Produkt Preis',
  `product_old_price` varchar(20) COLLATE utf8_bin NOT NULL,
  `product_catid` varchar(10) COLLATE utf8_bin NOT NULL COMMENT 'Kategorie ID',
  `product_orderid` varchar(10) COLLATE utf8_bin NOT NULL,
  `product_image` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'Produkt Bild',
  `product_weight` varchar(100) COLLATE utf8_bin NOT NULL,
  `product_date` varchar(30) COLLATE utf8_bin NOT NULL COMMENT 'Produkt aufgenommen am:',
  `product_date_edit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `product_description` text COLLATE utf8_bin NOT NULL COMMENT 'Beschreibung des Produkts',
  `product_manufacturers` varchar(30) COLLATE utf8_bin NOT NULL COMMENT 'Herstelller',
  `product_visable` enum('true','false') COLLATE utf8_bin NOT NULL,
  `product_special` enum('true','false') COLLATE utf8_bin NOT NULL DEFAULT 'false',
  PRIMARY KEY (`product_id`)
)

-->
`products_shop` (`product_id`,`product_title`,`product_price`,`product_old_price`,`product_catid`,`product_orderid`,`product_image`,`product_weight`,`product_date`,`product_date_edit`,`product_description`,`product_manufacturers`,`product_visable`,`product_special`) VALUES ('16','Holz-GrundierÖL plus','0.00','0.00','1','000001','Holz-GrundierÖl-plus.jpg','0.375;0.750;2.50;10.00','2011-03-24 13:58:55','2011-03-27 10:34:42','Beschreibung!</p>','Pigrol Holzschutz Produkte','true','false');

Die Werte zerlege ich mit explode..

lg

*edit*

Join würde in diesem Fall nichts bringen!
Also um die Position raus zu finden vom array.
 
Also ich versteh das DB designe immer noch nich so ganz.
Wieso sind die preis felder doppelt vorhanden ? Oder sind die Gebinde preise != Shop Preise ?

Und wieso schreibst du alles in ein Feld, getrennt mit Simikolon? Das macht das updaten später reichlich kompliziert, und wie du merkst auch das abfragen.....

Ich würde mal versuchen die Datenbank in eine Normalform zu bringen.
Sprich ein Preis einem gewicht und gebinde zuordnen.

Zudem wozu eine ID und eine order ID ?
Sind produkte nicht über die ID schon eindeutig zuordbar ?
Und wie bestimmt sich die orderid ? Wird die getriggert oder setzt du sie selber ? dann würde ich sie auf jedenfall Unique machen

bei visable und special würde ich statt enum eingach tinyint(1) nehmen.
0 = false, alles andere true

catid evtl. auch umlagern in eine eigene entität und einfach verknüpfen.

und wenn array_search nicht das ergebis liefert mal debuggen und evtl. selber über den array Iterieren.

Und natürlich müssen die Array Größen die Explode dir liefert genau gleich sein.
Also es dürfen nicht mehr Preise als Gewichte in der DB stehen, ein weiterer Grund das auseinander zu nehmen.

Wenn du jetzt nur einen wert updaten willst musst ja den gesamten String zerlegen, das gesuchte element finden, es ersetzen und einen neuen String basteln.
Laufzeit und speicher verbrauch sag ich nur ;)
 
Zuletzt bearbeitet:
Preis ist deswegen doppelt vorhanden weil nicht jedes Produkt einen Gebinde-Preis hat.

Wenn kein Gebinde angegeben ist, dann wird auf price zurück gegriffen. ( Zubehör oder so )

---

Das update ist kein Problem ( explode - replace - implode )
Das Abfragen ist naja eigentlich auch nicht kompliziert, bin halt davon ausgegangen dass man eine Position "einfach" so heraus finden kann...

---
Die order_id ist die Kategorie id, die product_id ist die Produkt ID um die Details raus zu suchen.
Wenn Du auf http://www.antischimmelpilz.de/home/index siehst Du wieso es so gemacht wird, bzw: http://www.antischimmelpilz.de/home/products&product_details=41 < mal ein Produkt!

---
enum ist schon ok so.

---
Und wie bestimmt sich die orderid ? Wird die getriggert oder setzt du sie selber ? dann würde ich sie auf jedenfall Unique machen
Die wird aus kategorie geholt ( 1-x ) ...



Aber das wird ganz schön OT,

An sich geht es ja so wie ich es nun gelöst habe, Frage war ja dann ob es anders gelöst werden kann, bei meiner Lösung.
Natürlich kann ich alles auslagern und in einzelne Tabellen schreiben, nen Join rein hauen und ausgeben lassen. Doch das alles umzubauen würde so lange dauern, dass passt nicht zum Budget was veranschlagt wurde.
 
Zurück
Oben