Avatar billede KenniDN Nybegynder
01. oktober 2010 - 17:04 Der er 8 kommentarer og
1 løsning

Sortering af output fra mysql

Jeg har et script, hvor jeg godt kunne tænke mig at tilføje muligheden for at sortere på mindstepris via en dropdown box som denne:

<form action="" method="GET"><select onchange="this.form.submit();" name="sorter"><option value="">Vælg sortering</option><option value="m">Sorter på mindstepris</option><option value="b">Sorter på købspris</option></select></form>

Mit nuværende script ser sådan ud:

<?php

mysql_connect("localhost", "********", "********") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

// Sanisering af bruger input
$id = (int) $_GET['mobile_id'];

// SQL
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id.' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';

// Query
$query = mysql_query($sql) or die(mysql_error());

// Generer resultat
$result = array();
while($row = mysql_fetch_assoc($query)) {
$result[] = $row;
}
?>
<!-- HTML Template -->
<table class="data" cellpadding="0" cellspacing="0" border="0">
<tr>
<td class="hd" style="width: 130px;"></td>
<td class="hd" style="width: auto;"></td>
<td class="hd" style="width: 145px;"></td>
</tr>
<?php $bgcolor="#f1f1f1";?>
<?php foreach($result as $row): ?>
<tr onclick="window.open('<?php echo $row['link1']; ?>');" class="trhand" bgcolor="<?php echo $bgcolor; ?>" onmouseover="this.bgColor = '#e3f4f8';" onmouseout ="this.bgColor = '<?php echo $bgcolor; ?>';return true;">
<?php $bgcolor = ($bgcolor=="#f1f1f1" ? "#ffffff" : "#f1f1f1"); ?>
<td class="dataclass_udbyder">
<img src="img/teleselskaber/<?php echo $row['logo']; ?>" alt="<?php echo $row['network_name']; ?>" border="1" />
</td>
<td class="dataclass">
<div class="dataover"><? echo $row['name']; ?></div>
<div class="dataclass2"><b>Minuttakst:</b> DKK <?php echo $row['minuttakst']; ?><br /><b>Taksering:</b> <?php echo $row['taksering']; ?><br /><b>Opkaldsafgift:</b> DKK <?php echo $row['opkaldsafgift']; ?></div>
<div class="dataclass2"><b>SMS pris:</b> DKK <?php echo $row['sms']; ?><br /><b>MMS pris:</b> DKK <?php echo $row['mms']; ?><br /><b>Data pris:</b> DKK <?php echo $row['data']; ?></div>
<div class="dataclass2"><b>Abonnement:</b> DKK <?php echo $row['abonnement']; ?>,-/md.<br /><b>Binding:</b> <?php echo $row['binding']; ?> mdr.<br /><b>Oprettelse:</b> DKK <?php echo $row['oprettelse']; ?>,-</div>
</td>
<td class="dataclass_koeb rh">
<div class="pris">Pris DKK <?php echo $row['price']; ?>,-</div><img src="img/koebnu.png" alt="Køb nu!" /><br /><div class="mindstepris">Mindstepris DKK <?php $sum_total = ( $row['abonnement'] * $row['binding'] ) + $row['oprettelse'] + $row['price']; print ($sum_total); ?>,-</div>
</td>
</tr>
<?php endforeach; ?>
</table>

Hvordan vil man kunne lave dette?
Avatar billede tjens Nybegynder
01. oktober 2010 - 21:37 #1
Da $sql bare en tekststring kan du lade ORDER BY delen blive tilsat af en if på din nye sorteringsoption.

Siden vil dog reloade for at SQL'en kan køre igen, og dermed skal du kopiere andre relevante variable op i din nye form som hidden felter.
f.eks mobile_id

Lidt kort skrevet af mig, men kan du se ideen?
Avatar billede KenniDN Nybegynder
01. oktober 2010 - 23:51 #2
Nej jeg er desværre ikke helt med, er stadig newbie til PHP.

Kan du evt. lave eller linke til et lille eksempel, så tror jeg nemmere jeg forstår hvad du mener :)

Jeg var godt klar over at siden blev nød til at reloade for at hente oplysningerne igen, men jeg er ikke helt med på det der med hidden felter osv.
Avatar billede tjens Nybegynder
02. oktober 2010 - 00:27 #3
Det med hidden felt er fordi du har lagt op til en ny lille form:
Når din side bliver kaldt anden gang af denne form vil du mangle input i $_GET['mobile_id']

Derfor skal din ekstra form udvides med;
<input type="hidden" name="mobile_id" value="<?php echo $id; ?>" />


Når du danner $sql skal du teste på om den alternative sortering er valgt:
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id;

if (isset($_GET['sorter']) && $_GET['sorter'] == 'm' {
    $sql += ' ORDER BY  (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
} else {
    $sql += ' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
}

Der testes på om get-variabel sorter findes og om den er = "m" for at give den nye sortering på sql'en. Ellers gives den normale sortering.
Avatar billede KenniDN Nybegynder
02. oktober 2010 - 02:05 #4
Nu har jeg jeg lige prøvet at sammensætte min kode med det du skrev, så den bliver således:

<?php

mysql_connect("localhost", "********", "********") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

// Sanisering af bruger input
$id = (int) $_GET['mobile_id'];

// SQL
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id;

if (isset($_GET['sorter']) && $_GET['sorter'] == 'm') {
    $sql += ' ORDER BY (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
} else {
    $sql += ' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
}
// Query
$query = mysql_query($sql) or die(mysql_error());

// Generer resultat
$result = array();
while($row = mysql_fetch_assoc($query)) {
$result[] = $row;
}
?>

<div class="vaelg"><form action="" method="GET"><input type="hidden" name="mobile_id" value="<?php echo $id; ?>" /><select onchange="this.form.submit();" name="sorter"><option value="">Vælg sortering</option><option value="m">Sorter på mindstepris</option><option value="b">Sorter på købspris</option></select></form></div>

<!-- HTML Template -->
<table class="data" cellpadding="0" cellspacing="0" border="0">
<tr>
<td class="hd" style="width: 130px;"></td>
<td class="hd" style="width: auto;"></td>
<td class="hd" style="width: 145px;"></td>
</tr>
<?php $bgcolor="#f1f1f1";?>
<?php foreach($result as $row): ?>
<tr onclick="window.open('<?php echo $row['link1']; ?>');" class="trhand" bgcolor="<?php echo $bgcolor; ?>" onmouseover="this.bgColor = '#e3f4f8';" onmouseout ="this.bgColor = '<?php echo $bgcolor; ?>';return true;">
<?php $bgcolor = ($bgcolor=="#f1f1f1" ? "#ffffff" : "#f1f1f1"); ?>
<td class="dataclass_udbyder">
<img src="img/teleselskaber/<?php echo $row['logo']; ?>" alt="<?php echo $row['network_name']; ?>" border="1" />
</td>
<td class="dataclass">
<div class="dataover"><? echo $row['name']; ?></div>
<div class="dataclass2"><b>Minuttakst:</b> DKK <?php echo $row['minuttakst']; ?><br /><b>Taksering:</b> <?php echo $row['taksering']; ?><br /><b>Opkaldsafgift:</b> DKK <?php echo $row['opkaldsafgift']; ?></div>
<div class="dataclass2"><b>SMS pris:</b> DKK <?php echo $row['sms']; ?><br /><b>MMS pris:</b> DKK <?php echo $row['mms']; ?><br /><b>Data pris:</b> DKK <?php echo $row['data']; ?></div>
<div class="dataclass2"><b>Abonnement:</b> DKK <?php echo $row['abonnement']; ?>,-/md.<br /><b>Binding:</b> <?php echo $row['binding']; ?> mdr.<br /><b>Oprettelse:</b> DKK <?php echo $row['oprettelse']; ?>,-</div>
</td>
<td class="dataclass_koeb rh">
<div class="pris">Pris DKK <?php echo $row['price']; ?>,-</div><img src="img/koebnu.png" alt="Køb nu!" /><br /><div class="mindstepris">Mindstepris DKK <?php $sum_total = ( $row['abonnement'] * $row['binding'] ) + $row['oprettelse'] + $row['price']; print ($sum_total); ?>,-</div>
</td>
</tr>
<?php endforeach; ?>
</table>

Men når jeg køre koden nu, får jeg denne fejl, som jeg ikke rigtig forstår:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1

Men ellers gav forklaringen med et hidden felt god mening, så tak for det :)
Avatar billede KenniDN Nybegynder
02. oktober 2010 - 02:07 #5
Nu har jeg jeg lige prøvet at sammensætte min kode med det du skrev, så den bliver således:

<?php

mysql_connect("localhost", "********", "********") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

// Sanisering af bruger input
$id = (int) $_GET['mobile_id'];

// SQL
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id;

if (isset($_GET['sorter']) && $_GET['sorter'] == 'm') {
    $sql += ' ORDER BY (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
} else {
    $sql += ' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';
}
// Query
$query = mysql_query($sql) or die(mysql_error());

// Generer resultat
$result = array();
while($row = mysql_fetch_assoc($query)) {
$result[] = $row;
}
?>

