[PHP] Ricerca e modifica su due tabelle

  • Creatore Discussione Creatore Discussione Emix
  • Data di inizio Data di inizio

Emix

Utente Attivo
15 Feb 2010
596
0
16
Buongiorno,
ho un problema.. ho due tabelle... una contiene codici comuni e sigle, l'altra e un DB contenente dei contratti e dati anagrafici.
io devo prelevare le cifre del comune all'interno del CF (questo gia lo faccio), le seleziono e le tiro fuori facendo una select sul DB dei contratti. Fatto questo all'interno del ciclo devo controllare la sigla e aggiornarla nel primo DB (Contratti). Sostanzialmente devo andare a fare un check di luogo di nascita e nazione del DB contratti interfacciandolo con quello dei comuni tramite le 4 cifre identificative del codice fiscale.
Faccio tutto tranne che invece di farmi ognuno il proprio record me li cambia tutti... mi aiutate per gentilezza a capire l'errore?

Grazie

Il codice:
PHP:
<?php
include ("connect.php");
$query_str=("SELECT * FROM multe_test")or die (mysql_error());
$query=mysql_query($query_str);
            //Multa trovata leggo i suoi campi
            while ($riga=mysql_fetch_array($query)) {
            $NRCONTRATTO=$riga['NRCONTRATTO'];
            $TARGA=$riga['TARGA'];
            $GRUPPO=$riga['GRUPPO'];
            $MODELLO=$riga['MODELLO'];
            $USCITA=$riga['USCITA'];
            $PREVISTO_RIENTRO=$riga['PREVISTO_RIENTRO'];
            $RIENTRO=$riga['RIENTRO'];
            $ID_CONDUCENTE=$riga['ID_CONDUCENTE'];
            $NOME=$riga['NOME'];
            $COGNOME=$riga['COGNOME'];
            $INDIRIZZO=$riga['INDIRIZZO'];
            $NAZIONE=$riga['NAZIONE'];
            $CITTA=$riga['CITTA'];
            $PROVINCIA=$riga['PROVINCIA'];
            $CAP=$riga['CAP'];
            $CF=$riga['CF'];
            $NAZIONE_NASCITA=$riga['NAZIONE_NASCITA'];
            $LUOGO_NASCITA=$riga['LUOGO_NASCITA'];
            $PROVINCIA_NASCITA=$riga['PROVINCIA_NASCITA'];
            $DATA_NASCITA=$riga['DATA_NASCITA'];
            $NPATENTE=$riga['NPATENTE'];
            $SCADENZA_PATENTE=$riga['SCADENZA_PATENTE'];
            $ENTE_RILASCIO=$riga['ENTE_RILASCIO'];
            
            //CERCO LE 4 CIFRE DEL CF.
            $filtrato=substr($CF,11,-1);
            //CERCO IL CODICE SULLA TABELLA COMUNI
            $query_comuni=mysql_query("SELECT * FROM comuni WHERE Codice='$filtrato'");
    //verifico che esista un utente con tale username e tale password
    $esiste=mysql_num_rows($query_comuni);
    //se $esiste == 0 non cè
    if($esiste > 0){//esiste
        //estraggo usn e pass
        echo "trovata corrispondenza!<br>";
        $rows=mysql_fetch_array($query_comuni);
        $nazione_ae=$rows['DenominazioneItaliana'];
        $pr=$rows['SiglaProvincia'];
        if ($nazione_ae == $pr) {
        $query_update ="UPDATE `multe_test` SET
        `NRCONTRATTO`='$NRCONTRATTO',
        `TARGA`='$TARGA',
        `GRUPPO`='$GRUPPO',
        `MODELLO`='$MODELLO',
        `USCITA`='$USCITA',
        `PREVISTO_RIENTRO`='$PREVISTO_RIENTRO',
        `RIENTRO`='$RIENTRO',
        `ID_CONDUCENTE`='$ID_CONDUCENTE',
        `NOME`='$NOME',
        `COGNOME`='$COGNOME',
        `INDIRIZZO`='$INDIRIZZO',
        `NAZIONE`='$NAZIONE',
        `CITTA`='$CITTA',
        `PROVINCIA`='$PROVINCIA',
        `CAP`='$CAP',
        `CF`='$CF',
        `NAZIONE_NASCITA`='$nazione_ae',
        `LUOGO_NASCITA`='$nazione_ae',
        `PROVINCIA_NASCITA`='$pr',
        `DATA_NASCITA`='$DATA_NASCITA',
        `NPATENTE`='$NPATENTE',
        `SCADENZA_PATENTE`='$SCADENZA_PATENTE',
        `ENTE_RILASCIO`='$ENTE_RILASCIO'
         WHERE Codice='$filtrato'";
         // invio la query
$result = mysql_query($query_update);
// controllo l'esito
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}
echo 'Query eseguita correttamente';
        }
        echo 'Nazione= '.$nazione_ae.'<br>';
        echo 'Provincia= '.$pr.'<br>';
    }else{
    echo "nessuna corrispondenza trovata!<br>";
    }//fine esiste
            
            }//fine WHILE
