Autor Beitrag
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Sa 18.02.12 20: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 user profile iconChristian S.: Topic aus Off Topic verschoben am So 15.07.2012 um 12:46


Zuletzt bearbeitet von JungerIslaender am Sa 18.02.12 20:48, insgesamt 1-mal bearbeitet
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3657
Erhaltene Danke: 600

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: Sa 18.02.12 20: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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Sa 18.02.12 20: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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Sa 18.02.12 20:51 
D.h. ich übergebe dann den gesamten Datensatz Preis an eine Variable und

ausblenden 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: So 19.02.12 18: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.

ausblenden 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


ausblenden Quelltext
1:
Warning: Division by zero in /var/www/list.php on line 23					
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3657
Erhaltene Danke: 600

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: So 19.02.12 20: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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.02.12 17:51 
Dammit, einfach nicht gesehehn. Danke! Wie aktiviere ich den Hinweise?

Edit: Funktioniert trotzdem nicht. echo $durchschnittspreis; Liefert 0

ausblenden 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:
ausblenden 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 18:04, insgesamt 1-mal bearbeitet
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.02.12 18: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:

ausblenden 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:

ausblenden Quelltext
1:
var_dump($zeile);					

Dadurch wird dir die Variable ausgegeben und du siehst, was genau da drin steht.
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.02.12 18:09 
var_dump($zeile); liefert bool(false) nach ausgabe der Tabelle
und null vor ausgabe der Tabelle
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3657
Erhaltene Danke: 600

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: Mo 20.02.12 18: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?
ausblenden 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.02.12 19:28 
Super danke. Manchmal seh ich das einfach nicht... Und php ist nun auch nicht grad meine beste programmiersprache.

MFG
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mo 20.02.12 19: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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.02.12 19:35 
Die Leerzeichen hab ich in der Datenbank entfer. Wird jetzt nur noch durch ; getrennt.

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mo 20.02.12 20:01 
Bist du dir da sicher dass das -1 da hin soll?
Wenn ich mich nicht irre:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Di 21.02.12 15: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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 41
Erhaltene Danke: 3


Delphi (Seattle), C (MPLAB X)
BeitragVerfasst: Di 21.02.12 16:43 
Count() gibt auch die Anzahl der Elemente im Array aus und nicht den höchsten Index des Arrays.

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Quelltext
1:
2:
3:
4:
  for ($i = 0; $i < count($temp); $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp)-1)</span>;



Ich würde es auch lieber so schreiben:

ausblenden Quelltext
1:
2:
3:
4:
  for ($i = 0; $i < count($temp)-1; $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp))</span>;
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 21.02.12 20:34 
Alle Elemente zusammenzählen und dann durch die Anzahl teilen ist eigentlich schon der richtige Algorithmus, um den Mittelwert zu berechnen. Konkret:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Di 21.02.12 20: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.