<div class="vaelg"><form action="" method="GET"><input type="hidden" name="mobile_id" value="<?php echo $id; ?>" /><select onchange="this.form.submit();" name="sorter"><option value="">Vælg sortering</option><option value="m">Sorter på mindstepris</option><option value="b">Sorter på købspris</option></select></form></div>

<!-- HTML Template -->
<table class="data" cellpadding="0" cellspacing="0" border="0">
<tr>
<td class="hd" style="width: 130px;"></td>
<td class="hd" style="width: auto;"></td>
<td class="hd" style="width: 145px;"></td>
</tr>
<?php $bgcolor="#f1f1f1";?>
<?php foreach($result as $row): ?>
<tr onclick="window.open('<?php echo $row['link1']; ?>');" class="trhand" bgcolor="<?php echo $bgcolor; ?>" onmouseover="this.bgColor = '#e3f4f8';" onmouseout ="this.bgColor = '<?php echo $bgcolor; ?>';return true;">
<?php $bgcolor = ($bgcolor=="#f1f1f1" ? "#ffffff" : "#f1f1f1"); ?>
<td class="dataclass_udbyder">
<img src="img/teleselskaber/<?php echo $row['logo']; ?>" alt="<?php echo $row['network_name']; ?>" border="1" />
</td>
<td class="dataclass">
<div class="dataover"><? echo $row['name']; ?></div>
<div class="dataclass2"><b>Minuttakst:</b> DKK <?php echo $row['minuttakst']; ?><br /><b>Taksering:</b> <?php echo $row['taksering']; ?><br /><b>Opkaldsafgift:</b> DKK <?php echo $row['opkaldsafgift']; ?></div>
<div class="dataclass2"><b>SMS pris:</b> DKK <?php echo $row['sms']; ?><br /><b>MMS pris:</b> DKK <?php echo $row['mms']; ?><br /><b>Data pris:</b> DKK <?php echo $row['data']; ?></div>
<div class="dataclass2"><b>Abonnement:</b> DKK <?php echo $row['abonnement']; ?>,-/md.<br /><b>Binding:</b> <?php echo $row['binding']; ?> mdr.<br /><b>Oprettelse:</b> DKK <?php echo $row['oprettelse']; ?>,-</div>
</td>
<td class="dataclass_koeb rh">
<div class="pris">Pris DKK <?php echo $row['price']; ?>,-</div><img src="img/koebnu.png" alt="Køb nu!" /><br /><div class="mindstepris">Mindstepris DKK <?php $sum_total = ( $row['abonnement'] * $row['binding'] ) + $row['oprettelse'] + $row['price']; print ($sum_total); ?>,-</div>
</td>
</tr>
<?php endforeach; ?>
</table>

Men når jeg køre koden nu, får jeg denne fejl, som jeg ikke rigtig forstår:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1

Men ellers gav forklaringen med et hidden felt god mening, så tak for det :)
Avatar billede KenniDN Nybegynder
02. oktober 2010 - 02:08 #6
Hov, det var ikke meningen den skulle komme to gange :0)
Avatar billede tjens Nybegynder
02. oktober 2010 - 10:25 #7
Jeg tror min PHP er rusten
java script: sql += 'bla bla'
PHP: $sql .= 'bla bla'

Så prøv at rette de 2 += til .=

Og da $sql jo bare er en string skal vi kunne bygge den op i flere statements. Så du må prøve dig frem i steps, hvis ovenstående ikke løser det:

Hvis det originale virker:
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id.' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';


så prøv at klippe den op i 2:
$sql = 'SELECT
mobiledeals.*, mobileplans.*, mobilenetworks.*
FROM mobiledeals
INNER JOIN mobileplans ON mobileplans.id = mobiledeals.mobileplans_id
INNER JOIN mobilenetworks ON mobilenetworks.id = mobileplans.network_id
WHERE mobiledeals.mobilephone_id = '.$id

$sql .= ' ORDER BY mobiledeals.price, (mobileplans.abonnement*mobileplans.binding)+mobilenetworks.oprettelse+mobiledeals.price ASC';

Hvis det stadig virker kan du bygge if/else omkring det.

Hvis det ikke virker må du skrive $sql til skærmen og kigge nærmere på den:
echo '<hr />'.$sql.<hr />


Derudover tror jeg du skal have noget i action="" i din nye form.
Avatar billede KenniDN Nybegynder
02. oktober 2010 - 13:43 #8
Efter at have ændret fra + til . virker det som det skal. Også selvom jeg intet har i min action="" :)

Men smid lige et svar og mange tak for hjælpen :)
Avatar billede tjens Nybegynder
02. oktober 2010 - 15:00 #9
Hermed svar.
Godt du fik det til at virke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester