Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Difficoltà nel modificare una tabella mysql

    Ciao a tutti,
    Ho scritto un piccolo script per aggiustare dei dati in una tabella del mio database. Solo che non funziona ...

    Dovrebbe eliminare l'ultimo carattere dal campo 'titolo' e riscrivere gli 'id' in modo da essere consecutivi e partire da 1.

    ecco il codice

    Codice PHP:
    <?php

    //Cancella l'ultimo carattere della stringa immessa
    function del_last_char($string)
    {
        
    $i strlen($string);
        
    $string[$i 1] = NULL;
        return 
    $string;
    }

    include (
    $_SERVER['DOCUMENT_ROOT'].'/php_include/database_funct.php');

    $db sism_database_connect();

    //Seleziona id e titolo dalla tabella News
    $query "SELECT id, titolo
    FROM News
    ORDER BY id ASC 
    LIMIT 0 , 30"
    ;

    $result mysql_query($query$db);

    $i 1;

    //Scorre le righe del dabase
    while ($row mysql_fetch_array($result)){
        
    //Crea un nuovo "titolo" eliminando una lettera dal vechio
        
    $new_title del_last_char$result['titolo'] );
        
        
    //Aggiorna titolo
        
    $query "UPDATE News SET  titolo = ".$new_title." WHERE id =".$result['id']." LIMIT 1";
        
    $result_1 mysql_query($query$db);
        
        
    //Aggiorna id con un valore incrementale a partire da 1
        
    $query "UPDATE News SET id =  ".$i." WHERE id =".$result['id']." LIMIT 1";
        
    $result_2 mysql_query($query$db);
        
        
    $i++;
    }

    mysql_close($db);
    ?>
    se carico lo script mi dà una pagina bianca senza errori ma quando controllo il database via phpmyadmin non è avvenuta nessuna modifica.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per rimuovere l'ultimo carattere da un campo basta una semplice query

    codice:
    update news set titolo = substring(titolo from 1 for char_length(titolo)-1)
    Il fatto che gli id non siano consecutivi non crea alcun problema. Volendo si può anche risolvere ma è del tutto inutile.

  3. #3
    Ti ringrazio, ma volevo anche capire perché il mio codice nn fuziona. Sto imparando e voglio capire la logica del problema.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per estrarre una porzione di stringa devi giocare con la funzione substr().

    http://it2.php.net/manual/en/function.substr.php

    Tra gli esempi trovi anche il tuo caso specifico

    Codice PHP:
    function del_last_char($string) {
        return 
    substr($string0, -1);

    Per quanto riguarda il "reset" degli id della tabella, se proprio ti interessa, qui trovi la soluzione di piero.mac.

    http://forum.html.it/forum/showthrea...39#post9661139



    P.S. Comunque non ha senso fare tutto quel giro quando con mezza riga di query ottieni lo stesso risultato.

  5. #5
    Ho trovato l'errore... sono un idiota...

    Codice PHP:
    new_title del_last_char$result['titolo'] ); 
    Ho scritto $result['titolo'] invece di $row['titolo']!

    gli errori più stupidi sono quelli più difficili da trovare.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Contento tu se per rimuovere l'ultimo carattere da ogni record di un campo preferisci fare una select, usare una funzione di php e fare una query di update per ogni singolo record.
    Ah, una volta che specifichi l'id da aggiornare la clausola limit 1 non ha alcun senso.

  7. #7
    Ma a parte il codice sql per fare tutto in un colpo, per scorrere fra le varie righe della tabella non devo fare per forza SELECT e poi usare con fetch_array? altrimenti come faccio a modificare tutte i campi? Non ho capito come faresti tu.

    Cmq l'aggiornamento degli id ora funziona ma quello dei titoli no... Ho messo un var_dump all'interno del ciclo per verificare tutte le variabili e $result_1 mi risulta FALSE, quindi la query per modificare il titolo non va a livello di sql.

    Qualche idea?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per scorrere i record si usa sì il while e mysql_fetch_array() o mysql_fetch_assoc() ma come ti ho già scritto ti obblighi a fare tutta una serie di passaggi inutili e ad eseguire una query per ogni record mentre con una soluzione diretta in mysql basta UNA query.

    Devi aggiornare il titolo solo dei 30 record con id più basso?

    codice:
    update news set titolo = substring(titolo from 1 for char_length(titolo)-1) where id <= (
    select * from (select id from news order by id asc limit 29,1) as tab)

  9. #9
    Ti ringrazio!
    Posso chiederti un favore? mi spiegheresti pezzo pezzo cosa fa questa query?

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Tu devi rimuovere l'ultimo carattere dei 30 record con id più basso. Siccome non è scontato che tali id siano progressivi e che quindi abbiano valore compreso tra 1 e 30, con questa query

    select id from news order by id asc limit 29,1


    recuperi l'id, dopo averli ordinati in senso crescente, del 30esimo record.

    Poichè mysql non consente di eseguire una query di aggiornamento nella quale, tramite una subquery, si fa riferimento alla tabella stessa, si utilizza l'escamotage di assegnarle un altro nome (nel mio esempio tab) in questo modo

    select * from (select id from news order by id asc limit 29,1) as tab)

    A questo punto, una volta noto l'id massimo che ci interessa, aggiorniamo tutti quelli che hanno un id inferiore o pari a tale valore e con

    substring(titolo from 1 for char_length(titolo)-1)

    non fai altro che estrarre tutta la stringa tranne l'ultimo carattere.
    Spero di essere stato chiaro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.