Da Xml a Mysql

PHP:
			/* Script per creare le tabelle una volta create cancellare il codice ! */
			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'CREATE TABLE IF NOT EXISTS location (
															ID int(255) unsigned not null primary key auto_increment,
															location varchar(255) not null
			)';
			$result = mysql_query($query);
			
			$query = 'CREATE TABLE IF NOT EXISTS metalocation (
															location int(255) unsigned not null primary key,
															nome varchar(255) not null,
															icon int(2) unsigned not null,
															data tinytext not null,
															gradi tinytext not null,
															simbolo tinytext not null,
															descrizione text not null
			)';
			$result = mysql_query($query);
			
			
			mysql_close();
			
			mysql_free_result($result);
 
PHP:
			/* Script per creare le tabelle una volta create cancellare il codice ! */
			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'CREATE TABLE IF NOT EXISTS location (
															ID int(255) unsigned not null primary key auto_increment,
															location varchar(255) not null
			)';
			$result = mysql_query($query);
			
			$query = 'CREATE TABLE IF NOT EXISTS metalocation (
															location int(255) unsigned not null primary key,
															nome varchar(255) not null,
															icon int(2) unsigned not null,
															data tinytext not null,
															gradi tinytext not null,
															simbolo tinytext not null,
															descrizione text not null
			)';
			$result = mysql_query($query);
			
			
			mysql_close();
			
			mysql_free_result($result);


questo è lo script che crea le tabelle giusto? :)

poi dovrei usare l'altro per popolarle
 
Certo pero ti ri posto il codice dato ce cera un errore. In Free Result e poi avevo messo il segno del Dollato dive non doveva andare un altra cosa o messo ( descrizione invece che description )
PHP:
			/* Script per inserire i valore nel DB */
			$xml = simplexml_load_file( 'percorso/file.xml' );
			
			$city = $xml->location->attributes()->city;
			$var = $xml->location->var;

			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'INSERT INTO location ( location ) VALUES ( "'.$city.'" )';
			$result = mysql_query($query);
			
			$query = 'SELECT ID FROM location WHERE location="'.$city.'"';
			$result = mysql_query($query);
			
			$obj = mysql_fetch_object($result);
			
			$id = $obj -> ID;
			
			mysql_close();
			
			mysql_free_result($result);


			foreach ( $var as $value ) {
					
				$name = $value->name;
				$icon = $value->icon;
				$data = $value->data;
				$data_sequence = '';
				$simbolo = '';
				$gradi = '';
				$desc = '';
				
				foreach ( $data as $value ) {
					
					$data_sequence .= $value->forecast[0]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[1]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[2]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[3]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[4]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[5]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[6]->attributes()->data_sequence;

					$simbolo .= $value->forecast[0]->attributes()->id.'::';
					$simbolo .= $value->forecast[1]->attributes()->id.'::';
					$simbolo .= $value->forecast[2]->attributes()->id.'::';
					$simbolo .= $value->forecast[3]->attributes()->id.'::';
					$simbolo .= $value->forecast[4]->attributes()->id.'::';
					$simbolo .= $value->forecast[5]->attributes()->id.'::';
					$simbolo .= $value->forecast[6]->attributes()->id;
					
					if( $name == 'Temperatura minima' || $name == 'Temperatura massima' ){
						
						$gradi .= $value->forecast[0]->attributes()->value.'::';
						$gradi .= $value->forecast[1]->attributes()->value.'::';
						$gradi .= $value->forecast[2]->attributes()->value.'::';
						$gradi .= $value->forecast[3]->attributes()->value.'::';
						$gradi .= $value->forecast[4]->attributes()->value.'::';
						$gradi .= $value->forecast[5]->attributes()->value.'::';
						$gradi .= $value->forecast[6]->attributes()->value;
						
					}else{
						
						$desc .= $value->forecast[0]->attributes()->value.'::';
						$desc .= $value->forecast[1]->attributes()->value.'::';
						$desc .= $value->forecast[2]->attributes()->value.'::';
						$desc .= $value->forecast[3]->attributes()->value.'::';
						$desc .= $value->forecast[4]->attributes()->value.'::';
						$desc .= $value->forecast[5]->attributes()->value.'::';
						$desc .= $value->forecast[6]->attributes()->value;
						
					}
										
				}
				
				mysql_connect( '', '', '' );
				mysql_select_db('');
				
				$query = 'INSERT INTO metalocation ( location, nome, icon, data, gradi, simbolo, descrizione) VALUES ( "'.$id.'", "'.$name.'", "'.$icon.'", "'.$data_sequence.'", "'.$gradi.'", "'.$simbolo.'", "'.$desc.'" )';
				
				$result = mysql_query($query);
				mysql_close();

			}
 
Perfetto l'ultimo script che hai creato genera le due tabelle

location
metealocation



genera però un errore

arning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /web/htdocs/www. on line 26



però le crea :)
 
Perfetto l'ultimo script che hai creato genera le due tabelle

location
metealocation



genera però un errore

arning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /web/htdocs/www. on line 26



però le crea :)
Non fa niente togli il free_result cmq dopo che hai creato le tabelle quel codice lo devi cancella non fara ninte di grave ma ti rallenta il caricamento della pagina
 
Funziona :D

carica i nomi delle città!

solo una cosa ho notato, i valori non li sovrascrive, praticamente se inserisco l'xml di roma, ogni volta che aggiorno la pagina per caricare i dati, mi crea sempre nuovi nomi della stessa città.

ecco un esempio

Cattura.JPG
 
No quei dati non vanno sovrascritti ma aggiunti ogni città ha un id che poi tramite l id ti ricavi i valori in metalocation solo quelli vanno aggiornati.
 
Prova cosi per quando riguarda la tabella location. Be tu vuoi fare tutto con un solo script ! dovrò modificare qualcosa giusto per precisare in metalocation i dati si devono aggiornare o vuoi che s inseriscano ogni volta ???
PHP:
			/* Script per inserire i valore nel DB */
			$xml = simplexml_load_file( 'percorso/file.xml' );
			
			$city = $xml->location->attributes()->city;
			$var = $xml->location->var;

			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'SELECT location FROM location WHERE location="'.$city.'"';
			$result = mysql_query($query);
			
			if( mysql_num_rows($result) == 0 ){
			
				$query = 'INSERT INTO location ( location ) VALUES ( "'.$city.'" )';
				$result = mysql_query($query);
			
			}
				$query = 'SELECT ID FROM location WHERE location="'.$city.'"';
				$result = mysql_query($query);
				
				$obj = mysql_fetch_object($result);
				
				$id = $obj -> ID;

			mysql_close();
			
			mysql_free_result($result);
 
Prova cosi per quando riguarda la tabella location. Be tu vuoi fare tutto con un solo script ! dovrò modificare qualcosa giusto per precisare in metalocation i dati si devono aggiornare o vuoi che s inseriscano ogni volta ???
PHP:
			/* Script per inserire i valore nel DB */
			$xml = simplexml_load_file( 'percorso/file.xml' );
			
			$city = $xml->location->attributes()->city;
			$var = $xml->location->var;

			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'SELECT location FROM location WHERE location="'.$city.'"';
			$result = mysql_query($query);
			
			if( mysql_num_rows($result) == 0 ){
			
				$query = 'INSERT INTO location ( location ) VALUES ( "'.$city.'" )';
				$result = mysql_query($query);
			
			}
				$query = 'SELECT ID FROM location WHERE location="'.$city.'"';
				$result = mysql_query($query);
				
				$obj = mysql_fetch_object($result);
				
				$id = $obj -> ID;

			mysql_close();
			
			mysql_free_result($result);



Allora ti spiego, l'xml meteo si aggiorna una volta al giorno (da solo sul sito sorgente), quindi ogni volta che quel sito aggiorna le previsioni si aggiornano gli xml

Io tramite un operazione pianificata lancerò il file per caricare i vari xml delle città nel db :)

Vedendo che nella tabella location si creano doppioni non saprei se si tratta sempre degli stessi dati, tieni presente che ogni giorno i dati meteo variano (mentre il nome ovviamente delle città resta uguale)


lo so è complesso come ragionamento
 
Quindi vuoi che si aggiornano i dati
PHP:
			/* Script per inserire i valore nel DB */
			$xml = simplexml_load_file( 'percorso/file.xml' );
			
			$city = $xml->location->attributes()->city;
			$var = $xml->location->var;

			mysql_connect( '', '', '' );
			mysql_select_db('');
			
			$query = 'SELECT location FROM location WHERE location="'.$city.'"';
			$result = mysql_query($query);
			
			if( mysql_num_rows($result) == 0 ){
			
				$query = 'INSERT INTO location ( location ) VALUES ( "'.$city.'" )';
				$result = mysql_query($query);

			}

			$query = 'SELECT ID FROM location WHERE location="'.$city.'"';
			$result = mysql_query($query);
			
			$obj = mysql_fetch_object($result);
			
			$id = $obj -> ID;
				
			mysql_close();
			
			mysql_free_result($result);

			foreach ( $var as $value ) {
					
				$name = $value->name;
				$icon = $value->icon;
				$data = $value->data;
				$data_sequence = '';
				$simbolo = '';
				$gradi = '';
				$desc = '';
				
				foreach ( $data as $value ) {
					
					$data_sequence .= $value->forecast[0]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[1]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[2]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[3]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[4]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[5]->attributes()->data_sequence.'::';
					$data_sequence .= $value->forecast[6]->attributes()->data_sequence;

					$simbolo .= $value->forecast[0]->attributes()->id.'::';
					$simbolo .= $value->forecast[1]->attributes()->id.'::';
					$simbolo .= $value->forecast[2]->attributes()->id.'::';
					$simbolo .= $value->forecast[3]->attributes()->id.'::';
					$simbolo .= $value->forecast[4]->attributes()->id.'::';
					$simbolo .= $value->forecast[5]->attributes()->id.'::';
					$simbolo .= $value->forecast[6]->attributes()->id;
					
					if( $name == 'Temperatura minima' || $name == 'Temperatura massima' ){
						
						$gradi .= $value->forecast[0]->attributes()->value.'::';
						$gradi .= $value->forecast[1]->attributes()->value.'::';
						$gradi .= $value->forecast[2]->attributes()->value.'::';
						$gradi .= $value->forecast[3]->attributes()->value.'::';
						$gradi .= $value->forecast[4]->attributes()->value.'::';
						$gradi .= $value->forecast[5]->attributes()->value.'::';
						$gradi .= $value->forecast[6]->attributes()->value;
						
					}else{
						
						$desc .= $value->forecast[0]->attributes()->value.'::';
						$desc .= $value->forecast[1]->attributes()->value.'::';
						$desc .= $value->forecast[2]->attributes()->value.'::';
						$desc .= $value->forecast[3]->attributes()->value.'::';
						$desc .= $value->forecast[4]->attributes()->value.'::';
						$desc .= $value->forecast[5]->attributes()->value.'::';
						$desc .= $value->forecast[6]->attributes()->value;
						
					}
										
				}
				
				mysql_connect( '', '', '' );
				mysql_select_db('');
				
				$query = 'SELECT location FROM metalocation WHERE location="'.$id.'"';
				$result = mysql_query($query);
				
				if( mysql_num_rows($result) == 0 ){
				
					$query = 'INSERT INTO metalocation ( location, nome, icon, data, gradi, simbolo, descrizione ) VALUES ( "'.$id.'", "'.$name.'", "'.$icon.'", "'.$data_sequence.'", "'.$gradi.'", "'.$simbolo.'", "'.$desc.'" )';
					$result = mysql_query($query);
				
				}else{
					
					$query = 'UPDATE metalocation SET nome="'.$name.'", icon="'.$icon.'", data="'.$data_sequence.'", gradi="'.$gradi.'", simbolo="'.$simbolo.'", descrizione="'.$desc.'" WHERE location="'.$id.'"';
					$result = mysql_query($query);
					
				}
				
				mysql_close();

			}
Ti spiego cosa fa, se una città non esiste nel db inserisce i valori nel db altrimenti se esistono li aggiorna prova se cosi va !
 
Sei un grande non si doppiano +! praticamente credo che i dati si vengono sovrascritti :)


ora ti posto il contenuto di metelocation per vedere se carica i dati
 
Ottimo, allora nella cartella location il nome si sovrascrive, quindi non si duplica +


Ho fatto un dump della tabella "metalocation"


CREATE TABLE IF NOT EXISTS `metalocation` (
`location` int(255) unsigned NOT NULL,
`nome` varchar(255) NOT NULL,
`icon` int(2) unsigned NOT NULL,
`data` tinytext NOT NULL,
`gradi` tinytext NOT NULL,
`simbolo` tinytext NOT NULL,
`descrizione` text NOT NULL,
PRIMARY KEY (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dump dei dati per la tabella `metalocation`
--

INSERT INTO `metalocation` (`location`, `nome`, `icon`, `data`, `gradi`, `simbolo`, `descrizione`) VALUES
(1, 'Definizione di Atmosphere', 19, '1::2::3::4::5::6::7', '', '::::::::::::', 'Durante todo el dÃÂ*a cielos despejados::Durante todo el dÃÂ*a cielos despejados::Durante todo el dÃÂ*a cielos despejados::Durante la primera mitad del dÃÂ*a cielos despejados tendiendo en la segunda mitad del dÃÂ*a a intervalos nubosos::Durante la primera mitad del dÃÂ*a cielos nubosos con lluvias moderadas tendiendo en la segunda mitad del dÃÂ*a a cielos nubosos con lluvias débiles::Durante la primera mitad del dÃÂ*a intervalos nubosos con lluvias débiles tendiendo en la segunda mitad del dÃÂ*a a cielos despejados::Durante la primera mitad del dÃÂ*a cielos despejados tendiendo en la segunda mitad del dÃÂ*a a cielos cubiertos');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


praticamente la descrizione possiamo anche eliminarla tanto non mi serve :)
 
PHP:
allora devi togliere la variabile

$desc = ''

Poi devi rogliere l else nel foreach e rimanere solo

                    if( $name == 'Temperatura minima' || $name == 'Temperatura massima' ){ 
                         
                        $gradi .= $value->forecast[0]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[1]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[2]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[3]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[4]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[5]->attributes()->value.'::'; 
                        $gradi .= $value->forecast[6]->attributes()->value; 
                         
                    }

Poi devi togliere i valori nelle query riguardo la descrizione
 
ecco il dump

CREATE TABLE IF NOT EXISTS `metalocation` (
`location` int(255) unsigned NOT NULL,
`nome` varchar(255) NOT NULL,
`icon` int(2) unsigned NOT NULL,
`data` tinytext NOT NULL,
`gradi` tinytext NOT NULL,
`simbolo` tinytext NOT NULL,
`descrizione` text NOT NULL,
PRIMARY KEY (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dump dei dati per la tabella `metalocation`
--

INSERT INTO `metalocation` (`location`, `nome`, `icon`, `data`, `gradi`, `simbolo`, `descrizione`) VALUES
(1, 'Definizione di Atmosphere', 19, '1::2::3::4::5::6::7', '', '::::::::::::', '-3::-7::-5::-6::2::3::37::7::6::5::7::7::10Vento moderato dal nord::Vento moderato dal nord::Vento moderato dal nord::Vento moderato dal nord::Vento debole dal est::Vento debole da nord-est::Vento moderato dal nordPoco nuvoloso::Poco nuvoloso::Poco nuvoloso::Nubi sparse::Cielo coperto con pioggia moderate::Cielo nuvoloso con pioggia debole::Intervalli di nuvole con pioggie deboleGiovedi::Venerdì::Sabato::Domenica::Lunedi::Martedì::MercoledìDurante todo el dÃÂ*a cielos despejados::Durante todo el dÃÂ*a cielos despejados::Durante todo el dÃÂ*a cielos despejados::Durante la primera mitad del dÃÂ*a cielos despejados tendiendo en la segunda mitad del dÃÂ*a a intervalos nubosos::Durante la primera mitad del dÃÂ*a cielos nubosos con lluvias moderadas tendiendo en la segunda mitad del dÃÂ*a a cielos nubosos con lluvias débiles::Durante la primera mitad del dÃÂ*a intervalos nubosos con lluvias débiles tendiendo en la segunda mitad del dÃÂ*a a cielos despejados::Durante la primera mitad del dÃÂ*a cielos despejados tendiendo en la segunda mitad del dÃÂ*a a cielos cubiertos');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 
Penso che ci siamo :)


ora viene una parte che non so fare, richiamare con le librerie gd i valori su una mappa

cioè so usare le librerie gd, ma non so leggere i contenuti dal db
 
Per i simboli la procedura è semplice

i valori del xml vanno da 1 a 19

bisognerebbe fare queste associazioni:

if ($Symbol == "1") {echo $variabile = imageCreateFromPng('sole.png');}
if ($Symbol == "2") {echo $variabile = imageCreateFromPng('pocovuloso.png');

fino a raggiungere il 19 esimo simbolo :)

$Symbol deve ovviante essere letto nel mysql


speriamo sia così
 
tuttavia nella tabella metalocation bisogna fare alcune correzioni poichè i valori non sono corretti
 
Ti posto meglio la spiegazione dell'xml

<name>Simbolo</name>
<icon>10</icon>
<data>
<forecast data_sequence="1" id="2" value="Poco nuvoloso"/>
<forecast data_sequence="2" id="2" value="Poco nuvoloso"/>
<forecast data_sequence="3" id="2" value="Poco nuvoloso"/>
<forecast data_sequence="4" id="3" value="Nubi sparse"/>
<forecast data_sequence="5" id="10" value="Cielo coperto con pioggia moderate"/>
<forecast data_sequence="6" id="6" value="Cielo nuvoloso con pioggia debole"/>
<forecast data_sequence="7" id="5" value="Intervalli di nuvole con pioggie debole"/>
</data>


Praticamente il dato che deve essere importato nel mysql è id=2 ecc ecc

non deve importare la descrizione, poichè la libreria gd per richiamare il simbolo si baserà sul valore dell'ID

id=2 sta per sole, noi assoceremo un icona che chiameremo 2.png


e così via
 

Discussioni simili