WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   sortering av array (php) (https://www.wn.se/forum/showthread.php?t=1039513)

youheardit 2009-12-09 09:39

sortering av array (php)
 
Hejsan!
bygger just nu en ligatabell för fotbollslag i php och har kommit till den parten där array'en måste sorteras.

jag har en tabell för alla lagen och en tabell för matcherna i databasen!
efter all uträkning av poäng, vinster, förluster mm så byggs en array med för varje lag där all information som ska visas i tabellen är värdet, den ser ut så här:

PHP-kod:

$team_in_table = array (
'team' => $team['name'],
'played' => $total_played,
'wins' => $total_wins,
'draw' => $total_draw,
'loses' => $total_loses,
'skillnad' => $skillnad,
'points' => $total_points );
?> 

här är ett exempel på hur den blir
PHP-kod:

Array ( [team] => Arsenal [played] => [wins] => [draw] => [loses] => [skillnad] => -[points] => 

Nu är problemet med sorteringen.
Hur får jag listan att först sorteras efter poäng, sedan om 2 eller flera lag har lika många poäng så ska den sorteras efter målskillnad ('skillnad' i array) ?
har googlat men utan resultat.

kan även släppa hela koden som är gjord här:
PHP-kod:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<?php 
$id 
$_GET['id'];
if(!isset(
$id)){
die(
"inget id"); }
 
$placement 0;
 echo 
'<table border="1"><th></th><th></th><th>SM</th><th>P</th>';
include
'../dbcon.php'
//hämtar ligan
$get_league mysql_query("SELECT * FROM sk_league WHERE id = '".$id."'");
if(
mysql_num_rows($get_league) == 0){
die(
"Ingen liga"); }
$league mysql_fetch_array($get_league);

$get_teams mysql_query("SELECT * FROM sk_team WHERE league = '".$id."'");
while(
$team mysql_fetch_array($get_teams)){

//hemma matcher!
$home_wins 0;
$home_draw 0;
$home_loses 0;
$home_goals 0;
$home_ins 0;
$get_home mysql_query("SELECT * FROM sk_matches WHERE home_id = '".$team['id']."'");
$count_home mysql_num_rows($get_home);
while(
$home mysql_fetch_array($get_home)){
$home_goals $home_goals $home['goals_home'];
$home_ins $home_ins $home['goals_away'];
if(
$home['goals_home'] > $home['goals_away']){
$home_wins $home_wins 1; } else if ($home['goals_home'] == $home['goals_away']){
$home_draw $home_draw 1; } else if ($home['goals_home'] < $home['goals_away']){
$home_loses $home_loses 1; }}

//borta matcher!
$away_wins 0;
$away_draw 0;
$away_loses 0;
$away_goals 0;
$away_ins 0;
$get_away mysql_query("SELECT * FROM sk_matches WHERE away_id = '".$team['id']."'");
$count_away mysql_num_rows($get_away);
while(
$away mysql_fetch_array($get_away)){
$away_ins $away_ins $away['goals_home'];
$away_goals $away_goals $away['goals_away'];
if(
$away['goals_away'] > $away['goals_home']){
$away_wins $away_wins 1; } else if ($away['goals_home'] == $away['goals_away']){
$away_draw $away_draw 1; } else if ($away['goals_away'] < $away['goals_home']){
$away_loses $away_loses 1; }}
//totala statistik
$total_played $count_home $count_away;
$total_wins $home_wins $away_wins;
$total_draw $home_draw $away_draw;
$total_loses $home_loses $away_loses;
$total_goals $home_goals $away_goals;
$total_ins $home_ins $away_ins;

//poäng
$wins_points $total_wins;
$draw_points $total_draw;
$total_points $wins_points $draw_points;

//poängskillnad
$skillnad $total_goals $total_ins;

$team_in_table = array (
'team' => $team['name'],
'played' => $total_played,
'wins' => $total_wins,
'draw' => $total_draw,
'loses' => $total_loses,
'skillnad' => $skillnad,
'points' => $total_points );
$placement $placement 1;
?>
<tr><td><?= $placement?></td><tD><?= $team_in_table['team']; ?></tD><td><?= $team_in_table['played']; ?></td><td><?= $team_in_table['points']; ?></td></tr>

<?
}


echo "</table>";
  ?>

jag vet, det är inte den bästa koden, kunde gjort det bättre.

tacksam för svar!
//Philip Andersson!

tartareandesire 2009-12-09 11:59

Kolla här:

http://php.net/manual/en/function.array-multisort.php

hnn 2009-12-09 13:24

Funderat på att skydda dig mot SQL Injections?

tartareandesire 2009-12-09 14:18

Citat:

Ursprungligen postat av hnn (Inlägg 20334725)
Funderat på att skydda dig mot SQL Injections?

Han skrev ju precis att koden inte var den bästa? :) De flesta gör det vid post men väldigt många glömmer bort att göra det när det gäller get.

youheardit 2009-12-09 14:55

Citat:

Ursprungligen postat av tartareandesire (Inlägg 20334734)
Han skrev ju precis att koden inte var den bästa? :) De flesta gör det vid post men väldigt många glömmer bort att göra det när det gäller get.

ursäkta men denna ska inte visas, detta är bara ett test och hela sidan ska inte visas, den ska ingå i en annan sida via include, kör annars alltid
Kod:

if(mysql_num_rows($result) == 0){
die(); }

:)
jag tyckte jag kollade på multisort tidigare, får väll ta en extra titt då ;) tack!

crazzy 2009-12-09 17:36

Tror annars hnn tänkte på att du inte filtrerade $_GET['id'] nånstans.
htmlspecialchars() är en fin funktion för det.

edit: Se Clarence post nedan, htmlspecialchars är INTE en fin funktion :(

Clarence 2009-12-09 18:26

Citat:

Ursprungligen postat av crazzy (Inlägg 20334776)
Tror annars hnn tänkte på att du inte filtrerade $_GET['id'] nånstans.
htmlspecialchars() är en fin funktion för det.

Det är en funktion du kan använda för input/data som ska visas i t ex HTML. För input till (my)SQL bör du INTE använda den. Har du inte med ENT_QUOTES så escapar den t ex inte single quotes, vilket är den absolut vanligaste ingångsvägen till SQL injections. Och även om du sätter ENT_QUOTES så är den inte att anses som säker pga andra ingångsvägar.

Ett säkert kort är att använda databasmotorns egna escapes, t ex mysql_real_escape_string()/pg_escape_string(). Ett annat att använda prepared statements (se t ex mysqli_prepare).

crazzy 2009-12-09 19:39

Det var något nytt för mej, tack för det, skall genast byta funktion för filtrering. :)

youheardit 2009-12-09 21:34

Citat:

Ursprungligen postat av Clarence (Inlägg 20334784)
Det är en funktion du kan använda för input/data som ska visas i t ex HTML. För input till (my)SQL bör du INTE använda den. Har du inte med ENT_QUOTES så escapar den t ex inte single quotes, vilket är den absolut vanligaste ingångsvägen till SQL injections. Och även om du sätter ENT_QUOTES så är den inte att anses som säker pga andra ingångsvägar.

Ett säkert kort är att använda databasmotorns egna escapes, t ex mysql_real_escape_string()/pg_escape_string(). Ett annat att använda prepared statements (se t ex mysqli_prepare).

själv kör jag mysql_real_escape_string() vid alla input till databas.
men dem andra har jag inte stött på tidigare, får väll läsa mer om det då :) tackar!

tartareandesire 2009-12-09 23:22

Citat:

Ursprungligen postat av youheardit (Inlägg 20334811)
själv kör jag mysql_real_escape_string() vid alla input till databas.
men dem andra har jag inte stött på tidigare, får väll läsa mer om det då :) tackar!

Det var just det du inte gjorde i det här fallet :) Därav att det kom upp.


Alla tider är GMT +2. Klockan är nu 01:43.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson