webForumDet fria alternativet

Räkna ut matte med databasinläsning

PHP

5 svar · 589 visningar · startad av SoulGod

Medlem sedan aug. 20051 200 inlägg
Frågan#1

Jag har en massa information jag hämtar ut såhär:

...
	$query  = "SELECT * FROM primofamilia ORDER BY datum LIMIT 0,1";
	$result = mysql_query($query);
	$query2  = "SELECT * FROM primofamilia ORDER BY datum LIMIT 1,2";
	$result2 = mysql_query($query2);	

 while($row = mysql_fetch_row($result)) {
 while($nrow = mysql_fetch_row($result2)) {
...

<tr>
 <td>Average Item Level</td>
 <td><?PHP echo $row[4]; ?></td>
 <td><?PHP echo $nrow[4]; ?></td>		
 <td></td>
</tr>
<tr>
 <td>Strength</td>
 <td><?PHP echo $row[5]; ?></td>
 <td><?PHP echo $nrow[5]; ?></td>		
 <td></td>
</tr>

Och jag vill utföra ett antal matematiska ekvationer på i de 2 tomma <td> som finns...
Det som skall utföras är:

function math() {
$change = $nrow[4]-$row[4];
$divide = $change/1000;
$result = $divide*100;
echo $result;
}

Men istället för att ha en ekvation för alla,
så vill jag kunna göra så att scriptet räknar ut alla fält jag har .. ( totalt $row[1] - $row[21] och likaså $nrow[1] - $nrow[21] ) ...

** EDIT **
Jag har nu kortat ner det, och lagt in följande i varje tom TD .. men skulle helst undvika så mycket kod extra ..
<td><?php $result = (($nrow[6]-$row[6])/1000)*100; echo $result; ?></td>

Går det att göra på ett bättre sätt?

Här finns hela koden:
http://www.copypastecode.com/47378/

Medlem sedan mars 2004485 inlägg
#2

Har du funderat på att ha med result i databasen?

Medlem sedan aug. 20051 200 inlägg
#3

Då det kommer vara 2 delar på sidan, där den ena sidan kan ändras kontinuerligt via en dropdownmeny så skulle det innebära en himla massa resultat ...

Därför har jag valt bort det alternativet..

Medlem sedan aug. 20039 340 inlägg
#4

Du gör ett par knasiga saker.

  1. LIMIT 0,1 betyder "hämta från och med den första raden (rad 0) och hämta max 1 rad". LIMIT 1,2 betyder "hämta från och med den andra raden (rad 1) och hämta max 2 rader". Den första frågan kommer därför alltid bara att returnera en rad. Därmed är det aningen fel att köra en while där. Och koden skulle inte funka vidare bra om du ökade antalet rader som fråga 1 returnerar. Du bör alltså köra $row = mysql_fetch_row($result); utan while.

  2. Bara så du är medveten, koden räknar ut "nu minus förra tidpunkten" samt "nu minus förrförra tidpunkten". Inte "nu minus förra tidpunkten" samt "förra tidpunkten minus förrförra tidpunkten". Det är kanske så du vill ha det, men det tål att påpekas.

Edit: Inte alls så, förresten. Om koden ska funka som jag beskrev skulle du dessutom behöva köra ORDER BY xxx DESC. Som det ser ut nu är den gemensamma raden den tidigaste raden. Vad värdet är "nu" får du inte veta med den frågan.

  1. Om de tidspunkter du vill jämföra alla ligger precis intill varandra i databasen räcker det med en fråga, som helt enkelt hämtar ut du tre översta raderna.

  2. Du hämtar ut data med mysql_fetch_row istället för mysql_fetch_assoc. Det i kombination med att du inte anger en ordning på fälten, utan selectar *, gör att datat du hämtar ut kan hamna i oordning om du någon gång skulle infoga nya fält mellan de andra fälten.

  3. Du delar först med 1000 och multiplicerar sedan med 100. Finns det någon anledning till att du inte bara delar med 10? Det är för övrigt inte så man räknar ut en förändring i procent. :)

Hur som haver barnen kär så rekommenderar jag något sådant här:

<?php 
include("inc_db.php");
include("inc_math.php"); 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
<html>
<head>
<title>DK Evolution Guide</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<?PHP
// Funktion för att räkna procent.
function percent($oldvalue, $newvalue){
    // Om det gamla värdet är 0 kan förändringen inte uttryckas i procent.
    if ($oldvalue == 0){
        return "--"; 

    $ratio = ($newvalue - $oldvalue) / $oldvalue;  // Beräkna kvoten.
    $percent = $ratio * 100;  // Uttryck som procent.
    return = number_format($percent, 1); // Formatera numret med en decimal.

}

// Fyll i motsvarande fältnamn i databasen på vänstersidan.
$fielddefs=Array(
'gearscore' => 'Raw Gearscore',
'sep1' => 'sep', /* Markera att en linje ska skrivas ut på denna plats. */
'hp' => 'HP',
'' => 'Average Item Level',
'sep2' => 'sep', /* Markera att en linje ska skrivas ut på denna plats. */
'' => 'Strength',
'' => 'Agility',
'' => 'Stamina',
'sep3' => 'sep', /* Markera att en linje ska skrivas ut på denna plats. */
'' => 'Damage',
'' => 'DPS',
'' => 'Attack Power',
'' => 'Speed',
'' => 'Haste',
'' => 'Hit Rating',
'' => 'Critical Rating',
'' => 'Expertise',
'' => 'Mastery',
'sep4' => 'sep', /* Markera att en linje ska skrivas ut på denna plats. */
'' => 'Armor',
'' => 'Dodge',
'' => 'Parry',
'' => 'Block',
'sep5' => 'sep', /* Markera att en linje ska skrivas ut på denna plats. */
);

	$query  = "SELECT * FROM primofamilia ORDER BY datum DESC LIMIT 0,3";
	$result = mysql_query($query);

// Hämta ut den översta raden, dvs värdet "nu".
$row = mysql_fetch_assoc($result); 

// Loopa ut övriga rader.
while($nrow = mysql_fetch_assoc($result)) {

// Skriv ut tabellhuvudet.
?>
<table width="600" class="centertext">
	<tr>
		<td>&nbsp;</td>
		<td><?PHP echo $row['date']; ?></td>
		<td><?PHP echo $nrow['date']; ?></td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td width="300">&nbsp;</td>
		<td width="100">Tidigare</td>
		<td width="100">Nu</td>
		<td width="100">% ändring</td>
	</tr>
<?PHP
    // Skriv ut övriga fält.
    foreach ($fielddefs as $dbkey => $friendlyname){

        if ($friendlyname == 'sep'){
            // Skriv ut en linje angiven i fältdefinitionen.
            echo '	<tr><td colspan="5"><hr></td></tr>';
        } else {
            // Skriv ut fält med ett värde.
?>
	<tr>
		<td><?PHP echo $friendlyname; ?></td>
		<td><?PHP echo $nrow[$dbkey]; ?></td>
		<td><?PHP echo $row[$dbkey]; ?></td>
		<td><?PHP echo percent($nrow[$dbkey], $row[$dbkey]); ?></td>

	</tr>
<?PHP
        } // if
    } // foreach
    echo '</table>';
} // while
 ?>
</body>
</html>
Medlem sedan aug. 20051 200 inlägg
#5

Du har helt rätt, min uträkning var inte rätt ...
1000 stod kvar sen jag hade fasta värden i uträkningen,
rätt skall vara såhär ...
[kod]
function math() {
$change = $nrow[4]-$row[4];
$divide = $change/$row[4];
$result = $divide*100;
echo $result;
}

Men ja .. det blev ju fel ändå .. haha ...

Jag får inte din kod att funka, ska felsöka när jag är hemma igen

Medlem sedan aug. 20039 340 inlägg
#6

SoulGod skrev:

Jag får inte din kod att funka, ska felsöka när jag är hemma igen

Har du fyllt i värdena i $fielddefs, med rätt stora/små bokstäver? Råkar du sitta på ett felmeddelande som man kan få kolla på?

255 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)