[PHP] Ricerca e modifica su due tabelle

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
?>
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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());
            }
        }
    }
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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....!
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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...
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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()".
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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..
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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']);
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Il file Medoo.php all'inizio è cosi:
PHP:
namespace Medoo;

use PDO;
use Exception;
use PDOException;

class Medoo
Quindi la conn è new Medoo\Medoo([])
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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());
            }
        }
    }
?>
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Doveva essere un codice evocativo... prova a cambiare sulla linea 9 e metti così!
PHP:
$all_code_comuni=$conn->select('comuni','*');
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
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
Autore Titolo Forum Risposte Data
U PHP creare un file excel dopo ricerca nel DB PHP 0
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
L Ricerca sviluppatori PHP tempo indeterminato Milano Offerte e Richieste di Lavoro e/o Collaborazione 0
S [PHP] Creare collegamento filtri di ricerca al database PHP 6
L [PHP] Ricerca su search bar esterna PHP 1
Alex_70 [PHP] Ricerca con risultati cliccabili PHP 21
ANDREA20 [PHP] motore di ricerca nel sito PHP 11
O [PHP] Ricerca record tramite post PHP 7
T [PHP] Ricerca nel database PHP 2
C [PHP] Ricerca multipla, evitare if PHP 4
M [OFFRO][RETRIBUITO] Milano IT Consulting SRL - Ricerca 1 Consulente PHP Offerte e Richieste di Lavoro e/o Collaborazione 0
andreas88 Da .htm a .php, perdo le mie posizioni su Google ricerca? SEO e Posizionamento 9
G [PHP] FORM DI RICERCA ESTESA PHP 2
borgo italia [PHP] ricerca caratteri accentati PHP 4
P [PHP] ricerca dati PHP 1
Emix [PHP][MYSQL] Ricerca avanzata tramite form PHP 6
T4MAR4 [PHP] Problema ricerca con apostrofo PHP 2
R [PHP] Prendere dati da moduli di ricerca esterni PHP 4
T4MAR4 [PHP] piu select in ricerca PHP 1
T4MAR4 [PHP] Inserire piu campi di ricerca PHP 2
A [PHP] Problema paginazione motore di ricerca PHP 48
TheWhiteRabbit Perfezionare ricerca in PHP - NO DATABASE - (Website X5) PHP 5
sandropochi [PHP] Form per creare filtro di ricerca su DB PHP 8
U [PHP] form per ricerca multipla: Unknown column 'undefined' in 'where clause' PHP 2
giuseppe_123 [PHP] ricerca in una tabella con my sql PHP 0
L [PHP] ricerca per un campo o per più campi PHP 5
M [PHP] Ricerca con data timestamp PHP 45
B Ricerca PHP e Prenotazione PHP PHP 2
M [PHP] Evidenziare le parole cercate nei risultati di una ricerca PHP 1
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 1
Y [Retribuito][Offro] RICERCA PROGRAMMATORI iOS e PHP/DB Offerte e Richieste di Lavoro e/o Collaborazione 0
S Un aiuto su uno script di ricerca avanzata in php che sto verificando. PHP 1
I Motore di ricerca php PHP 2
C [Offro][Retribuito] Cloudworks srl ricerca un junior PHP developer Offerte e Richieste di Lavoro e/o Collaborazione 0
N PHP Ricerca utente, Tabella con più elementi PHP 8
M motore di ricerca complesso php PHP 2
R Barra ricerca php e mysql PHP 0
R Ricerca Email in database mysql con php PHP 2
S [RISOLTO]aiuto, non riesco afar funzionare il camp odi ricerca per un DB con PHP PHP 5
M Box di ricerca in php PHP 3
P PHP modulo ricerca e ordine alfabetico PHP 5
G Visualizzazion modulo di ricerca in PHP e MySql PHP 0
A Ricerca full text mysq ed estrazione con php PHP 8
G Php problema con risultato di ricerca PHP 2
I Facile.it Spa ricerca Senior PHP Developer forti ed ambiziosi! Offerte e Richieste di Lavoro e/o Collaborazione 0
K Problema ricerca con piu campi in php PHP 3
Sargon Php / My sql motore di ricerca PHP 21
F Ricerca avanzata PHP & MySQL PHP 4
P PHP Workgroup Livorno, RICERCA giovani programmatori! Offerte e Richieste di Lavoro e/o Collaborazione 1

Discussioni simili