Visualizzazione risultati 1 fino 12 di 12

Discussione: query update inserita in un ciclo for

  1. #1
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito query update inserita in un ciclo for

    Salve a tutti,

    sto provando ad aggiornare il campo posizione della tabella utenti con una serie numerica progressiva che parta dal record che abbia il campo punti maggiore (dove per prova ho inserito un pò di numeri a caso...). Pensavo di provare con questa, ma non funziona...
    Il problema è un errore di sintassi...ma non capisco come mai....Potreste darmi una mano? grazie mille!!

    Codice PHP:
    <?

    $DB_host
    = 'my_host';
    $DB_user = 'my_user';
    $DB_password = 'my_pw';
    $DB_name = 'my_db';

    $link = mysql_connect($DB_host, $DB_user, $DB_password);
    if (!
    $link) {
    die (
    'Non riesco a connettermi: ' . mysql_error());
    }

    $db_selected = mysql_select_db($DB_name, $link);
    if (!
    $db_selected) {
    die (
    "Errore nella selezione del database: " . mysql_error());
    }

    $all_rows = mysql_num_rows(mysql_query("SELECT id FROM utenti"));

    echo
    $all_rows; // mi restituisce il numero di righe (1440) fin qui tutto ok!!!

    // prova un inserimento nel campo posizione

    if ($all_rows != 0){
    for(
    $i=0;$i<($all_rows); $i++){
    $query="UPDATE utenti SET posizione= $i ORDER BY punti";
    $result = mysql_query($query) or die(mysql_error());
    }

    else
    {
    echo
    "ciao!";}
    }
    Ultima modifica di alemoppo : 24-04-2014 alle ore 01.02.52 Motivo: [code] -> [php]

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Che errore restituisce?

    Ma il senso dello script? Cioè, "sprechi" $all_rows query quando puoi semplicemente ottenere lo stesso risultato con una query settando posizione direttamente a $all_rows-1!
    Poi, perché c'é "ORDER BY punti" nella query?

    Ciao!
    Ultima modifica di alemoppo : 24-04-2014 alle ore 01.12.12

  3. #3
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    Ciao Ale, grazie per avermi risposto, praticamente voglio creare una classifica dei miei utenti in base ai loro punti...potrei farlo ordinando semplicemente gli stessi ed avendo perciò

    utenti punti

    a 15
    b 14

    ecc....

    ...Dopo di che questa verrà impaginata ogni 10 righe perchè gli utenti sono molti...

    Questo mi crea un problema nell'usare un'altra forma di inserimento\visualizzazione di numerazione progressiva per la loro posizione...perchè se la numerazione progressiva la associo alla posizione 'come riga', avrò nella prima pagina la numerazione da 1 a 10...e nella seconda, anzichè da 11 a 20, sempre da 1 a 10 e così nelle successive...sempre da 1 a 10...

    Allora mi sono detto, potrei fare un update del campo posizione (attualmente sono presenti tutti 0)

    posizione utenti punti

    0 a 15
    0 b 14

    ecc....

    ordinando in base (Order by) ai punti, così nel campo posizione mi viene una serie numerica....e poi uso la stessa serie per ordinare la tabella, cosìcchè nell'impaginarla mi mantiene i numeri progressivi...per ottenere questo in sostanza


    posizione utenti punti

    1 a 15
    2 b 14


    l'errore che mi restituisce comunque è

    Parse error: syntax error, unexpected '}'

    nella sintassi sbaglio spesso, ma non so come mettere le parentesi stavolta...

  4. #4
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    se si riesce a risolvere il problema update poi sono a cavallo....ordino la tabella in base al campo posizione e poi la impagino di dieci righe alla volta....

    al momento l'ho già fatto, ma solo con i campi utente e punteggio...invece sarebbe bello inserire la posizione...
    anche perchè nella pagina di ciascun utente potrei inserire la tua posizione è.....'n'

    sarebbe carino...

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Per l'errore, ricontrolla le parentesi in questo pezzo:
    Codice PHP:
    if ($all_rows != 0){
    for(
    $i=0;$i<($all_rows); $i++){
    $query="UPDATE utenti SET posizione= $i ORDER BY punti";
    $result = mysql_query($query) or die(mysql_error());
    }

    else
    {
    echo
    "ciao!";}
    }
    Risolveresti tutti questi problemi di sintassi indentando correttamente.

    Passando al problema, da quel che ho visto non ha molto senso il sistema che hai fatto (più che altro non ho capito come possa funzionare). Ti dico come farei io, poi vedi tu:

    Semplicemente, con una SELECT + LIMIT, ad esempio:

    Codice PHP:

    'SELECT campi FROM tabella ORDER BY campo LIMIT '.($_GET['pagina']*10).', '.10
    OVVIAMENTE con i dovuti controlli etc etc..

    Anche perché con una UPDATE non puoi leggere dei dati, quindi dovresti comunque fare un'altra select.

    Ciao!
    Ultima modifica di alemoppo : 24-04-2014 alle ore 02.11.01

  6. #6
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    Si Ale infatti ho fatto così dopo... una select che mi restituisce tutto ordinato per punti e con il campo posizione però che va da 1 a 10 in ogni pagina...

    ma io volevo aggiornare il campo posizione con una serie numerica progressiva, ma mi sa che non si può fare...

    ho provato a spostare le } e al massimo mi inserisce lo stesso numero (1399, che sarebbe i record meno 1) in ogni riga del campo posizione...

    Certo è che mi sembra strano che uno non possa inserire una serie progressiva numerica in un campo sulla base dei valori di un altro campo... mah... forse confliggono order by ed update....

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Citazione Originalmente inviato da goalmanager Visualizza messaggio
    ho provato a spostare le } e al massimo mi inserisce lo stesso numero (1399, che sarebbe i record meno 1) in ogni riga del campo posizione...
    Questo è quello che fa il codice che ti ho scritto. Ecco perché ti ho detto:

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Ma il senso dello script? Cioè, "sprechi" $all_rows query quando puoi semplicemente ottenere lo stesso risultato con una query settando posizione direttamente a $all_rows-1!
    ----------

    Citazione Originalmente inviato da goalmanager Visualizza messaggio
    Certo è che mi sembra strano che uno non possa inserire una serie progressiva numerica in un campo sulla base dei valori di un altro campo... mah... forse confliggono order by ed update....
    No: la ORDER BY ha senso solo se usi la UPDATE con LIMIT. Se tu fai una query del tipo:
    Codice:
    UPDATE tabella SET campo=3
    Ti setta il campo di TUTTE le righe a 3. Questo è il normale funzionamento. Quindi capisci da solo che ORDER BY non ha alcun senso: le righe vengono settate tutte indistintamente.

    Ciao!
    Ultima modifica di alemoppo : 24-04-2014 alle ore 14.13.39

  8. #8
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    Ok...grazie....

    ho provato di tutto...anche a vedere di associare due tabelle, ma non si può se non hanno dati in comune....e nel mio caso non li hanno....

    una avrebbe solo il campo posizione (da 1 a n...) e l'altra avrebbe i campi utente (id, nome, punti).

    Ma possibile che non esista un modo per ottenere un ordinamento decrescente di un campo? Bhò...mi sembra impossibile...
    Per ora ho rimediato 'a mano'....però è un bel pò deprimente....

    Ho trovato qualcuno che ha risolto la situazione così....

    Risolto.
    Per farlo ho creato un array con tutte le righe ordianto per DESC e poi ho utilizzato la funzione ARRAY SEARCH.
    Ciao posto il code, sper opossa essere di aiuto a qualcuno.

    while($rowranking = mysql_fetch_array($resultranking)) {
    $return[] = $rowranking[idrif];
    }
    // cerco la posizione nell array con tutta la classifica
    $posclassifica = array_search($idrif, $return);
    ma pur documentandomi non ho capito che roba ha fatto....Continuerò a studiarci, ma sono tre giorni che ci provo praticamente....mannaggia... Grazie comunque del tuo aiuto Ale... se ovviamente 'scopri' qualcosa io sono sempre qua sul pezzo :-)

  9. #9
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    Ho provato pure con una sub query...ma ovviamente niente....

  10. #10
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    L'ordinamento decrescente di un campo si fa con la ORDER BY campo DESC. Però non ho capito quel che vuoi fare, e soprattutto perché la query che ti ho dato sopra per impaginare non va bene.

    Ciao!

  11. #11
    goalmanager non è connesso Utente
    Data registrazione
    08-03-2014
    Messaggi
    140

    Predefinito

    Per l'impaginazione va bene... e già io ero riuscito ad impaginare la tabella, ma ciò di cui ho bisogno è (al fine di realizzare una classifica) una serie numerica progressiva per record. Ti faccio un esempio:

    al momento ho (ipotizziamo 3 utenti)

    id nome punti

    1 tizio 30
    2 caio 20
    3 sempronio 40


    se voglio impaginarli 2 a 2 ci riesco...
    se voglio ordinarli in base al punteggio ci riesco...

    ma se volessi creare un campo denominato posizione e fare questo:


    posizione id nome punti

    1 3 sempronio 40
    2 1 tizio 30
    3 2 caio 20

    non riesco....non sono capace a conseguire due cose assieme (ordinare in base ai punti e ordinare il campo posizione con una serie numerica decrescente)

    Ho provato di tutto....ho provato ad associare il valore del campo posizione al numero di record, ma impaginando di 20 in 20, ottengo per la prima pagina la posizione da 1 a 20 e nella seconda sempre da 1 a 20 (anzichè da 21 a 40).
    Poi ho provato ad inserirla io con update questa serie numerica....ma la funzione non va bene...

    Ecco ciò che non riesco a spiegarmi...possibile che non si possa realizzare una classifica (con anche il campo posizione che venga aggiornato con una serie numerica in base al punteggio degli utenti)?
    Ultima modifica di goalmanager : 26-04-2014 alle ore 03.34.22

  12. #12
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Ma non ho capito a cosa ti serve questa numerazione.
    Se vuoi stamparla in una pagina, è sufficiente che incrementi una variabile e la stampi..

    Ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •