Autor |
Beitrag |
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Sa 18.02.12 19:20
Hi ich hab eine mysql Datenbank:
name picture price
Schuh meinpic.de 5; 10 ; 7
Nun möchte ich auf meiner Website den Artikel mit dem durchschnittspreis angeben.
Mfg JungerIslaender Moderiert von Christian S.: Topic aus Off Topic verschoben am So 15.07.2012 um 12:46
Zuletzt bearbeitet von JungerIslaender am Sa 18.02.12 19:48, insgesamt 1-mal bearbeitet
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 18.02.12 19:31
Ja, und?
Zitat: | a) was genau willst du?
b) was genau machst du?
c) was genau geschieht?
d) was genau an c) ist nicht wie in a) ??? |
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Niko S.
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Sa 18.02.12 19:39
Schätze mal die Preise sind mit dem ";" getrennt und er sucht nen weg die dort herauszufiltern.
Dann wäre "explode" die Funktion die du suchst.
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Sa 18.02.12 19:51
D.h. ich übergebe dann den gesamten Datensatz Preis an eine Variable und
Quelltext 1: 2: 3: 4: 5: 6:
| <?php $preis = "5; 10; 7;"; $temp = explode(";", $Preis); echo $temp[0]; // 5 echo $temp[1]; // 10 ?> |
müsste ich dann nur noch den Durchschnitt ausrechnen.
Super vielen Dank
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: So 19.02.12 17:35
Ich muss das ganze leider doch noch mal aufrollen...
" müsste ich dann nur noch den Durchschnitt ausrechnen.
Super vielen Dank " hat sich nämlich doch nich als so leicht herausgestellt. Ich finde den Fehler nämlich nicht.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| $temp = explode(";", $zeile['price']);
for ($i = 0; $i < sizeof($temp); ++$i) { $durchschnittspreis = $durchschnittspreis + $temp[i]; }; $durchschnittspreis = $durchschnittspreis / i ; //zeile 23 |
Quelltext 1:
| Warning: Division by zero in /var/www/list.php on line 23 |
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 19.02.12 19:01
++$i in der Schleife sieht seltsam aus. Ist and der Stelle egal, aber ich würd immer $i++ schreiben... Auch aus Lesbarkeitsgründen wäre ich außerdem für count() statt sizeof(). sizeof ist ein Alias, aber verwirrend finde ich das schon.
Egal, dein Problem (was dir PHP auch ansagt, wenn du Hinweise aktivierst): Da fehlt ein Dollarzeichen.
Quelltext 1:
| $durchschnittspreis = $durchschnittspreis / $i ; //zeile 23 |
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.02.12 16:51
Dammit, einfach nicht gesehehn. Danke! Wie aktiviere ich den Hinweise?
Edit: Funktioniert trotzdem nicht. echo $durchschnittspreis; Liefert 0
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| //Berechnen des Durchschnittspreises $temp = explode(";", $zeile['price']);
for ($i = 0; $i < count($temp); $i++) { $durchschnittspreis = $durchschnittspreis + $temp[i]; }; $durchschnittspreis = $durchschnittspreis / $i ;
echo '<table border="1">'; while ($zeile = mysql_fetch_array( $db_erg)) { echo "<tr>"; echo "<td>". $zeile['name'] . "</td>"; echo "<td>". $zeile['picture'] . "</td>"; echo "<td>". $zeile['price'] . "</td>"; echo "<td>". $durchschnittspreis . "</td>"; } echo "</table>"; |
Ausgabe der Tabelle:
Quelltext 1:
| Schuh 5; 10; 5; 10; 10; 0 |
Mir ist bewusst, dass $zeile['price'] noch keinen wert hat, sondern erst nach $zeile = mysql_fetch_array( $db_erg). Egal in welcher reihenfolge, der durchschnittspreis bleibt 0.
Zuletzt bearbeitet von JungerIslaender am Mo 20.02.12 17:04, insgesamt 1-mal bearbeitet
|
|
Yogu
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.02.12 17:03
Hallo,
du kannst in der Datei *php.ini* einstellen, was alles angezeigt werden soll. Dort müsste eine Zeile sein, die mit "error_reporting" anfängt. Die setzt du am besten auf:
Quelltext 1:
| error_reporting = E_ALL | E_STRICT |
Das aktiviert Warnungen, Hinweise und Hinweise bei veraltetem Code.
Füge direkt vor deinen Code folgende Zeile ein:
Quelltext
Dadurch wird dir die Variable ausgegeben und du siehst, was genau da drin steht.
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.02.12 17:09
var_dump($zeile); liefert bool(false) nach ausgabe der Tabelle
und null vor ausgabe der Tabelle
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mo 20.02.12 17:49
Du kannst auch per Funktion error_reporting(E_ALL | E_STRICT) im laufenden Skript umschalten.
Dein Code macht keinen Sinn... sinniger wäre doch erst lesen, dann ausgeben?
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| echo '<table border="1">'; while ($zeile = mysql_fetch_array( $db_erg)) { echo "<tr>"; echo "<td>". $zeile['name'] . "</td>"; echo "<td>". $zeile['picture'] . "</td>"; echo "<td>". $zeile['price'] . "</td>"; //Berechnen des Durchschnittspreises $temp = explode(";", $zeile['price']); $durchschnittspreis = 0; for ($i = 0; $i < count($temp); $i++) { $durchschnittspreis = $durchschnittspreis + $temp[$i]; } $durchschnittspreis = $durchschnittspreis / count($temp);
echo "<td>". $durchschnittspreis . "</td>"; } echo "</table>"; |
Siehe Highlight. Liest du deinen Code auch?
Ich sehe grad, dein "price" enthält auch noch Leerzeichen. Warum das dann geht ist mir nicht ganz klar. PHP eben.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.02.12 18:28
Super danke. Manchmal seh ich das einfach nicht... Und php ist nun auch nicht grad meine beste programmiersprache.
MFG
|
|
Niko S.
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Mo 20.02.12 18:33
Zitat: | Ich sehe grad, dein "price" enthält auch noch Leerzeichen. Warum das dann geht ist mir nicht ganz klar. PHP eben. |
PHP ignoriert Whitespaces beim Konvertieren. Es soll eigentlich eben die ständige Prüfung nach Whitespaces abnehmen.
Ich glaube mit EStrict wäre das nicht so einfach möglich... Bin mir da aber nicht sicher.
Man könnte auch "einfacher" eine foreach schleife benutzen für die Array die aus Explode entsteht.
tut.php-q.net/de/ ist eigentlich mein Favorit wenn es um's lernen von PHP geht.
Für diesen Beitrag haben gedankt: Martok
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.02.12 18:35
Die Leerzeichen hab ich in der Datenbank entfer. Wird jetzt nur noch durch ; getrennt.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| echo '<table border="1">'; while ($zeile = mysql_fetch_array( $db_erg)) { echo "<tr>"; echo "<td>". $zeile['name'] . "</td>"; echo "<td>". $zeile['picture'] . "</td>"; echo "<td>". $zeile['price'] . "</td>"; //Berechnen des Durchschnittspreises $temp = explode(";", $zeile['price']); $durchschnittspreis = 0; for ($i = 0; $i < count($temp); $i++) { $durchschnittspreis = $durchschnittspreis + $temp[$i]; } $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp)-1)</span>;
echo "<td>". $durchschnittspreis . "</td>"; } echo "</table>"; |
Es fehlte noch das -1. Danke für den Link mit den Tutorials
|
|
Niko S.
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Mo 20.02.12 19:01
Bist du dir da sicher dass das -1 da hin soll?
Wenn ich mich nicht irre:
Quelltext 1: 2: 3: 4: 5: 6:
| $arr[0] = 2; $arr[1] = 4; $arr[2] = 6;
$durchschnitt = ($arr[0]+$arr[1]+$arr[2]) / count($arr); // wobei count($arr) = 3 ist. |
Oder kann ich nicht mehr zählen?
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Di 21.02.12 14:25
Ansich hast du recht. In der Praxis ist es aber so(ka warum), dass count($arr) = 4 ist. Und mit dem -1 funktioniert alles wie beabsichtigt.
|
|
mvollmer
Beiträge: 42
Erhaltene Danke: 3
Delphi (Seattle), C (MPLAB X)
|
Verfasst: Di 21.02.12 15:43
|
|
Yogu
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 21.02.12 19:34
Alle Elemente zusammenzählen und dann durch die Anzahl teilen ist eigentlich schon der richtige Algorithmus, um den Mittelwert zu berechnen. Konkret:
C#-Quelltext 1:
| for ($i = 0; $i < count($temp); i++) |
ist korrekt, da die Anzahl drei sein sollte und i daher von 0 bis 2 (< 3) durchläuft. Anschließend teilst du durch die Anzahl, also 3.
Da der Algorithmus so stimmt, aber die Ausgabe unerwünscht ist, muss die Eingabe falsch sein. Deshalb würde ich wieder einmal var_dump einsetzen und $temp ausgeben. Ich denke, da ist ein leerer Eintrag dabei. Vermutlich enthält die Zeile price ein Semikolon am Anfang oder am Ende des Strings.
|
|
JungerIslaender
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Di 21.02.12 19:45
Alles klar, ich hatte die Funktion ein bisschen anders verstanden. Ich dachte 5; 10; Wären jeweils elemente und nicht
5 ;10 ;3 ;5 ; so.
Demnach ist da ein Semikolon zuviel korrekt. Den Algorhitmus hab ich schon verstanden. Dasselbe ist in Delphi nichts neues für mich. Nur mit dem php haperts ein bisschen.
|
|