2010-10-24 6 views
1

On m'a demandé d'analyser un fichier simple qui est stocké sous forme de fichier XML, les données doivent alors être sauvegardées dans un mysql.Analyser XML avec php et l'enregistrer dans mysql

Cependant, je n'ai absolument aucune idée de ce qu'il faut faire et après avoir regardé en ligne tous les exemples donnés semblent trop compliqués pour mon problème ou pas la bonne solution. Le fichier XML ressemble à ce

games_scores.xml

<gesmes:Letter> 
<gesmes:subject>Reference Scores</gesmes:subject> 
- 
<gesmes:Sender> 
<gesmes:name>Game Information Scores</gesmes:name> 
</gesmes:Sender> 
- 
<Cube> 
- 
<Cube time="2010-10-13"> 
<Cube scores="GameA1" value="1.5803"/> 
<Cube scores="GameA2" value="21.35"/> 
............etc 
<Cube scores="GameA15" value="135"/> 
</Cube> 
</Cube> 
</gesmes:Letter> 

alors je dois sauver à mysql existant, c'est semble

CREATE TABLE IF NOT EXISTS `scrore_table` (
    `scrore_id` int(11) NOT NULL auto_increment, 
    `scrore_title` varchar(32) collate utf8_bin NOT NULL default '', 
    `scores` varchar(15) collate utf8_bin NOT NULL default '', 
    `decimal_place` char(1) collate utf8_bin NOT NULL, 
    `value` float(15,8) NOT NULL, 
    `date_updated` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`currency_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; ; 

INSERT INTO `scrore_table` (`scrore_id`, `scrore_title`, `scores`, `decimal_place`, `value`, `date_updated`) VALUES 
(1, 'Game Class A0', 'GameA0', '2', 1.00000000, '2010-04-06 22:00:54'), 
(2, 'Game Class A1', 'GameA1', '2', 1.58030000, '2010-04-06 22:00:54'), 
(3, 'Game Class A2', 'GameA2', '2', 21.3503000, '2010-04-06 22:00:54'), 
..............................etc 
(15, 'Game Class A15', 'GameA15', '2', 135, '2010-04-06 22:00:54'); 

directions à cette question que j'ai script php en suivant:

<?php 
class Scores_Converter { 
    var $xml_file = "http://192.168.1.112/gamescores/games_scores.xml"; 
    var $mysql_host, $mysql_user, $mysql_pass, $mysql_db, $mysql_table; 
    var $scores_values = array(); 

    //Load convertion scores 
    function Scores_Converter($host,$user,$pass,$db,$tb) { 
     $this->mysql_host = $host; 
     $this->mysql_user = $user; 
     $this->mysql_pass = $pass; 
     $this->mysql_db = $db; 
     $this->mysql_table = $tb; 

     $this->checkLastUpdated(); 

     $conn = mysql_connect($this->mysql_host,$this->mysql_user,$this->mysql_pass); 
     $rs = mysql_select_db($this->mysql_db,$conn); 
     $sql = "SELECT * FROM ".$this->mysql_table; 
     $rs = mysql_query($sql,$conn); 
     while($row = mysql_fetch_array($rs)) { 
     $this->scores_values[$row['scores']] = $row['value'];   
     } 
    } 

    /* Perform the actual conversion, defaults to 1.00 GameA1 to GameA3 */ 
    function convert($amount=1,$from="GameA1",$to="GameA3",$decimals=2) {  return(number_format(($amount/$this->scores_values[$from])*$this->scores_values[$to],$decimals)); 
    } 

    /* Check to see how long since the data was last updated */ 
    function checkLastUpdated() { 
     $conn = mysql_connect($this->mysql_host,$this->mysql_user,$this->mysql_pass); 

     $rs = mysql_select_db($this->mysql_db,$conn); 
     $sql = "SHOW TABLE STATUS FROM ".$this->mysql_db." LIKE '".$this->mysql_table."'"; 
     $rs = mysql_query($sql,$conn); 

     if(mysql_num_rows($rs) == 0) { 
     $this->createTable(); 
     } else { 
     $row = mysql_fetch_array($rs); 
     if(time() > (strtotime($row["Update_time"])+(12*60*60))) { 
      $this->downloadValueScores();   
     } 
     } 
    } 

    /* Download xml file, extract exchange values and save the values in database */ 
    function downloadValueScores() { 
     $scores_domain = substr($this->xml_file,0,strpos($this->xml_file,"/")); 
     $scores_file = substr($this->xml_file,strpos($this->xml_file,"/")); 
     $fp = @fsockopen($scores_domain, 80, $errno, $errstr, 10); 
     if($fp) { 
     $out = "GET ".$scores_file." HTTP/1.1\r\n"; 
     $out .= "Host: ".$scores_domain."\r\n"; 
     $out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5\r\n"; 
     $out .= "Connection: Close\r\n\r\n"; 
     fwrite($fp, $out); 
     while (!feof($fp)) { 
      $buffer .= fgets($fp, 128); 
     } 
     fclose($fp); 

     $pattern = "{<Cube\s*scores='(\w*)'\s*value='([\d\.]*)'/>}is"; 
     preg_match_all($pattern,$buffer,$xml_values); 
     array_shift($xml_values); 

     for($i=0;$i<count($xml_values[0]);$i++) { 
      $exchange_value[$xml_values[0][$i]] = $xml_values[1][$i]; 
     } 

     $conn = mysql_connect($this->mysql_host,$this->mysql_user,$this->mysql_pass); 
     $rs = mysql_select_db($this->mysql_db,$conn); 

     foreach($exchange_value as $scores=>$value) { 
      if((is_numeric($value)) && ($value != 0)) { 
       $sql = "SELECT * FROM ".$this->mysql_table." WHERE scores='".$scores."'"; 
       $rs = mysql_query($sql,$conn) or die(mysql_error()); 
       if(mysql_num_rows($rs) > 0) { 
        $sql = "UPDATE ".$this->mysql_table." SET value=".$value." WHERE scores='".$scores."'"; 
       } else { 
        $sql = "INSERT INTO ".$this->mysql_table." VALUES('".$scores."',".$value.")"; 
       } 
       $rs = mysql_query($sql,$conn) or die(mysql_error()); 
      } 
     } 
     } 
    } 

    /* Create the scores table */ 
    function createTable() { 
     $conn = mysql_connect($this->mysql_host,$this->mysql_user,$this->mysql_pass); 
     $rs = mysql_select_db($this->mysql_db,$conn); 
     $sql = "CREATE TABLE ".$this->mysql_table." (`scrore_id` int(11) NOT NULL, `scrore_title` varchar(32) collate utf8_bin NOT NULL default '', `scrores` char(12) NOT NULL default '', `decimal_place` char(1) collate utf8_bin NOT NULL default '2', `value` float(15,8) NOT NULL,`date_updated` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY(currency)) ENGINE=MyISAM"; 
     $rs = mysql_query($sql,$conn) or die(mysql_error()); 
     $sql = "INSERT INTO ".$this->mysql_table." VALUES(1,'','GameA0','2',1,now())"; 
     $rs = mysql_query($sql,$conn) or die(mysql_error()); 
     $this->downloadValueScores(); 
    } 
} 
?> 

puis avec ce script mysql table/requête créé ressembler à:

INSERT INTO `scrore_table` (`scrore_id`, `scrore_title`, `scrores`, `decimal_place`, `value`, `date_updated`) VALUES 
(1, 'Game Class A0', 'GameA0', '2', 1.00000000, '2010-10-24 00:27:01'); 

mais la base de données non Populate automatique, cela semble downloadValueScores fonction() fonctionnent pas correctement

J'ai essayé le fixer et je pense que c'est la direction que je dois aller mais je n'ai aucune idée. aussi je suis désolé, je suis nouveau à PHP.

Toute aide ou pointeurs seraient grands et merci beaucoup

+0

Le code semble être PHP4. Pouvez-vous utiliser PHP5 dans votre solution? – Gordon

+0

Salut Gordon, merci pour vos informations de version php. En fait, je ne sais pas si ce code est PHP4, parce que je ne connais pas le différent, pourriez-vous s'il vous plaît laissez-moi savoir à quoi ressemble PHP5 adapté à mon code? – user485783

Répondre

0

où est-ce que vous obtenez les informations, que la requête ressemble à ce que:

INSERT INTO `scrore_table` (`scrore_id`, `scrore_title`, `scrores`, `decimal_place`, `value`, `date_updated`) 
    VALUES (1, 'Game Class A0', 'GameA0', '2', 1.00000000, '2010-10-24 00:27:01'); 

?

Quand je regarde la fonction downLoadValueScores, la requête en ceci:

$sql = "INSERT INTO ".$this->mysql_table." VALUES('".$scores."',".$value.")"; 

... cela pour vous ne construira pas la requête ci-dessus, ce sera juste produire une erreur, parce que vous avez seulement 2 valeurs assignées pour une ligne à insérer dans une table avec 6 champs.

+0

Salut Dr. Molle, Vous avez absolument raison, j'ai une erreur: "Le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne 1" puis j'essaye de le réparer. – user485783

+0

en remplaçant: $ sql = "UPDATE". $ This-> mysql_table. "SET valeur =". $ Valeur. "WHERE scores = '". $ Scores. "'"; – user485783

+0

avec: $ sql = "UPDATE". $ This-> mysql_table. "SET valeur =". $ Valeur. ", Date_updated = 'now()' WHERE scores = '". $ Scores. "'"; – user485783

0

Molle, vous avez raison, génial.

maintenant scrore_id déjà incrémentation automatique,

histoire modifiée sont: à la fonction createTable() changement

$sql = "CREATE TABLE ".$this->mysql_table." (`scrore_id` int(11) NOT NULL, `scrore_title` varchar(32) collate utf8_bin NOT NULL default '', `scrores` char(12) NOT NULL default '', `decimal_place` char(1) collate utf8_bin NOT NULL default '2', `value` float(15,8) NOT NULL,`date_updated` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY(scrore_id)) ENGINE=MyISAM"; 

à

$sql = "CREATE TABLE ".$this->mysql_table." (`scrore_id` int(11) NOT NULL auto_increment, `scrore_title` varchar(32) collate utf8_bin NOT NULL default '', `scrores` char(12) NOT NULL default '', `decimal_place` char(1) collate utf8_bin NOT NULL default '2', `value` float(15,8) NOT NULL,`date_updated` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY(scrore_id)) ENGINE=MyISAM"; 

auto_increment devrait être ajouter après scrore_id` int (11) NOT NULL

puis pour downloadValueScores de fonction()

de changement:

$sql = "INSERT INTO ".$this->mysql_table." VALUES('NULL','','".$scores."','2',".$value.",now())"; 

à:

$sql = "INSERT INTO ".$this->mysql_table." VALUES(NULL,'','".$scores."','2',".$value.",now())"; 

le résultat de ma table/requête scrore_id incrémentation automatique et aussi Populate automatique.

En ce qui concerne scrore_title il ressemble à l'indicatif de pays 3 lettres et le nom du pays, par exemple.

if USA = 'United State' 
if GBR = 'Great Britain' 
if FRC = 'France' etc.. 

suite à ma question

if scrores = 'GameA0' then scrore_title = 'Game Class A0' 
if scrores = 'GameA1' then scrore_title = 'Game Class A1' 
if scrores = 'GameA2' then scrore_title = 'Game Class A2' 

en anothers mot se trouve scrores = 'GameA0' puis insérez le scrore_title = etc 'Game classe A0' ..

scrores déjà trouvé de games_scores.xml mais scrore_title je devrais penser à moi-même. Y at-il une idée de comment résoudre ce problème?

Un grand merci pour votre aide jusqu'à présent.