• User Newbie

    Php e Mysql: errore di sintassi (e di aritmetica?)

    [LEFT]PREMESSA
    Mi vergogno a dirlo ma è circa un mese che sto combattendo con questo problema, verosimilmente dovuto alla mia ignoranza in materia...:bho:
    Cercherò di essere più chiaro possibile.

    QUELLO CHE STO CERCANDO (INUTILMENTE) DI FARE
    Devo effetture alcune modifiche ad un DB con oltre 4000 records. In particolare devo sistemare alcuni dati allo scopo di utilizzare il DB con un diverso sito.
    In sostanza devo prendere i dati da due campi di una tabella e, se corrispondono ad una certa combinazione che si verifica solo una volta, inserire un determinato valore numerico in un altro campo del medesimo database
    [/LEFT]

    **IL MIO (ROZZO) SCRIPT IN PHP
    **Dopo un mesetto di consultazione di guide varie, partendo da zero, ho messo giù questo script

    [php]<?php
    //----------------------------------------------------------------------------------------------------

    // Informazioni database
    // --------------------

    $dbHost = ''; // Nome host
    $dbNameN = ''; // Nome database
    $dbUser = ''; // Username connessione database
    $dbPass = ''; // Password connessione database
    $prefN = ''; // Prefisso database

    // Fase 1. Connessione al database
    $conn = mysql_connect($dbHost, $dbUser, $dbPass) or die ('Errore di connessione mysql');

    // Fase 2. Recupero i dati che mi servono dalla tabella
    // ----------------------------------------------------------------------------------------------------

    mysql_select_db($dbNameN) or die ('Errore di selezione database');
    $result_risultato = mysql_query("SELECT * FROM ".$prefN."tabella") or die(mysql_error());
    while ($row_risultato = mysql_fetch_array($result_risultato)) {
    $Risultato_Catid = $row_risultato['catid'];
    $Risultato_Topic = $row_risultato['topic'];

    //Fase 3. Ora faccio l'operazione che mi serve

    mysql_query("UPDATE ".$prefN."tabella SET notes=1 WHERE $Risultato_Catid == 1 AND $Risultato_Topic == 1) or die(mysql_error()");

    }
    echo "------------------------------------------------------------------------<br>";
    echo "FATTO!!<br>";
    echo "------------------------------------------------------------------------<br>";

    // ----------------------------------------------------------------------------------------------------

    //
    // CHIUSURA CONNESSIONE CON DATABASE
    // ----------------------------------
    //
    // Chiude connessione al database
    mysql_close($conn);
    // ----------------------------------------------------------------------------------------------------
    //

    ?>[/php]Se lo provo con phpDesigner sembra funzionare ma.....

    IL PROBLEMA...

    Devo ripetere l'operazione per una serie di volte secondo uno schema che, riportando qui di seguito il comando di MYsql, è il seguente

    UPDATE tabella SET notes = '1' WHERE topic = '1' AND catid = '1' ,
    UPDATE tabella SET notes = '2' WHERE topic = '2' AND catid = '1' ,

    dove il valore di notes arriverà in sequenza fino a **360
    il valore di topic **arriverà in sequenza fino a 24 (per poi ricominciare da 1)
    il valore di catid arriverà in sequenza fino a 15 (per poi ricominciare da 1)
    Noterete, inoltre, che topic segue la sequenza numerica fino a 24 mentre catid rimane fisso a 1, poi ***topic ***riprenderà la sequenza dall'inizio e catid avrà il valore 2 e così via.

    E' una specie di tabellina delle moltiplicazioni.:mmm:

    In pratica, il campo notes è il risultato di tutti i possibili abbinamenti dei campi topic e catid che corrispondono agli argomenti trattati. Questo risultato è individuato da un ID in sequenza che arriva a 360

    Ad esempio, il database contiene articoli di storia divisi per "nazioni" (topic) e "epoche" (catid).
    Dovro' quindi fare i diversi abbinamenti tra le 24 epoche e le 15 nazioni, tipo:
    Italia (1), Medioevo (1);
    Germania (2), Medioevo (1);
    Francia (3), Medioevo (1); etc.
    Poi:
    Italia (1), Rinascimento (2);
    Germania (2), Rinascimento (2);
    Francia (3), Rinascimento (2);
    e così via....

    360 è quindi il risultato della moltiplicazione tra 24 e 15 ma non riesco a tradurlo in modo da farlo funzionare. Naturalmente potrei provare a ricopiare 360 volte la query cambiando i dati a mano ma dopo un po' si supera il termine massimo di esecuzione (che ho ampliato anche con il php.ini ma senza risultato).

    Gli abbinamenti riguardano, come ho detto più di 4000 record.

    Sono convinto che chi ha una maggiore competenza in php è in grado di risolvere questo problema in 5 minuti mentre io è circa un mese che ci passo tutto il tempo libero senza riuscire ❌x:x

    Grazie anticipatamente a chi vorrà aiutarmi...


  • Consiglio Direttivo

    Ciao Olterra. 🙂

    Intanto noto un errore nell'UPDATE perché passi il contenuto di una cella della prima tabella come nome di campo. Ovvero se il primo record della tabella è Italia (campo catid) e Medioevo (campo topic), l'UPDATE risulta eseguito così:

    UPDATE ".$prefN."tabella SET notes=1 WHERE Italia == 1 AND Medioevo == 1
    ```Quindi così non va'. ;)
    
    La tabella è già impostata così giusto?
    > Italia (1), Medioevo (1); 
    Germania (2), Medioevo (1);  
    Francia (3), Medioevo (1); etc. 
    Poi: 
    Italia (1), Rinascimento (2); 
    Germania (2), Rinascimento (2); 
    Francia (3), Rinascimento (2); E quello che a te serve è solo aggiungere un campo notes che sia un numero univoco:
    > Italia (1), Medioevo (1), notes(1); 
     Germania (2), Medioevo (1), notes(2);  
     Francia (3), Medioevo (1), notes(3); 
     Italia (1), Rinascimento (2), notes(4); 
     Germania (2), Rinascimento (2), notes(5); 
     Francia (3), Rinascimento (2), notes(6); Se non ho capito male non c'è bisogno di far nulla di tutto cio', basta che aggiungi un campo numerico auto_increment alla tabella ed il campo notes assumerà direttamente i valori 1, 2, 3, 4, etc etc. ;)
    
    Spero di non aver compreso male quello che volevi fare. ;)

  • ModSenior

    Ciao Olterra,

    Questo. per essere giusto come sintassi:
    [php]
    mysql_query("UPDATE ".$prefN."tabella SET notes=1 WHERE $Risultato_Catid == 1 AND $Risultato_Topic == 1) or die(mysql_error()");
    [/php]
    dovrebbe essere cosi:
    [php]
    mysql_query("UPDATE ".$prefN."tabella SET notes=1 WHERE $Risultato_Catid == 1 AND $Risultato_Topic == 1") or die(mysql_error());
    [/php]


  • User Newbie

    Grazie ad entrambi per le correzioni ed i suggerimenti che proverò subito.

    Mi resta comunque da capire come ripetere fino a 360 volte l'operazione senza dover ricopiare il codice più volte.

    Infatti la soluzione proposta da Samyorn sarebbe praticabile se non avessi già gli "abbinamenti" prestabiliti.

    Mi spiego.

    Le modifiche da apportare riguardano più di 4000 record.

    Nel nostro esempio, ciascun record contiene un articolo di storia, già classificato.

    Ad esempio "articolo su Federico II di Mario Rossi" con id 1 classificato come "topic" Italia (1) e "catid" medioevo (1) che riceverà in "notes" il numero 1 corrispondente al risultato della combinazione.

    Tra i 4000 articoli ce ne saranno però altri (anche centinaia), che avranno la medesima classificazione e che devono ricevere lo stesso valore 1 in "notes" perché riguardano sempre "Italia" e "Medioevo": l'articolo "Filippo il bello e i templari di Giovanni Bianchi" - sempre per continuare l'esempio - avrà la medesima classificazione (Italia e medioevo) e il valore numerico 1 in "notes" e cosi via....

    Per questo motivo avevo cercato, nel mio script, di prelevare prima tutti i dati raggruppandoli negli array (spero il termine sia esatto...) $Risultato_Catid e $Risultato_Topic

    In modo da confrontarli per poi attribuire la combinazione giusta dicendo in pratica a PHP:
    "Confronta $Risultato_Catid con $Risultato_Topic.
    Tutte le volte che, ad esempio, $Risultato_Catid è uguale a 1 (medioevo) e $Risultato_Topic è uguale a 1 (italia) attibuisci a "notes" il valore 1"

    Da quello che ho capito, questo confronto dovrei farlo con un controllo di flusso (è giusto il nome?) "if".
    Ci ho provato ma, anche qui, il problema è far ripetere l'operazione: se copio 360 volte la formuletta mi supera il tempo massimo per l'esecuzione.

    Allo stesso modo, ho capito che potrei far "contare" a PHP le 360 volte con un ciclo While anche se, in questo caso, ho le idee meno chiare su come fare.

    Il problema è, automatizzare il tutto, perché l'alternativa è quella di scrivere su 360 righe il comando UPDATE e lanciare a mano la query con phpmyadmin:crying::crying:

    Grazie ancora!


  • Consiglio Direttivo

    Ok, mi era sfuggito qualcosa. 😉

    Ho buttato giù qualcosa al volo senza testarlo, prova così:
    [PHP]$n=1;
    for ($i=1; $i=24; $i++)
    {
    for ($u=1;$u=15;$u++)
    {
    $sql="UPDATE tabella SET notes='$n' WHERE topic='$i' AND catid='$u'";
    $query=@mysql_query($sql) or die (mysql_error());

        $n=$n+1;
    }
    

    }[/PHP]
    😉


  • User Newbie

    Grazie ci provo.
    avevo postato prima una diversa soluzione, ma forse ho sbagliato nell'inviare.

    In pratica, grazie ad un suggerimento che ho avutro altrove, si potrebbe risolvere anche conquesta query da lanciare direttamente in PhpMyadmin:

    
     UPDATE tabella SET `notes` = (catid -1) * 24 + topic
    
    ```Ho provato e sembra funzionare....

  • Consiglio Direttivo

    Bene. 😉