19 messaggi dal 19 dicembre 2011
ho un problema con un file txt...

in poche parole devo mettere tutto ciò che è al suo interno in una tabella (composta da 5 elementi compreso l'id) in MySQL.

ho provato e riprovato e sono anche andato a dare un'occhiata sul manuale ma non ho trovato nulla che facesse al mio caso...

comunque sia sono riuscito ad aprire il file e a stamparlo a video...

codice:

<?php
$file=file_exists("siga.txt");
if($file==true)
{
$file=fopen("siga.txt","a+");
}
else
{
echo "file non trovato!";
}

$leggi=fread($file,filesize("siga.txt"));
$max = count($leggi);
$sss=nl2br($leggi);

echo $sss;
?>



come posso continuare???
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, ora che hai il contenuto del file lo puoi utilizzare in un comando SQL INSERT o UPDATE, a seconda che tu debba inserire o aggiornare i dati. Php dispone di un set di funzioni per interagire con MySql, qui trovi la documentazione:
http://www.php.net/manual/en/ref.mysql.php

Inizia da mysql_connect, che serve a stabilire una connessione col db.
http://www.php.net/manual/en/function.mysql-connect.php
Lì trovi anche degli esempi.

Poi, per inviare il comando SQL al database usa l'apposita funzione mysql_query.
http://www.php.net/manual/en/function.mysql-query.php

Alcuni appunti:
  • Passa la tua variabile $sss come argomento alla funzione mysql_real_escape_string, in modo che eventuali caratteri "speciali" presenti nel file non causino errori di sintassi nel comando SQL
  • Quanto è grande il file? Se è più grande del valore della variabile server max_allowed_packet, si verificherà un errore. Il predefinito è 1 megabyte.
  • Anziché leggere il file con fread, potresti delegare questo compito direttamente a mysql, usando la sua funzione LOAD_FILE. Sarebbe più semplice ma è necessario che l'utente col quale ti colleghi a MySql abbia il privilegio FILE, e soprattutto sia il file che il database devono trovarsi sullo stesso server.


ciao
Modificato da BrightSoul il 27 dicembre 2011 19.18 -

Enjoy learning and just keep making
19 messaggi dal 19 dicembre 2011
io l'ho pensata così...
dimmi cosa ne pensi

//connessione al DB
<?php require_once('Connections/leggi_txt.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>

<body>

<?php 
$file=file_exists("siga.txt");
  if($file==true)
    {
     $file=fopen("siga.txt","a+");
     //$array = file("siga.txt");
     //$max = count($array);
    }
  else
    {
      echo "file non trovato!";
    }
//echo $max;
//$i = 0;
while(! feof($file))
{
   $marca = fgets($file); //fgets legge una riga alla volta dal file e si posiziona alla prox
    $catrame =fgets($file);
    $nicotina =fgets($file);
    $monossido =fgets($file);
  
  //qui preparo l'inserimento al DB 
    $query = "INSERT INTO sigarette (id, marca, catrame, nicotina, monossido) ";
    $query .="  VALUES (null, '$marca', $catrame,$nicotina,$monossido)"; 

$result = mysql_query($query); 

// Controllo che sia andato tutto ok
  if (!$result) 
    {
       $message  = 'Invalid query: ' . mysql_error() . "\n";
       $message .= 'Whole query: ' . $query;
       die($message);
     }
  }
  
/*
$leggi=fread($file,filesize("siga.txt"));
$sss=nl2br($leggi);
echo $sss;*/
?>
</body>
</html>

Modificato da Rare il 28 dicembre 2011 14.13 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ok, non vedo l'istruzione mysql_connect ma penso che tu l'abbia messa dentro il file incluso Connections/leggi_txt.php.

Farei una modifica su questa linea:
//$marca = fgets($file);
$marca = mysql_real_escape_string(fgets($file));
Infatti, se $marca contenesse un apice ' ti creerebbe problemi nella query dato che l'apice è già usato come delimitatore di stringa.

Altra considerazione: se i file di testo vengono scritti dall'utente, allora sarebbe il caso di usare mysql_real_escape_string anche sulle altri variabili $catrame, $nicotina e $monossido perché non dovresti mai dare per scontato che i dati che arrivano "da fuori" siano validi. Se hai l'assoluta certezza che quei tre valori siano dei numeri, allora può andar bene così, anche se usare mysql_real_escape_string male non gli fa.

ciao,

Enjoy learning and just keep making
19 messaggi dal 19 dicembre 2011
non va'....

ti posto il nuovo codice e anche la connessione...

connessione
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_leggi_txt = "localhost";
$database_leggi_txt = "leggi_txr";
$username_leggi_txt = "root";
$password_leggi_txt = "";
$leggi_txt = mysql_pconnect($hostname_leggi_txt, $username_leggi_txt, $password_leggi_txt) or trigger_error(mysql_error(),E_USER_ERROR); 
?>


codice
<?php require_once('Connections/leggi_txt.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>

<body>

<?php 
$file=file_exists("siga.txt");
  if($file==true)
    {
     $file=fopen("siga.txt","a+");
     //$array = file("siga.txt");
     //$max = count($array);
    }
  else
    {
      echo "file non trovato!";
    }
//echo $max;
//$i = 0;
while(! feof($file))
{
   $marca = mysql_real_escape_string(fgets($file)); //fgets legge una riga alla volta dal file e si posiziona alla prox
    $catrame =mysql_real_escape_string(fgets($file));
    $nicotina =mysql_real_escape_string(fgets($file));
    $monossido =mysql_real_escape_string(fgets($file));
  
  //qui prepari l'inserimento al DB 
    $query = "INSERT INTO sigarette (id, marca, catrame, nicotina, monossido)";
    $query .="VALUES (NULL, '$marca', $catrame, $nicotina, $monossido)"; 

$result = mysql_query($query); 

// Controlli che sia andato tutto ok
  if (!$result) 
    {
       $message  = 'Invalid query: ' . mysql_error() . "\n";
       $message .= 'Whole query: ' . $query;
       die($message);
     }
  }  
/*
$leggi=fread($file,filesize("siga.txt"));
$sss=nl2br($leggi);
echo $sss;*/
?>
</body>
</html>


ho aggiunto solamente mysql_real_escape_string a tutte le istruzioni...

rimane l'errore:
Invalid query: No database selected Whole query: INSERT INTO sigarette (id, marca, catrame, nicotina, monossido)VALUES (NULL, 'BARI\r\n', 8,00\r\n, 0,60\r\n, 7,00\r\n)
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
Rare ha scritto:
Invalid query: No database selected


ok, dopo la connessione bisogna indicare il nome del database con cui vai a lavorare e questo lo puoi fare con la funzione mysql_select_db.

//mi connetto
$leggi_txt = mysql_pconnect($hostname_leggi_txt, $username_leggi_txt, $password_leggi_txt) or trigger_error(mysql_error(),E_USER_ERROR);
//e poi seleziono il db con cui voglio lavorare
mysql_select_db($database_leggi_txt);

A proposito, fai attenzione con mysql_pconnect perché creerà una connessione "persistente" al db. Se non invochi mysql_close prima della fine dello script, la connessione rimarrà aperta. E' opportuno chiuderla sempre e subito, nonappena si finisce di usarla. In fondo al tuo file php metti:
<?php 
mysql_close();
?>


A parte questo, la query ha altri due problemini che si risolvono subito:
  • la funzione fgets ha letto anche i caratteri di a capo, infatti guarda i valori che sta provando ad inserire:
    VALUES (NULL, 'BARI\r\n', 8,00\r\n, 0,60\r\n, 7,00\r\n)
    Ci sono vari \r\n che sono i due caratteri di a capo usati da windows. Questi caratteri ovviamente vanno rimossi e la funzione trim si occupa proprio di fare questo.
    $marca = mysql_real_escape_string(trim(fgets($file)));
    $catrame = mysql_real_escape_string(trim(fgets($file)));
    $nicotina = mysql_real_escape_string(trim(fgets($file)));
    $monossido = mysql_real_escape_string(trim(fgets($file)));  
    
  • L'altro problema è il separatore dei decimali. Nel tuo file il separatore usato è la virgola infatti i valori che stai provando ad inserire sono: 8,00 0,60 e 7,00. MySql invece si aspetta che il separatore sia il punto. Ti basta fare un replace.
    $marca = mysql_real_escape_string(trim(fgets($file)));
    $catrame = mysql_real_escape_string(trim(str_replace(",", ".", fgets($file))));
    $nicotina = mysql_real_escape_string(trim(str_replace(",", ".", fgets($file))));
    $monossido = mysql_real_escape_string(trim(str_replace(",", ".", fgets($file))));  
    


Così dovrebbe andare...

ciao
Modificato da BrightSoul il 29 dicembre 2011 14.22 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.