PDA

View Full Version : [PHP] Aiuto classifica campionato


Baio84
06-04-2012, 13:23
Sono nuovo e innanzitutto faccio un saluto a tutti quelli del forum! :D

Gestisco il sito della squadra in cui gioco. Ogni settimana inserisco a mano i risultati e aggiorno, sempre a mano, la classifica. Stancato di tutto questo lavoro dispendioso, giro su internet e scopro il linguaggio php. Me lo studio per bene, e ora sto cercando di utilizzarlo per far aggiornare automaticamente la tabella.
Come avete capito sono un principiante, per cui alcuni passaggi del mio codice risulteranno sicuramente troppo pesanti perchè magari potrei utilizzare qualche funzione che però ancora non conosco.

Vi illustro il mio progetto. Da una prima pagina inserisco i risultati delle partite che invio poi ad un'altra pagina che li elabora in un database. Ecco il codice della seconda pagina:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Senza nome 1</title>
</head>

<body>

<?php

$prova="giorn_prova.txt"; //Inizializza file con le giornate

if(isset($_POST['invia'])) //Controlla se il pulsante invia è stato premuto
{
$giornate=file($prova); //Legge il file come un array
for($c=0;$c<2;$c++) //Ciclo eseguito 2 volte che elabora i risultati delle 2 partite di una giornata
{
$partite=explode(":",$giornate[$c]); //Leggo le giornate una alla volta
$casa=$partite[0]; //La squadra che gioca in casa
$fuori=$partite[1]; //La squadra che gioca fuori casa
if($_POST["$casa"]>$_POST["$fuori"]) //Se vince la squadra di casa, allora...
{
$gfc=$_POST["$casa"]; //Gol fatti dalla squadra di casa
$gsc=$_POST["$fuori"]; //Gol subiti dalla squadra di casa
$gff=$_POST["$fuori"]; //Gol fatti dalla squadra di fuori casa
$gsf=$_POST["$casa"]; //Gol subiti dalla squadra di fuori casa
$vittcasa=+1; //Aggiungo +1 alle vittorie in casa
$persafuori=+1; //Aggiungo +1 alle sconfitte fuori casa

$connessione=odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=public/classifica.mdb","","") or die("Connessione fallita"); //Connessione al database
$sql = "SELECT * FROM Classifica WHERE SQUADRA = '$casa'"; //Query che seleziona la riga della squadra che gioca in casa
$record=odbc_exec($connessione,$sql) or die("Query fallita"); //Esecuzione query
$dbgfc=odbc_result($record,"GF"); //Estraggo i gol fatti in totale dalla squadra di casa
$dbgsc=odbc_result($record,"GS"); //Estraggo i gol subiti in totale dalla squadra di casa
$dbvittcasa=odbc_result($record,"VC"); //Estraggo le vittorie in casa totali della squadra di casa
$nuovodbgfc=$dbgfc + $gfc; //Gli sommo i gol di giornata
$nuovodbgsc=$dbgsc + $gsc; //Gli sommo i gol di giornata
$nuovodbvittcasa=$dbvittcasa + $vittcasa; //Gli sommo la vittoria di giornata
$sql="UPDATE Classifica SET GF='$nuovodbgfc', GS='$nuovodbgsc', VC='$nuovodbvittcasa' WHERE SQUADRA = '$casa'"; //Query che aggiorna i nuovi dati
$update=odbc_exec($connessione,$sql) or die("Query fallita"); //Esecuzione query

$sql = "SELECT * FROM Classifica WHERE SQUADRA = '$fuori'"; //Query che seleziona la riga della squadra che gioca fuori casa
$record=odbc_exec($connessione,$sql) or die("Query fallita"); //Esecuzione query
odbc_result_all($record); //Query di prova
$dbgff=odbc_result($record,"GF"); //Estraggo i gol fatti in totale dalla squadra fuori casa
$dbgsf=odbc_result($record,"GS"); //Estraggo i gol subiti in totale dalla squadra fuori casa
$dbpersafuori=odbc_result($record,"PF"); //Estraggo le sconfitte fuori casa totali della squadra fuori casa
$nuovodbgff=$dbgff + $gff; //Gli sommo i gol di giornata
$nuovodbgsf=$dbgsf + $gsf; //Gli sommo i gol di giornata
$nuovodbpersafuori=$dbpersafuori + $persafuori; //Gli sommo la sconfitta di giornata
$sql="UPDATE Classifica SET GF='$nuovodbgff', GS='$nuovodbgsf', PF='$nuovodbpersafuori' WHERE SQUADRA = '$fuori'"; //Query che aggiorna i nuovi dati
$update=odbc_exec($connessione,$sql) or die("Query fallita"); //Esecuzione query

odbc_close($connessione); //Chiudo la connessione
}
elseif($_POST["$casa"]<$_POST["$fuori"])
{
echo $casa." 0<br />";
echo $fuori." +3<br /><br />";
}
else
{
echo $casa." +1<br />";
echo $fuori." +1<br /><br />";
}
}
}


?>



</body>

</html>


Il codice funziona bene. I dati riguardanti la squadra di casa me li estrae, li aggiorna e li inserisce. Non mi fa la stessa cosa con quella che gioca fuori casa. Infatti, stampandomi la tabella con la query di prova (in grassetto), di dice che non trova righe da stampare. Quindi credo che i problemi siano due: o non mi legge la variabile $fuori (ma questo lo escludo perchè se gli faccio un echo me la stampa corretta), o faccio qualche errore con la query.

Ulteriori informazioni:
-Siccome è ancora tutto in prova, le squadre totali sono 4, quindi 2 partite per giornata;
-l'elseif e l'else al momento non contano. Daranno il loro contributo quando risolverò questa parte;
-utilizzo come database Access. Non uso Mysql perchè su Aruba dovrei pagare un supplemento. Anzi, sarei grato se qualcuno potesse postare una guida sulle varie funzioni ODBC legate a PHP.

Ringrazio chiunque voglia darmi una mano :ave:

EDIT: Facendo un'ulteriore prova, la query non riesce proprio a leggere la variabile $fuori, perchè se la sostituisco ancora con la variabile $casa, i dati me li aggiorna. A me sembra una cosa strana.

junpyx
07-04-2012, 01:51
Lo so che è banale, ma hai provato a stampare e controllato che "fuori" sia riempita dal valore che ti aspetti?

Baio84
07-04-2012, 03:25
Sì, e l'ho stampato proprio la riga precedente alla query. Prima di arrivare a questo codice, ho fatto diverse prove per vedere se le variabili venivano lette, se il risultato che ottenevo era quello che volevo, ma non ho mai avuto problemi. Prima ho provato a chiamare $fuori in $fuori_casa, ma non la legge lo stesso.

EDIT: Il nome che mi visualizza la variabile è corretto; lo stesso nome è corretto all'interno del database. Non riesco proprio a capire quale sia l'inghippo! :cry:

Ballantine
07-04-2012, 22:11
Se, come dici tu, sostituendo nella seconda SELECT la variabile $fuori con la variabile $casa la query funziona, probabilmente il problema è nella variabile $fuori, anche se non lo vedi. Fai una prova con una sola partita e se, ad esempio, la squadra che ha giocato fuori si chiama Milan, fai un test stupido del tipo:

if (strcmp($fuori, "Milan") == 0)
echo "ok";
else
echo "errore";

Così escludi che ci siano spazi bianchi aggiuntivi o roba simile.

Baio84
08-04-2012, 02:16
Avevo pensato anch'io che fosse un problema di lettura, ma non sapevo come dimostrarlo. Grazie al tuo consiglio, ora è tutto più chiaro. Infatti c'è proprio un errore nel valore passato dalla variabile. La funzione strcmp dà valore positivo. C'è qualche altra funzione che mi aiuti a capire più specificatamente cosa devo correggere, o devo controllare passo passo tutti i passaggi che compie la variabile?

EDIT: Però c'è una cosa strana: $fuori viene letta giusta quando vado a determinare i gol subiti dalla squadra di casa ($gsc). Solo nella query viene letta in modo sbagliato

Ballantine
08-04-2012, 11:44
Avevo pensato anch'io che fosse un problema di lettura, ma non sapevo come dimostrarlo. Grazie al tuo consiglio, ora è tutto più chiaro. Infatti c'è proprio un errore nel valore passato dalla variabile. La funzione strcmp dà valore positivo. C'è qualche altra funzione che mi aiuti a capire più specificatamente cosa devo correggere, o devo controllare passo passo tutti i passaggi che compie la variabile?

EDIT: Però c'è una cosa strana: $fuori viene letta giusta quando vado a determinare i gol subiti dalla squadra di casa ($gsc). Solo nella query viene letta in modo sbagliato

Ok, direi che abbiamo trovato il problema :)
Se non ho capito male, il tuo file di testo è scritto in questo modo:
Milan:Inter
Juventus:Napoli
Leggendo la definizione (http://php.net/manual/en/function.file.php) del metodo file(), che usi per caricare i dati nell'array, puoi leggere una nota: "Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present."
In soldoni, in ogni linea del tuo file c'è un carattere speciale (\n) che demarca la fine della linea stessa, e quindi a livello di codice il file giorn_prova.txt viene visto in questo modo:
Milan:Inter\n
Juventus:Napoli\n
Il metodo file() salva anche questi caratteri speciali, e quando tu assegni un valore alla variabile $fuori includi anche il carattere speciale attaccato al nome della squadra. Nel momento in cui tu cerchi sul database la squadra che ha giocato fuori casa non riesci a trovarla proprio perché vai a cercare, ad esempio, "Inter\n" invece di "Inter".
In teoria potresti evitare a priori di salvare nell'array questi caratteri speciali usando un'apposita flag quando chiami il metodo open:
$giornate=file($prova, FILE_IGNORE_NEW_LINES);
ma leggendo i commenti nella pagina che ti ho linkato sopra sembra che questa opzione non funzioni sempre perfettamente con i file di testo creati su Windows. Secondo me la soluzione migliore è utilizzare uno dei metodi della famiglia trim, che si occupano proprio di ripulire l'inizio e/o la fine delle stringhe dai caratteri speciali. Siccome nel tuo caso il carattere speciale è sempre alla fine del nome della squadra che gioca fuori casa puoi usare il metodo rtrim() (http://www.php.net/manual/en/function.rtrim.php) in questo modo:
$fuori=rtrim($partite[1]); //La squadra che gioca fuori casa

EDIT: Però c'è una cosa strana: $fuori viene letta giusta quando vado a determinare i gol subiti dalla squadra di casa ($gsc). Solo nella query viene letta in modo sbagliato
Se dopo l'aggiunta di rtrim() non riuscirai più a leggere correttamente i gol subiti dalla squadra di casa allora si dovrà controllare in che modo vai a salvare questo dato, ma potrebbe tranquillamente darsi che i caratteri speciali vengano ignorati... purtroppo ho usato PHP una sola volta e non mi ricordo bene come funziona :(

Baio84
08-04-2012, 16:54
Sei di ottimo aiuto! :mano:
Con la funzione rtrim, ora la query mi vede la partita che gioca fuori casa!
Ma come da te pronosticato, poi i gol fatti e subiti fuori casa non mi venivano letti. Ho risolto nella stessa maniera perchè il problema era analogo. Infatti nel form per inviare i gol utilizzo ancora file(). Riutilizzando rtrim risolvo tutto.

Intanto ti ringrazio infinitamente! ;)

Ne approfitto per chiederti una cosa: c'è una squadra che si chiama Gazoldo d/Ippoliti. Questo viene inviato tramite POST, $_POST['Gazoldo d/Ippoliti'] non viene letto, perchè durante l'invio la squadra viene salvata come Gazoldo_d/Ippoliti. Per ovviare a questo problema posso utilizzare ancora rtrim?

Intanto finisco di completare il codice!

