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

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
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 -
5.610 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,

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
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)
5.610 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 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!

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.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC