Problème Insertionflux xml

Résolu
cs_richardjul Messages postés 7 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 24 janvier 2008 - 23 janv. 2008 à 13:33
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 24 janv. 2008 à 16:33
Bonjour,
j'ai réalisé un script qui doit récupérer des annonces de job sur un flux xml, et me les injecter dans ma BDD Mysql pour ensuite les afficher sur notre site. Je fais des tests sur un serveurs de dev. et la tout se passe pour le mieux, les infos sont bien récupérées, et insérée dans la base comme il se doit.
Problème! dès que je met en prod. mon script sur l'hébergeur (Nexenservices), il se passe qqe chose d'étonnant, qqs uns des contenus des variables que je dois stocker se trouve couper, par exemple je dois stocker Luxembourg sur une annonce, et sur 10 au total dans le flux il va me couper la première lettre pour un "uxembourg" et les 2 premières pour une autre "embourg", alors que les 8 autres sont traitées normalement! le plus étonnant c que sur le dev. ça fonctionne très bien! Il me fait la même sur des ref que 'ai hyper besoin pour faire des tries et des tests.

J'ai fait des echo des valeurs que je veux insérer et ça donne ça :

En local :

369211
Ingénieurs Support Application Server H/F
Luxembourg
CSC Computer Sciences
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href= http://emploi.efinancialcareers.lu/job-4000000000356083.htm
efinancialcareers

369215
Ingénieurs Système Solarix et AIX H/F
Luxembourg
CSC Computer Sciences
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href =http://emploi.efinancialcareers.lu/job-4000000000356087.htm
efinancialcareers

369222
Database Specialists H/F
Luxembourg
CSC Computer Sciences
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href= http://emploi.efinancialcareers.lu/job-4000000000356094.htm
efinancialcareers

etc.......

et celui en ligne :
Le premier nickel :
369079
Database Specialists H/F
Luxembourg
CSC Computer Sciences
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href =http://emploi.efinancialcareers.lu/job-4000000000355951.htm
efinancialcareers

le second c ma ref qui est incomplète (elles font toujours 6caractères)

2008-01-05
9079
Responsable de gestion des applications H/F
Luxembourg
CSC Computer Sciences
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href= http://emploi.efinancialcareers.lu/job-4000000000355951.htm
efinancialcareers

et ça c deans les derniers, et tous ceux entre sont bien!!!
2007-11-05
351254
Chargé(e) de Missions Organisation (BPL)
embourg
N.C.
http://clk.atdmt.com/UMC/go/fnnseefc0060000127umc/direct/01/?href =http://emploi.efinancialcareers.lu/job-4000000000338084.htm
efinancialcareers

Comment puis-je faire pour régler ce problème ou je me prend la tête depuis plusieurs jours?

Mon script php :

<?php
mysql_connect("monhebergeur.com", "monlogin, "MDP") or die("Impossible de se connecter");
//mysql_connect("localhost", "root", "") or die("Impossible de se connecter");
mysql_select_db("farvest") or die("pas possible de trouver la base");

$file = "http://www.efinancialcareers.lu/syndication/Itone/eFCjobs.xml";
//$file = "eFCjobs.xml";
global $fournisseur;
$find_fournisseur = explode ("/", $file);
$fournisseur2 = $find_fournisseur[2];
$fournisseur1 = explode (".", $fournisseur2);
$fournisseur = $fournisseur1[1];

if(isset($file)) {
$titre = "";
$date = "";
$ref = "";
$lieu = "";
$entreprise = "";
$curtag = "";

/** fonction startElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function startElement($parser, $name, $attrs) {
global $curtag, $date, $titre, $lieu, $url, $entreprise, $ref ;
$curtag = $name;
if ($name "DATE") $date "";if ($name "TITRE") $titre "";if ($name "URL") $url "";if ($name "ENTREPRISE") $entreprise "";if ($name "ref") $ref "";if ($name "Lieu") $lieu "";
}

/** fonction endElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function endElement($parser, $name) {
global $curtag, $date, $titre, $lieu, $url, $entreprise, $ref, $fournisseur ;

$curtag = "";

if ($name == "LIEU") {

//Formatage des entrées pour la BDD
$date = addslashes($date);
$date2 = explode("/",$date);       
$date_finale = $date2[2]."-".$date2[1]."-".$date2[0];

$titre1 = addslashes($titre);
//$titre1=utf8_decode($titre);

$url1 = addslashes ($url);
//$url1=utf8_decode($url);

$entreprise1 = addslashes ($entreprise);
//$entreprise1=utf8_decode($entreprise);

$lieu1 = addslashes ($lieu);

//Affichage des entrées titre et entreprise enregistré dans la base
echo $date_finale;
echo "
";
echo " ".$ref." ";
echo "
";
echo $titre1;
echo "
";
echo $lieu1;
echo "
";
echo $entreprise1;
echo "
";
echo $url1;
echo "
";
echo $fournisseur;
echo "

";

// on regarde si la ref existe déjà
$req_ref = "SELECT ref_xml FROM itone_jl_jobposting WHERE ref_xml= '$ref'";
$rech_ref = mysql_query($req_ref) or die('Erreur SQL !'.$req_ref.'
'.mysql_error());

//on selectionne la ref la plus petite
$req_ref_min = "SELECT Min(ref_xml) AS RefMin FROM itone_jl_jobposting";
$rech_ref_min = mysql_query($req_ref_min) or die('Erreur SQL !'.$req_ref_min.'
'.mysql_error());
$res_ref_min = mysql_fetch_array($rech_ref_min);
$ref_min = $res_ref_min["RefMin"];

//Mise à jour des fournisseurs existants
$itone = ITOne;
$req_ref_maj = "UPDATE itone_jl_jobposting SET fournisseur_flux='$itone' WHERE fournisseur_flux=''";
$req_maj_query = mysql_query($req_ref_maj) or die('Erreur SQL ! '.$req_ref_maj.'
'.mysql_error());

//echo " ".$fournisseur." ";

//Si la nouvelle ref est plus grande que les dernières on l'insere
if($ref > $ref_min && (strlen($ref))> =6)
    {
    echo "Plus grand que la plus petite, et ref supérieur à 6";
    // on compte le nombre de résultats
    $nb_ref = mysql_num_rows($rech_ref);
    if($nb_ref==0)  // la ref n'existe pas, on l'insere
        {     //echo " Plus grand que la plus petite, et ref supérieur à 6, INSEREE
";
           /$query = "INSERT INTO itone_jl_jobposting(created,title,location,URL_flux,company,ref_xml,fournisseur_flux) VALUES('".$date_finale."','".$titre1."','".$lieu1."','".$url1."','".$entreprise1."','".$ref."','".$fournisseur."')";
            $result = mysql_query($query) or die('Erreur SQL !'.$query.'
'.mysql_error());
        }
    }
}
}

/** fonction characterData, déclenchée lorsque le parseur rencontre des caractères, à l'intérieur d'un noeud XML **/
function characterData($parser, $data) {
global $curtag, $date, $titre, $lieu, $url, $entreprise, $ref, $tab_ref, $last_ref ;
if ($curtag == "DATE")
$date .= $data;
//echo $date;
if ($curtag == "TITRE")
$titre .= $data;
//echo $url;
if ($curtag == "LIEU")
$lieu = $data;
//echo $lieu;
if ($curtag == "URL")
$url .= $data;
//echo $titre;
if ($curtag == "ENTREPRISE")
$entreprise .= $data;
//echo $entreprise;
if ($curtag == "REF"){
$ref = $data;

}
}

/** crée un nouveau parseur **/
$xml_parser = xml_parser_create();

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

/** enregistre les trois fonctions ci dessus **/
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("Impossible d'ouvrir l'URL...");
}

while ($data = fread($fp, 50)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("erreur XML: %s à la ligne %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
mysql_close();

}

?>

MERCI tout plein si qq'un a la solution... THANKS

PS: je ne suis pas encore un boss en dev mais j'espère le devenir!

Julien RICHARD
Developpeur
Groupe AXORYS

8 réponses

codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
24 janv. 2008 à 16:33
Content pour toi que ca marche :)

Tu veux bien valider ta derniere réponse histoire d'indiquer que c'est bon ? merci à toi :)
3
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
23 janv. 2008 à 13:58
Tu utilise quelles versions de Php en prod et distrib ?

Tu devrait utiliser simple_xml, c'est plus facile de traiter du xml avec ca :
http://fr.php.net/simple_xml
0
cs_richardjul Messages postés 7 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 24 janvier 2008
24 janv. 2008 à 09:43
Salut codefalse,
sur mon dev : PHP Version 5.2.1

et online ils nexen est sur PHP Version 4.4.7-0.nexen.0,
Je sais pas trop pourquoi il y a .nexen.0...

Sinon je ne sais pas si il y a un rapport mais il y a la même libXML Version 2.6.27...

Ce serait dommage que je ne puisse pas trouver une petite astuce pour l'utiliser, quelle serait le moyen de l'adapter pour php4?
Quelle partie du code PHP5 interpreterait-il mieux ?

Je vais regarder simple_xml, je te remercie codefalse..

Julien RICHARD
Adjoint Multimedia
Groupe AXORYS
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
24 janv. 2008 à 10:56
Je suppose que .nexen.0 signifie qu'ils ont fait des modifications sur le code php pour l'adapter à leur usage, voila pourquoi.
Peut-être que dans ton usage, tu utilise des fonctions faite à partir de php5 (ou implémentant des propriété mise à partir de php5) ce qui peux causer ce bogue. Vu que chez toi ca marche et pas chez eux !

Fait attention aux fonctions que tu utilise ! :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_richardjul Messages postés 7 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 24 janvier 2008
24 janv. 2008 à 11:16
Ok merci pour tes réponses,
je vais reprendre mon code en tenant compte des différences de versions...

thanks.

Julien RICHARD
0
cs_richardjul Messages postés 7 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 24 janvier 2008
24 janv. 2008 à 11:36
Bon et bien ce ne sera encore pas la solution car mon hébergeur est sous PHP4, et
L'extension SimpleXML requiert PHP 5.

donc quelqu'un aurait-il une astuce svp?

Merci beaucoup

Julien RICHARD
Adjoint Multimedia
Groupe AXORYS
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
24 janv. 2008 à 11:59
0
cs_richardjul Messages postés 7 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 24 janvier 2008
24 janv. 2008 à 16:22
Voilà j'ai trouvé,
il fallait respecter l'ordre des balises et dans la conditions de la fonction endElement tester le dernier item parcouru, donc bien faire gaffe à l'ordre des items du xml!!

le script fonctionnel est le suivant :

<?php
mysql_connect("adress", "login", "MDP") or die("Impossible de se connecter");
//mysql_connect("localhost", "root", "") or die("Impossible de se connecter");
mysql_select_db("DB") or die("pas possible de trouver la base");

//ORDRE item FLUX  : titre  DATE  lieu  URL  entreprise  ref

$file = "adress du flux.xml";
global $fournisseur;
$find_fournisseur = explode ("/", $file);
$fournisseur2 = $find_fournisseur[2];
$fournisseur1 = explode (".", $fournisseur2);
$fournisseur = $fournisseur1[1];

if(isset($file)) {
$titre = "";
$ref = "";
$curtag = "";
/** fonction startElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function startElement($parser, $name, $attrs) {
global $curtag, $titre, $date, $lieu, $url, $entreprise, $ref;
$curtag = $name;
if ($name "TITRE") $titre "";if ($name "DATE") $date "";if ($name "LIEU") $lieu "";if ($name "URL") $url "";if ($name "ENTREPRISE") $entreprise "";if ($name "REF") $ref "";
}

/** fonction endElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function endElement($parser, $name) {
global $curtag, $titre, $date, $lieu, $url, $entreprise, $ref, $fournisseur ;

$curtag = "";

if ($name == "REF") {

//Formatage des entrées pour la BDD
$titre1 = addslashes($titre);
//$titre1=utf8_decode($titre);

$date = addslashes($date);
$date2 = explode("/",$date);       
$date_finale = $date2[2]."-".$date2[1]."-".$date2[0];

$lieu1 = addslashes ($lieu);

$url1 = addslashes ($url);
//$url1=utf8_decode($url);

$entreprise1 = addslashes ($entreprise);
//$entreprise1=utf8_decode($entreprise);

//Affichage des entrées titre et entreprise enregistré dans la base
/* echo $titre1;
echo "
";
echo $date_finale;
echo "
";
echo $lieu1;
echo "
";
echo $url1;
echo "
";
echo $entreprise1;
echo "
";
echo " ".$ref." ";
echo "
";
echo $fournisseur;
echo "
";  */

$query = "INSERT INTO matable(created,title,location,URL_flux,company,ref_xml,fournisseur_flux) VALUES('".$date_finale."','".$titre1."','".$lieu1."','".$url1."','".$entreprise1."','".$ref."','".$fournisseur."')";
$result = mysql_query($query) or die('Erreur SQL !'.$query.'
'.mysql_error());

}
/** fonction characterData, déclenchée lorsque le parseur rencontre des caractères, à l'intérieur d'un noeud XML **/
function characterData($parser, $data) {
global $curtag, $titre, $date, $lieu, $url, $entreprise, $ref;

if ($curtag == "TITRE")
$titre .= $data;

if ($curtag == "DATE")
$date .= $data;

if ($curtag == "LIEU")
$lieu .= $data;

if ($curtag == "URL")
$url .= $data;

if ($curtag == "ENTREPRISE")
$entreprise .= $data;

if ($curtag == "REF"){
$ref .= $data;

}
}

/** crée un nouveau parseur **/
$xml_parser = xml_parser_create();

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

/** enregistre les trois fonctions ci dessus **/
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("Impossible d'ouvrir l'URL...");
}

while ($data = fread($fp, 50)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("erreur XML: %s à la ligne %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
}
}

xml_parser_free($xml_parser);
mysql_close();

}

?>

Merci bien

Julien RICHARD
0
Rejoignez-nous