inserimento csv in tabella mysql; problema con struttura

giacomo9783

Utente Attivo
24 Ago 2016
81
0
6
37
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.972
172
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
81
0
6
37
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
81
0
6
37
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.972
172
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
81
0
6
37
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.972
172
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
81
0
6
37
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.972
172
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
81
0
6
37
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
81
0
6
37
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.972
172
63
Lombardia
Discussioni simili
Autore Titolo Forum Risposte Data
J Form inserimento dati in database Ajax 1
D modificare questo codice per inserimento in text e non in tabella jQuery 1
R [C#] Automatizzare un inserimento di un Post su un Gruppo Facebook .NET Framework 0
M Aiuto con inserimento immagini WordPress 6
elpirata Impedire inserimento data di oggi e date passate jQuery 39
A Inserimento dati nel database tramite form + altre operazioni PHP 18
W Email conferma inserimento Classic ASP 0
S Inserimento multiplo non richiesto PHP 2
P inserimento icone social tramite html HTML e CSS 1
L form multipla php sql,errore in inserimento MySQL 0
Alex_70 Inserimento dati a cascata PHP 204
T Da xsd a xml ed inserimento dati in excel XML 0
M Problema inserimento parole con apostrofo nel db PHP 5
C [RISOLTO]Inserimento variabile php in input html PHP 20
P Access Inserimento data. MS Access 4
L Inserimento dettagli in una maglia Photoshop 2
S [PHP] email con inserimento dati nel database PHP 23
beatle [Photoshop] problema inserimento immagini Photoshop 1
G [Javascript] Errore inserimento dati Backend Node.js e workbench Javascript 1
B [PHP] Creare PDF dopo inserimento dati form PHP 4
C [PHP] Form con Inserimento dati dalla maschera e un menù a discesa che prende i dati dal db PHP 1
C [PHP] Form inserimento più menù a discesa PHP 9
M [PHP] Problemi su inserimento array nel db PHP 7
gandalf1959 [PHP] Inserimento di più righe non funziona come mi aspetto... PHP 2
E Inserimento dati da PHP in tabella MySQL PHP 5
E Form inserimento dati con JavaScript Javascript 0
D [MS Access] problemi con inserimento campo in una maschera MS Access 6
M [Joomla] Inserimento wow.js in template Joomla 4
K [PHP] Inserimento dati database con postgres PHP 2
K [PHP + MYSQL ] Inserimento dati in database da form dinamico PHP 13
A [PHP] Inserimento url dinamici in pagina html PHP 3
spider81man [PHP] Alert Box per confermare Inserimento o Cancellazione dato. PHP 4
gandalf1959 [MySQL] Inserimento multiplo da form multirighe MySQL 22
A [RISOLTO]Inserimento Immagini da pc a MySql PHP 15
M Inserimento dati checkbox multipli in db da ajax a php PHP 1
S [PHP] inserimento su DB da tabella PHP 29
P [PHP] Problema inserimento nuove chiavi in array PHP 2
paloppa Inserimento data su database MYSQL PHP 2
webimage [PHP] Non inserimento in tabella PHP 19
N [Java] codice per inserimento sql Java 0
T [HTML] inserimento nav HTML e CSS 8
G [HTML] Problemi con inserimento immagini HTML e CSS 7
C [HTML] Inserimento feed/rss di Mr.Webmaster sul proprio sito HTML e CSS 1
M Inserimento Array prelevato da Database in Php in un altra tabella mysql PHP 0
M [PHP] Controllo inserimento in tempo reale PHP 0
T [PHP] modulo inserimento in DB e apostrofi... PHP 1
M Inserimento automantico di un testo in una pagina PHP PHP 4
M [PHP] Difficoltà inserimento valori nella tabella scontrini PHP 16
S Javascript Inserimento Data. Javascript 7
B [PHP] Creare un'interfaccia di inserimento testo in varie posizioni PHP 1

Discussioni simili