Ballantine
08-04-2012, 21:14
Se non sbaglio quello di sostituire gli spazi con il carattere "_" è un comportamento standard, poiché lo spazio in quel contesto non è considerato un carattere valido. rtrim() in questo caso non serve, però puoi usare str_replace() (http://www.php.net/manual/en/function.str-replace.php), che sostituisce tutte le occorrenze di un carattere in una stringa con un altro carattere a scelta:
$casa = str_replace(' ', '_', $partite[0]); //La squadra che gioca in casa
$fuori = str_replace(' ', '_', rtrim($partite[1])); //La squadra che gioca fuori casa
Così facendo sostituisci tutti gli spazi con l'underscore, risolvendo il problema del POST, ma probabilmente vai a creare un problema nell'inserimento dei dati nel database, dove il nome della squadra non ha l'underscore. Quindi potresti utilizzare 4 variabili: 2 da usare quando lavori con $_POST e 2 da usare per le query nel database.
$casa_post = str_replace(' ', '_', $partite[0]); //La squadra che gioca in casa, da usare nel POST
$casa_db = $partite[0]; //La squadra che gioca in casa, da usare nelle query
$fuori_post = str_replace(' ', '_', rtrim($partite[1])); //La squadra che gioca fuori casa, da usare nel POST
$fuori_db = rtrim($partite[1]); //La squadra che gioca fuori casa, da usare nelle query
Non è molto elegante ma dovrebbe funzionare :)

Baio84
09-04-2012, 04:51
E anche qui la tua esperienza è stata preziosa! :cincin:

Non pensare che ti voglia sfruttare, perchè prima di chiedere cerco sul mio bel libro una possibile soluzione o mi faccio una bella ricerca su internet, ma sono agli inizi e il mondo php è molto vasto e alcuni argomenti, come le query, non sono molto trattate.

Una volta riempita la mia tabella con i dati che le invio, vorrei farle calcolare alcune cose. Su internet ho trovato qualcosa, ma credo di fare alcuni errori di sintassi (anche perchè credo che fra mysql e odbc ci siano differenze).

Ecco la mia query:

$sql="SELECT DISTINCT VC + VF AS V, NC + NF AS N, PC + PF AS P, V *3+ N AS PUNTI, GF - GS AS GF - GS, NC *(-2)+ PC *(-3)+ VF *2+ PF *(-1) AS M.I., V + N + P AS GIORNATE FROM Classifica";

Dove: VC= Vinte Casa; VF= Vinte Fuori; V= Vinte Totali; stessa logica per le nulle (cioè pareggiate) e quelle perse; M.I.= Media Inglese.
Non dovrebbero esserci errori di apici, ma con le operazioni non sono sicuro. Poi forse c'è qualche errore quando faccio le moltiplicazioni coi numeri negativi. Potrei magari aggiornare direttamente la tabella con un UPDATE senza dover passare per la SELECT?

Baio84
09-04-2012, 04:52
E anche qui la tua esperienza è stata preziosa! :cincin:

Non pensare che ti voglia sfruttare, perchè prima di chiedere cerco sul mio bel libro una possibile soluzione o mi faccio una bella ricerca su internet, ma sono agli inizi e il mondo php è molto vasto e alcuni argomenti, come le query, non sono molto trattate.

Una volta riempita la mia tabella con i dati che le invio, vorrei farle calcolare alcune cose. Su internet ho trovato qualcosa, ma credo di fare alcuni errori di sintassi (anche perchè credo che fra mysql e odbc ci siano differenze).

Ecco la mia query:

$sql="SELECT DISTINCT VC + VF AS V, NC + NF AS N, PC + PF AS P, V *3+ N AS PUNTI, GF - GS AS GF - GS, NC *(-2)+ PC *(-3)+ VF *2+ PF *(-1) AS M.I., V + N + P AS GIORNATE FROM Classifica";

Dove: VC= Vinte Casa; VF= Vinte Fuori; V= Vinte Totali; stessa logica per le nulle (cioè pareggiate) e quelle perse; M.I.= Media Inglese.
Non dovrebbero esserci errori di apici, ma con le operazioni non sono sicuro. Poi forse c'è qualche errore quando faccio le moltiplicazioni coi numeri negativi. Potrei magari aggiornare direttamente la tabella con un UPDATE senza dover passare per la SELECT?

Baio84
09-04-2012, 04:53
E anche qui la tua esperienza è stata preziosa! :cincin:

Non pensare che ti voglia sfruttare, perchè prima di chiedere cerco sul mio bel libro una possibile soluzione o mi faccio una bella ricerca su internet, ma sono agli inizi e il mondo php è molto vasto e alcuni argomenti, come le query, non sono molto trattate.

Una volta riempita la mia tabella con i dati che le invio, vorrei farle calcolare alcune cose. Su internet ho trovato qualcosa, ma credo di fare alcuni errori di sintassi (anche perchè credo che fra mysql e odbc ci siano differenze).

Ecco la mia query:

$sql="SELECT DISTINCT VC + VF AS V, NC + NF AS N, PC + PF AS P, V *3+ N AS PUNTI, GF - GS AS GF - GS, NC *(-2)+ PC *(-3)+ VF *2+ PF *(-1) AS M.I., V + N + P AS GIORNATE FROM Classifica";

Dove: VC= Vinte Casa; VF= Vinte Fuori; V= Vinte Totali; stessa logica per le nulle (cioè pareggiate) e quelle perse; M.I.= Media Inglese.
Non dovrebbero esserci errori di apici, ma con le operazioni non sono sicuro. Poi forse c'è qualche errore quando faccio le moltiplicazioni coi numeri negativi. Potrei magari aggiornare direttamente la tabella con un UPDATE senza dover passare per la SELECT?

Baio84
09-04-2012, 11:00
Perdonatemi i post uguali! Ieri sera ho avuto dei problemi nel postare

Ballantine
11-04-2012, 13:01
Questa la passo, sulla sintassi SQL sono un po' arrugginito :)

Baio84
11-04-2012, 15:38
Intanto ti ringrazio!

Ho provato anche una query più semplice come:

$sql="SELECT VC + VF AS V FROM Classifica";

ma niente da fare. Ho provato a mettere apici, doppi apici, parentesi, ma mi restituiva sempre questo errore "The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect., SQL state 37000".

Spero che qualcuno corra in mio soccorso :help:

EDIT: Con buona volontà e pazienza ho risolto il problema delle query! :winner:
Dunque, per essere d'aiuto al forum, cerco di dare qualche dritta:
- in una SELECT puoi inserire tutte le operazioni che si vogliono, basta che gli operatori siano separati (esempio 2 + 3, e non 2+3);
- se vogliamo che le operazioni siano inserite in una nuova colonna tramite il comando AS, se il nome è composto da degli spazi, dobbiamo metterlo fra parentesi quadre (esempio VITTORIE CASA, dovrà essere scritto [VITTORIE CASA]); invece se nel nome ci sono dei punti, la query dà errore e non ho trovato nessuna soluzione, se non quella di toglierli (anche con [ING. GINO] dà errore);
- per moltiplicare con un numero negativo come (-2) * 3, in questo modo non è possibile e non mi sono applicato molto per risolvere questo problema. L'unico consiglio (come poi ho fatto io) è che se nella vostra espressione ci sarà almeno un valore positivo, partire da questo e sottrarre poi (esempio, (-2) * 3 + 5, si può scrivere 5 - 2 * 3 ma in questa forma la query la accoglie a braccia aperte; per maggior sicurezza potete mettere fra parentesi la moltiplicazione);
- le operazioni si possono fare anche tramite l'UPDATE. Anche per l'UPDATE valgono i primi due punti detti per la SELECT. Per le operazioni è un po' più delicato. Se l'operazione presenta solo due numeri, nessun problema. Se ne presenta di più, è necessario spezzettare l'espressione con delle parentesi. Nei miei casi: GIORNATE = (VINTE + NULLE + PERSE), [MEDIA INGLESE] = (2 * VINTEFUORI) - PERSEFUORI - (2 * NULLECASA) - (3 * PERSECASA). In questo modo la query veniva letta.

Ora non sono proprio il più adatto a dire che queste sono le regole per le operazioni, anche perchè le regole vere e proprie non le conosco, però facendo così la query funziona e se qualcuno dovesse avere lo stesso problema, facendo così potrebbe risolvere