inserimento csv in tabella mysql; problema con struttura

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
ho una necessità un po' particolare: devo "dare in pasto" a mysql un file csv composto da tante righe come la seguente

pasta aproteica;aproten;5,95000;5,05750;9803

il separatore di campo è il ";".

in mysql il tipo di carattere per ogni campo è "text" e il form che utilizzo popola correttamente la tabella; questo è la parte di form in php che popola la tabella:

PHP:
if (isset($_POST['upfile'])){
// check feilds are not empty

if(get_file_extension($_FILES["uploaded"]["name"])!= 'csv')
{
$error[] = 'è possibile caricare solo file .csv';
}

if (!$error){

$tot = 0;
$handle = fopen($_FILES["uploaded"]["tmp_name"], "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    for ($c=0; $c < 1; $c++) {

            //only run if the first column if not equal to firstname
            if($data[0] !='firstname'){
               
            $oggi = (date("Y-m-d H:i:s"));
           
            mysql_query("INSERT INTO WEBCARE(
               WDESCRIZIONE,
               WEAN,
               WGMP,
               WDITTA,
               WCONFMINSAN,
               WPREZZOMINSAN,
               WPREZZOAPPLICATO,
                )VALUES(
                    '".mysql_real_escape_string($data[0])."',
                    '".mysql_real_escape_string($data[1])."',
                    '".mysql_real_escape_string($data[2])."',
                    '".mysql_real_escape_string($data[3])."',
                    '".mysql_real_escape_string($data[4])."',
                    '".mysql_real_escape_string($data[5])."',
                    '".mysql_real_escape_string($data[6])."'
                    )")or die(mysql_error());
            }

    $tot++;}
}
fclose($handle);
il problema è che ho bisogno che i campi WPREZZOMINSAN E WPREZZOAPPLICATO siano numerici e non testuali, per poter poi far eseguire da php delle operazioni matematiche: impostando ogni tipo di numero (decimal, float, etc..) l'inserimento non va a buon fine, cioè la tabella si popola di valori sballati.

probabilmente è quella virgola fra l'intero e il decimale del campo WPREZZO*** che manda in confusione l'interprete.

a qualcuno viene in mente qualche soluzione???
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
dopo "fclose" (in ogni caso in fondo al codice) inserisci questa funzione
PHP:
function ValidateFloat($float) {
  $val = htmlentities(strip_tags(trim($float)));
  $val = str_replace(",", ".", str_replace(".", "", $val));
  $val = (float)filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  return $val;
}
poi sostituisci
mysql_real_escape_string($data[5])
con
ValidateFloat($data[5])

lo stesso per l'altro valore

la funzione elimina i punti (migliaia) eventualmente presenti nel valore
quindi rimpiazza la virgola con il punto
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
grazie marino51 della risposta, ma la sostituzione di
mysql_real_escape_string($data[5])
con
ValidateFloat($data[5])

non mi fa funzionare il codice. il compilatore non mi indica nessun errore, ma quando lo lancio, mi restituisce una pagina bianca
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
inoltre, perchè la funzione

PHP:
function ValidateFloat($float) {
  $val = htmlentities(strip_tags(trim($float)));
  $val = str_replace(",", ".", str_replace(".", "", $val));
  $val = (float)filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  return $val;
}
va inserita in fondo al codice? non è corretto che venga eseguita prima di procedere alla insert?

sono un novellino, ecco il perché di tutte queste domande
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
la funzione viene eseguita quando viene richiamata nel codice
il codice che racchiude, può trattare valori diversi, associati alla variabile $float
per intenderci ValidateFloat($float)
quindi quando nel codice scrivo
ValidateFloat($data[5])
il valore di $data[5] sarà trattato nella funzione

quindi la posizione della funzione é irrilevante rispetto alla sua chiamata per l'esecuzione

poi WPREZZOAPPLICATO non deve essere seguito da virgola, perché é l'ultimo elemento dell'elenco

ti riscrivo il codice della query separando la preparazione del testo dalla sua esecuzione
PHP:
$sql="INSERT INTO WEBCARE(
WDESCRIZIONE,
WEAN,
WGMP,
WDITTA,
WCONFMINSAN,
WPREZZOMINSAN,
WPREZZOAPPLICATO
)VALUES(
     '".mysql_real_escape_string($data[0])."',
     '".mysql_real_escape_string($data[1])."',
     '".mysql_real_escape_string($data[2])."',
     '".mysql_real_escape_string($data[3])."',
     '".mysql_real_escape_string($data[4])."',
      ".ValidateFloat($data[5]).",
      ".ValidateFloat($data[6])."
)";

mysql_query($sql) or die(mysql_error());

function ValidateFloat($float) {
  $val = htmlentities(strip_tags(trim($float)));
  $val = str_replace(",", ".", str_replace(".", "", $val));
  $val = (float)filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  return $val;
}
usando questi valori,
PHP:
$data[0]="WDESCRIZIONE";
$data[1]="WEAN";
$data[2]="WGMP";
$data[3]="WDITTA";
$data[4]="WCONFMINSAN";
$data[5]="123,45";
$data[6]="98,32";
la query é così composta,

upload_2019-1-29_15-26-44.png
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
il codice sembra corretto... ma inserisco il Validatefloat al posto di mysql_real_escape e il codice non mi funziona più. non sarà mica colpa del fatto che uso "mysql_query" al posto di "$sql"? vado a tentoni perchè ripeto sono piuttosto inesperto. per correttezza e chiarezza, qui sotto c'è il codice che ho provato:

PHP:
            mysql_query("INSERT INTO WEBCARE(
               WCODICEISO,
               WDESCRIZIONEISO,
               WMINSAN,
               WDESCRIZIONE,
               WEAN,
               WGMP,
               WDITTA,
               WCONFMINSAN,
               WPREZZOMINSAN,
               WPREZZOAPPLICATO,
               WINS
               )VALUES(
                    '".mysql_real_escape_string($data[0])."',
                    '".mysql_real_escape_string($data[1])."',
                    '".mysql_real_escape_string($data[2])."',
                    '".mysql_real_escape_string($data[3])."',
                    '".mysql_real_escape_string($data[4])."',
                    '".mysql_real_escape_string($data[5])."',
                    '".mysql_real_escape_string($data[6])."',
                    '".mysql_real_escape_string($data[7])."',
                    ".ValidateFloat($data[8]).",
                    ".ValidateFloat($data[9]).",
                    '".mysql_real_escape_string($oggi)."'
                    )")or die(mysql_error());
                   
function ValidateFloat($float) {
  $val = htmlentities(strip_tags(trim($float)));
  $val = str_replace(",", ".", str_replace(".", "", $val));
  $val = (float)filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  return $val;

}
per chiarezza, avevo omesso alcuni campi nella insert, ma non credo sia un problema se adesso sono di più
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
modifica inserendo $sql e separando l'esecuzione,
nella $sql aggiungi tutti i campi che ti servono

prima dell'esecuzione inserisci,
echo $sql."<br />";
in modo da controllare come viene assemblata la query

nel caso non vada ancora guarda il log degli errori, se non risolvi posta l'errore
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
niente! ho provato in tutti i modi.. e il peggio è che non mi restituisce nessun log di errore, solamente pagina bianca, come se lo script si interrompesse
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
confermo che il codice scritto in precedenza ( con $sql) ed aggiornato, assembla la query correttamente
upload_2019-1-29_16-54-44.png
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
scusate tanto, ma così è corretto?

PHP:
            $sql="INSERT INTO WEBCARE(
               WCODICEISO,
               WDESCRIZIONEISO,
               WMINSAN,
               WDESCRIZIONE,
               WEAN,
               WGMP,
               WDITTA,
               WCONFMINSAN,
               WPREZZOMINSAN,
               WPREZZOAPPLICATO,
               WINS
               )VALUES(
                    '".sql_real_escape_string($data[0])."',
                    '".sql_real_escape_string($data[1])."',
                    '".sql_real_escape_string($data[2])."',
                    '".sql_real_escape_string($data[3])."',
                    '".sql_real_escape_string($data[4])."',
                    '".sql_real_escape_string($data[5])."',
                    '".sql_real_escape_string($data[6])."',
                    '".sql_real_escape_string($data[7])."',
                    ".ValidateFloat($data[8]).",
                    ".ValidateFloat($data[9]).",
                    '".sql_real_escape_string($oggi)."'
                    )"
                    or die(sql_error());
                    
function ValidateFloat($float) {
  $val = htmlentities(strip_tags(trim($float)));
  $val = str_replace(",", ".", str_replace(".", "", $val));
  $val = (float)filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  return $val;

}
tanto sono io che sbaglio in qualcosa... è impossibile che sia colpa dell'interprete
 

giacomo9783

Utente Attivo
24 Ago 2016
80
0
6
36
fermi tutti!!! soluzione trovata!!!
basta inserire, prima della query, al seguente riga:

PHP:
$campo=str_replace(",",".",$campo);
sostituisce ogni virgola con un punto. proprio quello che mi serviva! spero che sia di aiuto ad altri

chiaramente è necessario sostituire "$campo" con il campo da modificare
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia