funzione php si ripete due volte

Monital

Utente Attivo
15 Apr 2009
778
2
18
Salve ragazzi ho un problemino su cui sto sbattendo la testa da ore, ho creato una funzione che estrae dei dati da un file txt confronta i vari array creati e crea delle tabelle bla bla ....la funzione è molto lunga ed articolata e dato che ho fatto varie prove sono arrivato a determinare cosa crea l'errore.

vi metto un esempio semplice così come l'ho testato che crea lo stesso errore:

mi sono creato questa funzione
PHP:
    $textfile = file($file);
    for($x=0;$x<count($textfile);$x++){
        $multi[]=explode("\t",$textfile[$x]);
    }
    $campi=$multi[0];////questa riga sono le intestazioni dei campi
    $prova=$multi[1];
///questa è la prima riga per trovare i valori numerici e definire se varchar o int, tutte le altre righe sono uguali

        $query.="CREATE TABLE  pippo(";

        foreach($campi as $key=>$value){
        foreach($prova as $k=>$v){
            if(($key==$k)){
                if(is_numeric($v)){
                    
                    $query.= $value. " mediumint(8) NULL, ";//la stringa è composta di soli numeri
                }else{
                    $query.= $value. " VARCHAR(255) NULL, ";
                }
            }
        }

    }
$query.="PRIMARY KEY (".$primary1."))";

    $db->query($query);
      if (!$db>query($query))  printf("ErrorCREATE: ".$query."%s\n", $db->error)."<br>";;

    return true;
}
la tabella viene creata però dà errore table is ready exist

stessa cosa quando vado a inserire tutto il resto, viene inserito tutto e poi partono gli errori di duplicate.

in pratica è come se dopo la prima creazione(o inserimento) ne tenta un altro e dà errore.

probabilmente è perchè si trova in un foreach ma non vedo altra soluzione.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
ho fatto un ulteriore prova togliendo tutto dal foreach e dando dei nomi fittizzi. quando creo la tabella l'errore

PHP:
      if (!$db>query($query))  printf("ErrorCREATE: ".$query."%s\n", $db->error)."<br>";;
nu restiuisce

Table 'pippo' already exists
eppure è fuori dal ciclo e la tabella ovviamente non esisteva prima

boh mistero della fede
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto non vedo come crei l'indice primario che generalmente è
id INT(9) NOT NULL AUTO_INCREMENT, (chiamato id o come preferisci)
... eccc....
PRIMARY KEY (id)) ENGINE = InnoDB;
poi metti la condizione che la tabella non esista, è meglio
CREATE TABLE IF NOT EXISTS tabella(
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
ciao
intanto non vedo come crei l'indice primario che generalmente è
id INT(9) NOT NULL AUTO_INCREMENT, (chiamato id o come preferisci)
... eccc....
PRIMARY KEY (id)) ENGINE = InnoDB;
poi metti la condizione che la tabella non esista, è meglio
CREATE TABLE IF NOT EXISTS tabella(
si bongo la consizione della tabella se esiste c'è già, ho estrapolato solo il pezzo inerente alla creazione della tabella
l'indice primario lo metto è qua
PHP:
$query.="PRIMARY KEY (".$primary1."))";
lo definisco con una variabile.
può essere che debba aggiungere un campo id con l'auto_increment?
è una cosa necessaria, perchè a me l'id in quelle tabelle non serve dato che ogni tabella ha già al suo interno un id che è al 100% univoco.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
niente da fare borgo ho risolto il problema degli insert nel senso che ora mi inserisce tutti i dati(evidentemente qualche campo uguale c'era nei file più grandi) però nel create continua a darmi quell'errore(ma solo se faccio $result->error) però la tabella viene creata perfettamente e l'errore non viene lasciato nemmeno nel file log. quindi potrei pure soprassedere e che mi sono impuntato
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
la parte
$query.="PRIMARY KEY (".$primary1."))";
da sola non basta per definire il campo chiave primaria, devi prima dfinire il campo
PHP:
<?php
//...........
        $query.="CREATE TABLE  pippo(";
        $query.="$primary1 VARCHAR(50) NOTNULL, ";//non so dove l'hai messa ma questa ci vuoile
        foreach($campi as $key=>$value){
        foreach($prova as $k=>$v){
            if(($key==$k)){
                if(is_numeric($v)){
                    $query.= $value. " mediumint(8) NULL, ";//la stringa è composta di soli numeri
                }else{
                    $query.= $value. " VARCHAR(255) NULL, ";
                }
            }
        }

    }
$query.="PRIMARY KEY (".$primary1."))";
//.......
?>
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
Ho fatto csì borgo

PHP:
 $query="CREATE TABLE  pippo (id int(9) NOT NULL AUTO_INCREMENT,";
    foreach($campi as $key=>$value){
        $query.= $value. " int(9) NULL, ";//la stringa è composta di soli numeri
    }
        $query.="PRIMARY KEY (id))";
ho inserito un campo in più con un paio di for me la sono cavata. ora fa tutto perfetto crea tabelle e fa l'inserimento. però ad esempio con questo codice crea la tabella perfettamente,sia i campi sia int o varchar però avendo messo questa riga

(!$db>query($query)) printf("ErrorCREATE: ".$query."%s\n", $db->error)."<br>";;

mi segnala-->subito dopo creata la tabella

Table 'pippo' already exists

stessa cosa l'insert, inserisce prima tutto e poi parte con gli errori duplicate.

E come se una volta creata la tabella ritenti la creazione, ma non riparte lo script,altrimenti mi darebbe l'avviso che la tabella esiste già ho usato una funzione di controllo all'inizio della funzione.