?>
 
Provando ad utilizzare un piccolo framework (medoo) il codice diventerebbe così:
PHP:
$conn=new Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'NOME_DATABASE',
        'server' => 'HOST',
        'username' => 'USERNAME',
        'password' => 'PASSWORD']);

    $risultato=$conn->select('multe_test', '*');

    $all_code_comuni=$conn->select('comuni','Codice,DenominazioneItaliana,SiglaProvincia');

    $only_code=[];
    foreach ($all_code_comuni as $items){
        $only_code[$items['Codice']]=$items;
    }
    foreach ($risultato as $items){
        $codice_fiscale=$items['CF'];
        $codice_comune=substr($codice_fiscale,11);
        //verifico che esista nell'array il codice comune
        //Non eseguo una query per ogni items di risultato
        if(isset($only_code[$codice_comune])){
            //Inserisco nella variabile update i dati da aggiornare
            $update=[
                'NAZIONE_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'LUOGO_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'PROVINCIA_NASCITA'=>$only_code[$codice_comune['SiglaProvincia']]];
            //effettuo la where sul numero di contratto "credo sia la chiave"
            $where=['NRCONTRATTO'=>$items['NRCONTRATTO']];
            try{
                $conn->update( 'multe_test', $update, $where );
            }catch (Exception $e) {
                var_dump($conn->error());
            }
        }
    }
 
togliendo un po' di eccedenze e con qualche modifica, lo script,
PHP:
<?php
include ("connect.php");

$query_str="SELECT DISTINCT CF FROM multe_test"; // seleziono in modo univoco tutti i CF della tabella, manca where

$query=mysql_query($query_str) or die (mysql_error());

while ($riga=mysql_fetch_array($query))
{                                                // Multe trovata leggo i suoi campi
    $CF                = $riga['CF'];

    $filtrato=substr($CF,11,-1);                 //CERCO LE 4 CIFRE DEL CF

    $query_comuni=mysql_query("SELECT * FROM comuni WHERE Codice='$filtrato' LIMIT 1");          // cerco il comune

    $esiste=mysql_num_rows($query_comuni);       // verifico se trovato

    if($esiste > 0)
    {                                            // trovati comuni
        echo "trovata corrispondenza per $CF<br>";

        $rows=mysql_fetch_array($query_comuni);

        $nazione_ae = $rows['DenominazioneItaliana'];
        $pr         = $rows['SiglaProvincia'];
        if ($nazione_ae == $pr)
        {
            $query_update ="UPDATE `multe_test` SET
                                   `NAZIONE_NASCITA`='$nazione_ae',
                                   `LUOGO_NASCITA`='$nazione_ae',
                                   `PROVINCIA_NASCITA`='$pr'
                            WHERE  `CF`='$CF'";
            $result = mysql_query($query_update);
            if (!$result)
            {
                die("Errore nella query $query: " . mysql_error());
            }
            echo 'Query eseguita correttamente';
        }
        echo 'Nazione= '.$nazione_ae.'<br>';
        echo 'Provincia= '.$pr.'<br>';
    }
    else
    {
        echo "nessuna corrispondenza trovata per $CF<br>";
    } // fine esiste
  
} // fine WHILE
?>
 
Ultima modifica:
while ($riga=mysql_fetch_array($query))
{
// Multe trovata leggo i suoi campi
$CF = $riga['CF'];

$filtrato=substr($CF,11,-1); //CERCO LE 4 CIFRE DEL CF

$query_comuni=mysql_query("SELECT * FROM comuni WHERE Codice='$filtrato' LIMIT 1");

Utilizzando in questo modo le query per il comune dipendono dal numero di MULTE presenti....
Avendo tutti i comuni italiani anche quelli soppressi arriviamo a 12000 record, mentre il fattore multe è molto più variabile, nello specifico ipotizzando di avere 16000 multe faremo per 16000 volte una query sul DB.
Nel caso in cui il numero di multe superi il numero dei comuni conviene effettuare il ciclo al contrario, ossia partendo dai comuni e aggiornare le righe interessate delle multe....!
 
conviene effettuare il ciclo al contrario, ossia partendo dai comuni e aggiornare le righe interessate delle multe....!
se dobbiamo ottimizzare qualcosa, forse è meglio avere il codice del comune in chiaro nella tabella multe,
in questo modo si crea una view sulle 2 tabelle,
con una select sulla view si estraggono tutti i dati necessari senza preoccuparsi dell'aggiornamento
perché la view è sempre aggiornata
ed il film è finito
 
forse è meglio avere il codice del comune in chiaro nella tabella multe
HP: Se il funzionamento/pagina/etc... durante l'inserimento non pò essere modificata il campo lo possiamo solo sognare...
Domanda: a che servirebbe avere tale campo?
Risposta: Solo ad eseguire una query che non faccia assolutamente nulla...
Credo il lavoro che stia facendo @Emix è normalizzare dei dati già presenti...
Comunque sia SI, concordo con te @marino51 che durante l'inserimento sarebbe utile autocompletare il campo...
 
Innanzitutto vi ringrazio per le risposte. Ho testato il codice e mi da un errore, precisamente sull'unico non ITALIANO:

trovata corrispondenza per GRSNTL74D51Z127D
Errore nella query Resource id #5: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE `CF`='GRSNTL74D51Z127D'' at line 5

Per quanto riguarda il codice dei comuni la tabella ha questi campi :

Codice
dot.gif
varchar(255) utf8_general_ci No Nessuno
SiglaProvincia varchar(255) utf8_general_ci Sì NULL
DenominazioneItaliana varchar(255) utf8_general_ci Sì NULL

Questo il codice Z127:

Codice Sigla Provincia DenominazioneItaliana
Z127 POLONIA POLONIA


Grazie ancora
 
Provando ad utilizzare un piccolo framework (medoo) il codice diventerebbe così:
PHP:
$conn=new Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'NOME_DATABASE',
        'server' => 'HOST',
        'username' => 'USERNAME',
        'password' => 'PASSWORD']);

    $risultato=$conn->select('multe_test', '*');

    $all_code_comuni=$conn->select('comuni','Codice,DenominazioneItaliana,SiglaProvincia');

    $only_code=[];
    foreach ($all_code_comuni as $items){
        $only_code[$items['Codice']]=$items;
    }
    foreach ($risultato as $items){
        $codice_fiscale=$items['CF'];
        $codice_comune=substr($codice_fiscale,11);
        //verifico che esista nell'array il codice comune
        //Non eseguo una query per ogni items di risultato
        if(isset($only_code[$codice_comune])){
            //Inserisco nella variabile update i dati da aggiornare
            $update=[
                'NAZIONE_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'LUOGO_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'PROVINCIA_NASCITA'=>$only_code[$codice_comune['SiglaProvincia']]];
            //effettuo la where sul numero di contratto "credo sia la chiave"
            $where=['NRCONTRATTO'=>$items['NRCONTRATTO']];
            try{
                $conn->update( 'multe_test', $update, $where );
            }catch (Exception $e) {
                var_dump($conn->error());
            }
        }
    }

Non funziona...

Fatal error: Class 'Medoo' not found in C:\xampp\htdocs\update_test.php on line 2
 
Per farlo funzionare devi scaricarlo e includerlo nella tua pagina include.inc, o nella index.
Praticamente, scarichi il pacchetto zip, lo estrai in un drectory della tua applicazione e nella index o dove meglio credi lo includi all'inizio. In questo modo hai "new Medoo()".
 
Per farlo funzionare devi scaricarlo e includerlo nella tua pagina include.inc, o nella index.
Praticamente, scarichi il pacchetto zip, lo estrai in un drectory della tua applicazione e nella index o dove meglio credi lo includi all'inizio. In questo modo hai "new Medoo()".

Fatto, ho scaricato dal sito il pacchetto zip, ho preso il file Medoo.php e messo nella root, all'inizio del file ho inserito:
include ("Medoo.php");
Ma continua a darmi quell'errore..
 
Appena provato....
Il namespace.... new Medoo\Medoo([param])
PHP:
$medoo=new Medoo\Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'NOME_DATABASE',
        'server' => 'HOST',
        'username' => 'USERNAME',
        'password' => 'PASSWORD']);
 
Aggiungo: prime righe:

PHP:
<?php
include ("Medoo.php");
$conn=new Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'comuni_cf',
        'server' => 'localhost',
        'username' => 'root',
        'password' => '']);

    $risultato=$conn->select('multe_test', '*');

    $all_code_comuni=$conn->select('comuni','Codice,DenominazioneItaliana,SiglaProvincia');

Risultato:
Fatal error: Class 'Medoo' not found in C:\xampp\htdocs\update_test.php on line 3
 
Il file Medoo.php all'inizio è cosi:
PHP:
namespace Medoo;

use PDO;
use Exception;
use PDOException;

class Medoo
Quindi la conn è new Medoo\Medoo([])
 
Appena provato....
Il namespace.... new Medoo\Medoo([param])
PHP:
$medoo=new Medoo\Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'NOME_DATABASE',
        'server' => 'HOST',
        'username' => 'USERNAME',
        'password' => 'PASSWORD']);
Inserendo quanto detto da te risultato ripettuto X volte:

Warning: Illegal string offset 'Codice' in C:\xampp\htdocs\update_test.php on line 17
 
Hai qualcosa che non va nel file, no nella connessione con il DB!


Codice copiato e incollato da te:

PHP:
<?php
include ("Medoo.php");
$conn=new Medoo\Medoo([
        // required
        'database_type' => 'mysql',
        'database_name' => 'comuni_cf',
        'server' => 'localhost',
        'username' => 'root',
        'password' => '']);

    $risultato=$conn->select('multe_test', '*');

    $all_code_comuni=$conn->select('comuni','Codice,DenominazioneItaliana,SiglaProvincia');

    $only_code=[];
    foreach ($all_code_comuni as $items){
        $only_code[$items['Codice']]=$items;
    }
    foreach ($risultato as $items){
        $codice_fiscale=$items['CF'];
        $codice_comune=substr($codice_fiscale,11);
        //verifico che esista nell'array il codice comune
        //Non eseguo una query per ogni items di risultato
        if(isset($only_code[$codice_comune])){
            //Inserisco nella variabile update i dati da aggiornare
            $update=[
                'NAZIONE_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'LUOGO_NASCITA'=>$only_code[$codice_comune['DenominazioneItaliana']],
                'PROVINCIA_NASCITA'=>$only_code[$codice_comune['SiglaProvincia']]];
            //effettuo la where sul numero di contratto "credo sia la chiave"
            $where=['NRCONTRATTO'=>$items['NRCONTRATTO']];
            try{
                $conn->update( 'multe_test', $update, $where );
            }catch (Exception $e) {
                var_dump($conn->error());
            }
        }
    }
?>
 
Doveva essere un codice evocativo... prova a cambiare sulla linea 9 e metti così!
PHP:
$all_code_comuni=$conn->select('comuni','*');
 
trattandosi di un errore di sintassi, segnalo che tra il codice fiscale e le virgolette, non vedo l'apice ....

non disturbo più ....
In realtà la riga di appartenenza del codice è questa:
$query_comuni=mysql_query("SELECT * FROM comuni WHERE Codice='$filtrato' LIMIT 1");

ecco perche non capisco... la parte dei codici "italiani" la processa bene, si è bloccato qua.. forse è il LIMIT 1 che non gli piace?

Perche disturbi? o_O
 

Discussioni simili