|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
[PHP] Aiuto classifica campionato
Sono nuovo e innanzitutto faccio un saluto a tutti quelli del forum!
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: Codice:
<!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>
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 ![]() 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. Ultima modifica di Baio84 : 06-04-2012 alle 18:27. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Feb 2009
Messaggi: 81
|
Lo so che è banale, ma hai provato a stampare e controllato che "fuori" sia riempita dal valore che ti aspetti?
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
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! Ultima modifica di Baio84 : 07-04-2012 alle 12:51. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: May 2004
Messaggi: 278
|
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:
Codice:
if (strcmp($fuori, "Milan") == 0) echo "ok"; else echo "errore";
__________________
PROCESSORE: AMD Athlon64 2800+ Boxed - MOTHERBOARD: Gigabyte K8NS nForce3 250 - SCHEDA VIDEO: 3D Prophet 9800 Pro 128MB - RAM: 512MB Corsair Value + 512 V-Data - CASE: Chieftech Dragon - ALIMENTATORE: Q-TEC 550W - HARD DISK: Seagate SATA 80 GB - LETTORE DVD: LG 16x52x - MASTERIZZATORE: Nec ND-3520 Ultima modifica di Ballantine : 07-04-2012 alle 21:13. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
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 Ultima modifica di Baio84 : 08-04-2012 alle 01:37. |
|
|
|
|
|
#6 | ||
|
Member
Iscritto dal: May 2004
Messaggi: 278
|
Quote:
Se non ho capito male, il tuo file di testo è scritto in questo modo: Codice:
Milan:Inter Juventus:Napoli 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: Codice:
Milan:Inter\n Juventus:Napoli\n In teoria potresti evitare a priori di salvare nell'array questi caratteri speciali usando un'apposita flag quando chiami il metodo open: Codice:
$giornate=file($prova, FILE_IGNORE_NEW_LINES); Codice:
$fuori=rtrim($partite[1]); //La squadra che gioca fuori casa Quote:
__________________
PROCESSORE: AMD Athlon64 2800+ Boxed - MOTHERBOARD: Gigabyte K8NS nForce3 250 - SCHEDA VIDEO: 3D Prophet 9800 Pro 128MB - RAM: 512MB Corsair Value + 512 V-Data - CASE: Chieftech Dragon - ALIMENTATORE: Q-TEC 550W - HARD DISK: Seagate SATA 80 GB - LETTORE DVD: LG 16x52x - MASTERIZZATORE: Nec ND-3520 Ultima modifica di Ballantine : 08-04-2012 alle 10:46. |
||
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
Sei di ottimo aiuto!
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! |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: May 2004
Messaggi: 278
|
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(), che sostituisce tutte le occorrenze di un carattere in una stringa con un altro carattere a scelta:
Codice:
$casa = str_replace(' ', '_', $partite[0]); //La squadra che gioca in casa
$fuori = str_replace(' ', '_', rtrim($partite[1])); //La squadra che gioca fuori casa
Codice:
$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
__________________
PROCESSORE: AMD Athlon64 2800+ Boxed - MOTHERBOARD: Gigabyte K8NS nForce3 250 - SCHEDA VIDEO: 3D Prophet 9800 Pro 128MB - RAM: 512MB Corsair Value + 512 V-Data - CASE: Chieftech Dragon - ALIMENTATORE: Q-TEC 550W - HARD DISK: Seagate SATA 80 GB - LETTORE DVD: LG 16x52x - MASTERIZZATORE: Nec ND-3520 |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
E anche qui la tua esperienza è stata preziosa!
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? |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
E anche qui la tua esperienza è stata preziosa!
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? |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
E anche qui la tua esperienza è stata preziosa!
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: Codice:
$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"; 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? |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
Perdonatemi i post uguali! Ieri sera ho avuto dei problemi nel postare
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: May 2004
Messaggi: 278
|
Questa la passo, sulla sintassi SQL sono un po' arrugginito
__________________
PROCESSORE: AMD Athlon64 2800+ Boxed - MOTHERBOARD: Gigabyte K8NS nForce3 250 - SCHEDA VIDEO: 3D Prophet 9800 Pro 128MB - RAM: 512MB Corsair Value + 512 V-Data - CASE: Chieftech Dragon - ALIMENTATORE: Q-TEC 550W - HARD DISK: Seagate SATA 80 GB - LETTORE DVD: LG 16x52x - MASTERIZZATORE: Nec ND-3520 |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Apr 2012
Messaggi: 56
|
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 ![]() EDIT: Con buona volontà e pazienza ho risolto il problema delle query! 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 Ultima modifica di Baio84 : 12-04-2012 alle 09:10. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:14.






















