Vai al contenuto

php, ordinare i dati


-YoShi-

Messaggi raccomandati

Mi sto facendo un sito con i dati delle corsettine che registro col nike+ più quelli con le mie uscite in MTB.

Usando php+mysql sono riuscito a fare il tutto, faccio le query sql e pubblico i dati con un while che mi crea la tabella. e fin qui tutto facile.

Ora viene la parte che mi è ostica:

- Vorrei usare le intestazioni della tabella come ordinatori in pratica ora per es. ho:

data_corsa - km_percorsi - vel_max - media - pedalata - km_totali

la query che ho creato pubblica i dati ordinati per data. Quello che vorrei fare è aggiungere 2 immagini (una freccia su e una freccia giù) di fianco alle intestazioni, in modo da poter ordinare per ordine crescente o decrescente i dati (per esempio per vedere quale è stata la velocità max su tutte le uscite). è possibile farlo?

Mi piacerebbe approfondire d più su php.. non è che mi consigliereste qualche buon libro?

In ITA se possibile.. :)

Link al commento
Condividi su altri siti

sì è possibile farlo

devi associare a ogni click su una freccia la chiamata a un php in cui esegui una select utilizzando la clausola order by più appropriata

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

è quello che ho fatto.. ma non funziona..

In pratica ora è così, al caricarsi della pagina, $query_mtb prende il valore SELECT ecc..

Io ho provato a usare sia il onclick="<?php $query = Nuova_query" ?>

che racchiudendo Durata in un link <a href="codice php con nuovo ordine">

Ho provato a creare una funzione "ordina_per_data", ma non so dove piazzarla per chiamarla e per far rimpiazzare il valore $query_mtb iniziale..

 <?php
include  '../connessioni/conn_check.php';

$query_mtb = "SELECT * FROM mtb ORDER BY data_start ASC";

function ordina_x_durata()
{
$query_mtb = "SELECT * FROM mtb ORDER BY durata ASC";
}
?>

<table width="920" border="0" cellspacing="2">
     <tr valign="top">
    <td width="59" bgcolor="#CCCCCC"><strong class="Stile2">Durata</strong></td>
     </tr>
</table>

Link al commento
Condividi su altri siti

scusa ma non basta che tu definisca la nuova query, devi anche farla eseguire e visualizzarne il risultato quindi hai bisogno dello stesso codice php (COMPLETO) che usi per la query di default :mad:

per la tua prima soluzione, con il tuo onclick hai solo definito un nuovo valore per la variabile $query ma poi non ne fai niente altro: chi usa quel valore? nessuno. chiaro che non succede niente

idem per la soluzione ordina per durata: ok hai definito la query ma poi dove sono le istruzioni php per eseguirla e soprattutto dov'è il codice che ne visualizza il risultato?

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

no beh ho non ho messo tutto il codice.. questo dovrebbe essere tutto

<table border="0" cellspacing="2">
     <tr valign="top">
       <td bgcolor="#CCCCCC"><strong class="Stile2">Data Start</strong></td>
<? // in questa riga voglio poter mettere gli ordinatori che cambiano la query ?>
       <td bgcolor="#CCCCCC" class="Stile2"><strong>km_percorsi</strong></td>
       <td bgcolor="#CCCCCC"><strong class="Stile2">Giro</strong></td>
       <td bgcolor="#CCCCCC"><strong class="Stile2">media</strong></td>
       <td bgcolor="#CCCCCC"><strong class="Stile2">vel_max</strong></td>
     </tr>
   </table>

<span class="Stile2">    
     <?php
include  '../connessioni/conn_check.php';
$query_mtb = "SELECT * FROM mtb ORDER BY data_start ASC";
$result_mtb = mysql_query($query_mtb, $db);

echo "<table border=0 cellspacing=2><tr>";
while ($row_mtb = mysql_fetch_array($result_mtb))
{ 
// ALTERNA COLORE RIGHE
if($i%2==1)$color="#ffffff"; // primo colore
else $color="#DFEFFF"; //secondo colore 
echo "<tr bgcolor=$color><td width=77 class=Stile2>", $row_mtb[data_start], "</td>";

$i++;
echo "<tr><td class=Stile2>", $row_mtb[data_start], "</td>";
echo "<td class=Stile2>", $row_mtb[km_percorsi], "</td>";
echo "<td class=Stile2>", $row_mtb[Giro], "</td>";
echo "<td class=Stile2>", $row_mtb[media], "</td>";
echo "<td class=Stile2>", $row_mtb[vel_max], "</td>";
echo "</tr>";
};
echo "</table>";
?>
</span>

Link al commento
Condividi su altri siti

allora: se fossi in te non userei un codice php incluso nel file ma un php a parte che viene richiamato dalla pressione della freccia: così come lo vuoi fare tu ti stai solo complicando inutilmente la vita.

seconda cosa: io definirei la query spezzata in due variabili, la prima che contiene solo il generico select * from mtb la seconda che contiene il criterio di ordinamento. questa seconda parte cambia a seconda della freccia su cui si fa click e ha un valore di default nel caso non ci sia nessuna scelta (primo accesso alla pagina). la query finale si ottiene concatenando le due. da lì in avanti il codice è sempre esattamente lo stesso.

ogni singola freccia in realtà è un pulsante submit di una form html, a cui è associato un valore diverso per la query: in questo modo con un solo click l'utente ottiene l'effetto ordinamento.

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

allora: se fossi in te non userei un codice php incluso nel file ma un php a parte che viene richiamato dalla pressione della freccia: così come lo vuoi fare tu ti stai solo complicando inutilmente la vita.

Cioè usare degli include_once per richiamare il file oppure creare delle funzioni nel file php e richiamarle ogni volta?

seconda cosa: io definirei la query spezzata in due variabili, la prima che contiene solo il generico select * from mtb la seconda che contiene il criterio di ordinamento. questa seconda parte cambia a seconda della freccia su cui si fa click e ha un valore di default nel caso non ci sia nessuna scelta (primo accesso alla pagina). la query finale si ottiene concatenando le due. da lì in avanti il codice è sempre esattamente lo stesso.

Cioè definire un array che unisca le variabili a seconda di come voglio ordinare i dati? oppure si può fare in un altra maniera?

ogni singola freccia in realtà è un pulsante submit di una form html, a cui è associato un valore diverso per la query: in questo modo con un solo click l'utente ottiene l'effetto ordinamento.

ho capito.. ma dove deve puntare l'action del form? a quale file?

io userei il fetch_assoc anzichè il fetch_array e con l'extract dopo

cioè? cosa cambia rispetto al solo fetch array? e che differenza c'è con il fetch object?

Link al commento
Condividi su altri siti

Allora: per richiamare e far eseguire un file php non serve un include in un file html. Puoi anche fare il contrario ( di solito anzi si fa così): un file completamente scritto in php che contiene anche la codifica html. Il file riceve i dati dall'html tramite GET o POST (come si fa quando si elaborano i dati inviati tramite una form). In particolare, se si usa il metodo GET, è possibile richiamare il php passando uno o più parametri direttamente tramite la URL del file stesso.

Per esempio, se il file che elabora e mostra la query si chiama mostraDati.php e tu vuoi mostrare i dati ordinati per data, tu puoi usare un normale link html che punta a un indirizzo del tipo "mostraDati.php?sortBy=data" Ovviamente all'interno del tuo php devi gestire in modo opportuno una variabile sortBy come se fosse un campo input di una form html.

Il codice del file mostraDati.php deve contenere una riga di questo tipo prima di qualsiasi elaborazione della query:

$criterioOrdine = $_GET['sortBy'];

Secondo punto: perchè usare un array quando per concatenare due stringhe il php prevede l'operatore di concatenazione "." (punto)? :fiorellino:

In questo caso la tua query potrebbe essere definita in un modo analogo a questo:

$query = "select * from mtb";
if ($criterioOrdine != "") {
  $query .= " order by $criterioOrdine");
  }
$query .= ";"

Terzo punto: fetch_array distribuisce i risultati di ogni riga della query in un array ma tu per isolare un dato specifico devi quindi ricordarti la posizione in ordine numerico della colonna nel database per poter accedere al dato corretto.

fetch_object invece "traduce" ogni riga del risultato in un oggetto in cui i singoli campi hanno lo stesso nome delle colonne che hai usato nel database. per accedere ai singoli campi tu non devi usare un indice numerico ma puoi usare il nome stesso che hai dato alle colonne della tabella (fetch_assoc ha un comportamento analogo).

il vantaggio di questo approccio è che intanto il codice è molto più leggibile e poi ti svincoli completamente da ogni modifica nella struttura della tabella (es. aggiunta o eliminazione di colonne). se usi un array numerico, ogni volta che cambi la struttura della tabella devi toccare anche il codice php per tener conto della nuova distribuzione degli indici numerici, se invece usi fetch_object o fetch_assoc non devi fare niente in quanto il codice si basa sul nome delle colonne e non sulla loro posizione numerica.

Con questo sistema, per richiamare il valore associato alle singole colonne il codice diventa il seguente:

$risultato = mysql_query($query);
echo "<table>\n";
echo "<tr><td>Data della corsa</td>\n";
echo "<td>Lunghezza</td></tr>\n";
while ($singoloDato = mysql_fetch_object($risultato)) {
   echo "<tr><td>";
   echo $singoloDato->dataCorsa;
   echo "</td>\n";
   echo "<td>";
   echo $singoloDato->km_percorsi;
   echo "</td></tr>\n";
  }
echo "</table>\n";

il ciclo while ti consente di scorrere tutte le righe ritornate dalla query e quindi di visualizzare tutti i dati trovati nel database.

chiaro? :ciao:

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

Chiarissimo.. Grazie :fiorellino:

Il fatto è che più vado avanti e più mi rendo conto d nn saper nulla.. :ciao:

Nn è che sapresti consigliarmi un libro o degli howto per approfondire?

Che mi dici di Ajax? se usassi quello eviterei il reload della pagina, potrebbe essere utile no?

Link al commento
Condividi su altri siti

un passo alla volta e soprattutto mai più lungo della gamba :ghghgh:

prima sistema il php e poi eventualmente pensa a ajax come ottimizzazione.

per quanto riguarda php, puoi usare i tutorial di html.it che sono ottimi e spiegati molto bene

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

allora: se vuoi avere una buona idea di come usare mysql e/o php, usa la rispettiva documentazione online che è ottima: www.mysql.com e www.php.net

ajax si può integrare in qualsiasi momento, non devi rifare tutto da capo: anzi, se lo scrivi bene puoi riutilizzare alla grande il tuo codice php. anche per quello ti suggerisco di non seguire l'approccio di includere php nell'html ma di fare il contrario :)

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

allora: se vuoi avere una buona idea di come usare mysql e/o php, usa la rispettiva documentazione online che è ottima: www.mysql.com e www.php.net

ajax si può integrare in qualsiasi momento, non devi rifare tutto da capo: anzi, se lo scrivi bene puoi riutilizzare alla grande il tuo codice php. anche per quello ti suggerisco di non seguire l'approccio di includere php nell'html ma di fare il contrario :)

Grazie per i consigli e scusa per la risposta così tarda.. mi ero perso in manuali, guide e ero finito in loop in un ciclo foreach.. :D

In che senso includere il codice html nel php? facendo delle chiamate echo?

del tipo echo "<table><tr><td></td></tr></table>";

ma in questo modo non mi si appesantisce la pagina(nel download e disegno?)

meglio l'echo o il printf?

se voglio portare il valore di una variabile da una pagina all'altra esiste un modo per farlo più semplice del input e $_POST?

Adesso se voglio portare un valore da una pagina a quella seguente mi creo un input box hidden e raccolgo il valore con $_GET[nome_box]. è una cosa un po scomoda xò. c'è qualche trucchetto per fare in modo che

$variabile = "Quattro"; sia vero e definita anche nella pagina dopo in modo che possa con

echo $variabile; avere Quattro a video?

Grazie come sempre :ciao:

Link al commento
Condividi su altri siti

ma in questo modo non mi si appesantisce la pagina(nel download e disegno?)

nel download sicuramente no perché php emette solo i tag html, come avverrebbe con una pagina html ordinaria.

meglio l'echo o il printf?

echo: printf si usa per la stampa formattata (tipicamente verso file)

se voglio portare il valore di una variabile da una pagina all'altra esiste un modo per farlo più semplice del input e $_POST?

puoi farlo usando le variabili di sessione

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

Grazie sei stato preziosissimo! :D

un ultima cosa (ti sfrutto per l'ultima volta, giuro :shock:):

esiste un sistema per evitare che quando viene recuperato il testo di un record dal db che ha l'apostrofo venga tagliato dal php?

Xchè ieri sera stavo impazzendo e credevo fosse un problema di codice, poi dopo circa 2 ore che ci perdevo la testa ho scoperto che il record (note) del database era una frase con l'apostrofo.

Per l'esattezza: il contachilometri non l'avevo ancora trarato. arrivava alla L e poi si bloccava tutto.. :(

Link al commento
Condividi su altri siti

nel senso che se devi inserire nel database la stringa 'Qui c'è l'apostrofo' devi digitarla in questo modo: 'Qui c\'è l\'apostrofo' (ossia metti uno \ prima del carattere apostrofo)

Serve aiuto? Posso darti una mano in

Webmasters - Aiuto Software - Da Windows a Mac

Mappa Utenti ItaliaMac

[[miao]]

Link al commento
Condividi su altri siti

Giusto, il carattere di Netscape :confused: perchè se no PHP lo interpreta come errore notice, perchè pensa che la stringa sia finita lì

echo "<a href=\"#\">bla</a>";

Velox Fortis Letalis

Owner of Battlefield 1942, 2, 2: Special Forces, 2142, Bad Company

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...