par
moogli » 21 févr. 2017, 16:53
il faut que :
- tu ne fasse qu'une seul connexion à la base de données => le new PDO en dehors du foreach
- tu utilises les requêtes préparées (pour l'insertion et le select).
en gros un truc comme ça
<?php
$FichierXML = file_get_contents('fichier1.xml');
$resultats= new simpleXMLElement($FichierXML);
if (isset($_POST['envoyer'])) {
try {
$bdd = new PDO('mysql:host=localhost;dbname=ze_xml;charset=utf8', 'root', '');
}
catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
$stmtSelect = $bdd->prepare('select count(1) as nb from enregistrements where EndtoEndId=:end AND IBAN= :iban AND Ustrd=:user');
$stmtInsert = $bdd->prepare('INSERT INTO enregistrements (EndtoEndId, InstdAmt, Nm1, Id1, BIC, Nm2, IBAN, Ustrd) VALUES (:EndtoEndId, :InstdAmt, :Nm1, :Id1, :BIC, :Nm2, :IBAN, :Ustrd');
echo "
<div class='ligne_bis'>
<div class='bloc1_bis'>EndtoEndId</div>
<div class='bloc2_bis'>InstdAmt</div>
<div class='bloc3_bis'>Nm1</div>
<div class='bloc4_bis'>Id</div>
<div class='bloc5_bis'>BIC</div>
<div class='bloc6_bis'>Nm2</div>
<div class='bloc7_bis'>IBAN</div>
<div class='bloc8_bis'>Ustrd</div>
</div>
<div class='clear'></div>
";
$j = 0;
echo "<div class='ligne'>";
foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf as $valeur) {
$EndtoEndId = $valeur->PmtId->EndToEndId;
$InstdAmt = $valeur->Amt->InstdAmt;
$Nm1 = $valeur->UltmtDbtr->Nm;
$Id1 = $valeur->UltmtDbtr->Id->OrgId->Othr->Id;
$BIC = $valeur->CdtrAgt->FinInstnId->BIC;
$Nm2 = $valeur->Cdtr->Nm;
$IBAN = $valeur->CdtrAcct->Id->IBAN;
$Ustrd = $valeur->RmtInf->Ustrd;
$stmtSelect->execute([':end' => $EndtoEndId,':iban' => $IBAN, ':user' => $Ustrd]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
if($data !== false && $data['nb']=== 0){
try {
$stmtInsert->execute([':EndtoEndId' => $EndtoEndId, ':InstdAmt' => $InstdAmt, ':Nm1' => $Nm1, ':Id1' => $Id1, ':BIC' => $BIC, ':Nm2' => $Nm2, ':IBAN' => $IBAN, ':Ustrd' => $Ustrd]);
$j++;
}catch(PDOException $e){
// a voir pour gére l'erreur mais elle ne doit pas être bloquante
}
}
$stmtSelect->closeCursor();
}
echo '</div>';
echo '<div class="clear"></div><br /><br /><center><b>', count($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf) ,'</b> ENREGISTREMENTS</center><br /><br />';
echo '<div class="clear"></div><br /><br /><center><b>', $j ,'</b> ligne(s) insérée(s)</center><br /><br />';
} else {
echo "
<br /><br /><br /><br /><center>
<form action='' method='post' enctype='multipart/form-data'>
<input type='submit' name='envoyer' value='Envoyer'>
</form>
</center>
";
}
@+
il faut que :
- tu ne fasse qu'une seul connexion à la base de données => le new PDO en dehors du foreach
- tu utilises les requêtes préparées (pour l'insertion et le select).
en gros un truc comme ça
[php]<?php
$FichierXML = file_get_contents('fichier1.xml');
$resultats= new simpleXMLElement($FichierXML);
if (isset($_POST['envoyer'])) {
try {
$bdd = new PDO('mysql:host=localhost;dbname=ze_xml;charset=utf8', 'root', '');
}
catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
$stmtSelect = $bdd->prepare('select count(1) as nb from enregistrements where EndtoEndId=:end AND IBAN= :iban AND Ustrd=:user');
$stmtInsert = $bdd->prepare('INSERT INTO enregistrements (EndtoEndId, InstdAmt, Nm1, Id1, BIC, Nm2, IBAN, Ustrd) VALUES (:EndtoEndId, :InstdAmt, :Nm1, :Id1, :BIC, :Nm2, :IBAN, :Ustrd');
echo "
<div class='ligne_bis'>
<div class='bloc1_bis'>EndtoEndId</div>
<div class='bloc2_bis'>InstdAmt</div>
<div class='bloc3_bis'>Nm1</div>
<div class='bloc4_bis'>Id</div>
<div class='bloc5_bis'>BIC</div>
<div class='bloc6_bis'>Nm2</div>
<div class='bloc7_bis'>IBAN</div>
<div class='bloc8_bis'>Ustrd</div>
</div>
<div class='clear'></div>
";
$j = 0;
echo "<div class='ligne'>";
foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf as $valeur) {
$EndtoEndId = $valeur->PmtId->EndToEndId;
$InstdAmt = $valeur->Amt->InstdAmt;
$Nm1 = $valeur->UltmtDbtr->Nm;
$Id1 = $valeur->UltmtDbtr->Id->OrgId->Othr->Id;
$BIC = $valeur->CdtrAgt->FinInstnId->BIC;
$Nm2 = $valeur->Cdtr->Nm;
$IBAN = $valeur->CdtrAcct->Id->IBAN;
$Ustrd = $valeur->RmtInf->Ustrd;
$stmtSelect->execute([':end' => $EndtoEndId,':iban' => $IBAN, ':user' => $Ustrd]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
if($data !== false && $data['nb']=== 0){
try {
$stmtInsert->execute([':EndtoEndId' => $EndtoEndId, ':InstdAmt' => $InstdAmt, ':Nm1' => $Nm1, ':Id1' => $Id1, ':BIC' => $BIC, ':Nm2' => $Nm2, ':IBAN' => $IBAN, ':Ustrd' => $Ustrd]);
$j++;
}catch(PDOException $e){
// a voir pour gére l'erreur mais elle ne doit pas être bloquante
}
}
$stmtSelect->closeCursor();
}
echo '</div>';
echo '<div class="clear"></div><br /><br /><center><b>', count($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf) ,'</b> ENREGISTREMENTS</center><br /><br />';
echo '<div class="clear"></div><br /><br /><center><b>', $j ,'</b> ligne(s) insérée(s)</center><br /><br />';
} else {
echo "
<br /><br /><br /><br /><center>
<form action='' method='post' enctype='multipart/form-data'>
<input type='submit' name='envoyer' value='Envoyer'>
</form>
</center>
";
}[/php]
@+