[RESOLU] formulaire insertion bdd

Eléphant du PHP | 75 Messages

14 juil. 2014, 17:11

Salut.
J'ai créer 2 formulaire, un ou l'utilisateur saisie les information et l'autre ou on vérifié les info et on procéde au payement.
Mon problème est que en bdd cela devrait être enregistré sous le même id et en fait il me créer 2 id .....:/

Page ma_pub.php
<?php
   
   $erreurs = array();   //tableau contenant des messages d'erreurs

  if(!empty($_POST)) {//soumission du formulaire
   //Verification titre
  if(empty($_POST['titre']))
  {

   $erreurs['titre'] = 'Renseigner un nom de sortie';
  }
 
   //Verification ville
  if(empty($_POST['city']))
  {

    $erreurs['city'] = 'Renseigner une ville';
  }
 
   //Verification code postal
  if(empty($_POST['postcode']))
  {

    $erreurs['postcode'] = 'Renseigner un code postal';
  }
 


if( empty( $erreurs)  ){




   $req = $bdd->prepare('INSERT INTO orders ( titre, phone, street, postcode, city)
 
  VALUES (:titre, :phone, :street, :postcode, :city)');
   
   
   
     $retour= $req->execute(array(
          'titre'=>$_POST['titre'],
          'phone'=>$_POST['phone'],
          'street'=>$_POST['street'],
          'postcode'=>$_POST['postcode'],
          'city'=>$_POST['city']
          
    ));
if( $retour ===false) echo "Problème lors de l'insertion";
       
}else{//le tableau ne contient
 echo "<p> renseignez les champs vides</p>";
}

header('Location: verification.php');

}//fin de la soumission du formulaire


?>




<form action="ma_pub.php" method="post" enctype="multipart/form-data">

     <!-- titre de la sortie -->
     <label>titre :</label>
     <input class="form-control" type="text" name="titre" value="<?php if(isset($_POST['titre'])) echo $_POST['titre'];?>" />
     <div class="error"><?php if(isset($erreurs['titre'])) echo $erreurs['titre'];?></div>
 
     
      <!-- Ville de la sortie -->
      <label>Ville *</label>
      <input class="form-control" type="text" name="city" value="<?php if(isset($_POST['city'])) echo $_POST['city'];?>" />
      <div class="error"><?php if(isset($erreurs['city'])) echo $erreurs['city'];?></div>
     
     
       <!-- Ville de la sortie -->
      <label>Rue</label>
      <input class="form-control" type="text" name="street" value="<?php if(isset($_POST['street'])) echo $_POST['street'];?>" />
      <div class="error"><?php if(isset($erreurs['street'])) echo $erreurs['street'];?></div>
     
      <!-- Code postal de la sortie -->
      <label>Code postal *</label>
      <input class="form-control" type="text" name="postcode" value="<?php if(isset($_POST['postcode'])) echo $_POST['postcode'];?>" />
      <div class="error"><?php if(isset($erreurs['postcode'])) echo $erreurs['postcode'];?></div>
     

       <label>Télephone</label>
      <input class="form-control" type="text" name="phone" value="<?php if(isset($_POST['phone'])) echo $_POST['phone'];?>" />
       <div class="error"><?php if(isset($erreurs['phone'])) echo $erreurs['phone'];?></div>

<input type="submit" value="S'abonner" class="btn primary">
</form>
et page verification.php
<?php session_start();?>

<?php echo $_SESSION['phone']; ?><br>
<?php echo $_SESSION['titre']; ?><br>
<?php echo $_SESSION['street']; ?><br>
<?php echo $_SESSION['city']; ?>
 	
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" >
<label> Choix du type d'offre publicitaire</label>
<select name="amount">
<?php
$req = $bdd->query('SELECT * FROM offers');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
        ?>
    <option value="<?php echo $d['price']; ?>"><?php echo $d['name'];?> -<?php echo $d['price'];?> Euros</option>
        <?php
}
?>
</select>

<input name="currency_code" type="hidden" value="EUR" />
<input name="shipping" type="hidden" value="0.00" />
<input name="tax" type="hidden" value="0.00" />
<input name="return" type="hidden" value="http://www......./succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="http://www................./ipn.php" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value=".............." />
<input name="item_name" type="hidden" value="offre publicitaire" />
<input name="no_note" type="hidden" value="1" />
<input name="lc" type="hidden" value="FR" />
<input name="bn" type="hidden" value="PP-BuyNowBF" />
<input name="custom" type="hidden"value="user_id=<?php echo $_SESSION['user']['id'] ?>" />

    <input type="submit" value="S'abonner" class="btn primary">
    </form>
Page ipn.php ( c'est la page de traitement et de payement pour paypal avec la seconde partie qui s'insere en bdd )
<?php session_start (); ?>


<?php
//permet de traiter le retour ipn de paypal
$email_account = "........................";
$req = 'cmd=_notify-validate';
 
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
 // renvoyer au systeme Paypal pour validation

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: http://www.sandbox.paypal.com\r\n";  // http://www.paypal.com for a live site
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$first_name = $_POST['first_name'];

$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
parse_str($_POST['custom'],$custom);



if (!$fp) {
 
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// vérifier que payment_status a la valeur Completed
if ( $payment_status == "Completed") {
if ( $email_account == $receiver_email) {
/**
* C'EST LA QUE TOUT SE PASSE
* PS : tjrs penser à vérifier la somme !!
*/
 
 file_put_contents('log', print_r($_POST,true));
 
$db = new PDO('mysql:host=.............;dbname=.............','..............','...............');
$req = $db->query('SELECT * FROM offers WHERE price='.$payment_amount.' LIMIT 1');
$d = $req->fetch(PDO::FETCH_ASSOC);
if(!empty($d)){
	
	$duration = $d['duration'];
	$uid = $custom['user_id'];
	$data = serialize($_POST);
	
	//On met à jour la date d'expiration
	$db->query('UPDATE users SET expiration = DATE_ADD(NOW(), INTERVAL '.$duration.' MONTH) WHERE id = '.$uid);
	


	
	//On sauvegarde la commande
	$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."')");
	
	file_put_contents('log','Le paiement à bien était confirmé');
}else{
	file_put_contents('log','Le paiement ne correspond à aucune offre');
}

/**
* FIN CODE
*/
}
}
else {
// Statut de paiement: Echec
}
exit();
}
else if (strcmp ($res, "INVALID") == 0) {
// Transaction invalide
}
}
fclose ($fp);
}	



Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 juil. 2014, 18:18

salut,

Si la ligne est déjà présente c'est qu'il te faut faire un update sur la dernière page.

sinon la solution la plus classique est de tout garder en session jusqu’à ce que tous soit validé (et la insertion).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 75 Messages

14 juil. 2014, 19:02

Pour diverse raison il faut que j'opte pour le UPDATE même si je viens bien admettre que c'est forcément ce qu'il y a de mieux, bref....
Donc au sein de ma page ipn.php
<?
$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."')");
?>
Je la transforme en
<?php
$db->query("UPDATE orders (user_id,amount,created,datas,txn_id) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."')");
?>

Mais comment faire pour modifié l'id que l'utilisateur à rentré sur le formulaire d'avant ( l'id est biensur AI en bdd )

Mammouth du PHP | 1339 Messages

14 juil. 2014, 19:18

Déjà lis ca pour voir a quoi ressemble UPDATE : http://dev.mysql.com/doc/refman/5.0/fr/update.html
Je comprend pas tes 2 tables orders avec des champs differents
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

14 juil. 2014, 19:57

Merci pour la petite lecture.
J'ai donc procéder ainsi:
<?php
//On modifie les entrée en bdd
	$db->query("UPDATE orders SET user_id= $uid, amount= $payment_amount, created = NOW() ,datas= $data ,txn_id= txn_id WHERE id=48");
?>
En espérant que ça soit tout bon, mais vu que l'id varie comment faire.
Faut il le récupérer par une S_SESSION si ui comment

Merci pour tout, encore

Mammouth du PHP | 1339 Messages

14 juil. 2014, 19:59

Justement, ce 48 sort d'ou ?
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

14 juil. 2014, 20:05

en fait c'est une entrée que j'ai en bdd j'ai mis ça comme ca
vaut il mieu que je passe par une req préparée sinan:
//On modifie les entrée en bdd
	$db->query("UPDATE orders SET user_id=:$uid, amount= :$payment_amount, created = :NOW() ,datas= :$data ,txn_id= :$txn_id WHERE id=48");


$db->execute ( array(
 user_id => $uid,
......,
......
));


Mammouth du PHP | 1339 Messages

14 juil. 2014, 21:07

Non mais pourquoi t'as mis 48 et pas un autre ...
On peut le recuperer comment ce 48 ?
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

14 juil. 2014, 21:40

J'ai fait ds test avec mon 1er formulaire de ce fait ca genere un id et voilà c'est tout du coup dans la requete pour l'exemple j'ai mis un WHERE id=48 comme j'aurais pu mettre un WHERE id=3 ou 1254 c'était juste pour illustré ma requete

Mammouth du PHP | 1339 Messages

14 juil. 2014, 21:50

created = :NOW()
retire les : ...
Bref t'as pas mal de truc a apprendre pour être a l'aise avec.
N'essaye pas de bruler les etapes !
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

14 juil. 2014, 22:07

Je suis entièrement d'accord pas mal de truc à apprendre, je cherche malgré tout à savoir comment récupérer l'id pour ma requete.
<?php
//On modifie les entrée en bdd
        $db->query("UPDATE orders SET user_id=:$uid, amount= :$payment_amount, created = NOW() ,datas= :$data ,txn_id= :$txn_id WHERE id=48");

// au lieu de mettre 48 comment faire pour récupérer l'id correspondant au premier formulaire ?
// la bonne requete ?
 $db->query("UPDATE orders SET user_id=:$uid, amount= :$payment_amount, created = NOW() ,datas= :$data ,txn_id= :$txn_id WHERE id=?");


$db->execute ( array(
 user_id => $uid,
......,
......
));
?>

Mammouth du PHP | 1339 Messages

14 juil. 2014, 22:13

Bah je la mettrait dans le champ custom ...
Car logiquement dans ta commande tu devrait stocker l'id du membre qui l'a fait.
Donc si tu recupere l'id de la commande (dans le champ custom) tu peux apres grace a une requete afficher l'id du membre.

Pour recuperer l'iD de la commande que l'on vient de creer on se sert de mysql_insert_id() http://php.net//manual/fr/function.mysql-insert-id.php

Tu fais ton INSERT puis $id = mysqli_insert_id() et tu fais <input name="custom" value="'.$id.'" />
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

15 juil. 2014, 09:57

Salut j'ai regarder ce que tu ma donné mais me suis dirigé vers ma procédure actuelle PDO.
Ce petit bout de code devrait normalement me retournée le dernier id en bdd mais mon echo m'affiche 0.

Auriez vous une idée ?
<?php

    $lastInsertId = $bdd->lastInsertId();
    echo $lastInsertId; // Affiche l'id inséré
   
?>
Ma page verification.php ( en cas si besoin )

<?php session_start();?>

<?php
try
{
$bdd = new PDO('mysql:host=******;dbname=*******','********','*************');
$bdd->exec('SET NAMES utf8');

}
 
catch(Exception $e)
{
        echo 'Une erreur est survenue !';
        die();
}

// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>



<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Trouver ma sortie</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/custom.css">
<link rel="stylesheet" href="css/administration.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="Stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" />
</head>
<body onLoad="CFInstall.check()">
<body>


    
<?php include("include/header.php");?>
 
<div class="container">



<?php echo $_SESSION['phone']; ?><br>
<?php echo $_SESSION['titre']; ?><br>
<?php echo $_SESSION['street']; ?><br>
<?php echo $_SESSION['city']; ?><br>




<?php

    $lastInsertId = $bdd->lastInsertId();
    echo $lastInsertId; // Affiche l'id inséré
   
?>





 
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" >
<label> Choix du type d'offre publicitaire</label>
<select name="amount">
<?php
$req = $bdd->query('SELECT * FROM offers');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
        ?>
    <option value="<?php echo $d['price']; ?>"><?php echo $d['name'];?> -<?php echo $d['price'];?> Euros</option>
        <?php
}
?>
</select>

<input name="currency_code" type="hidden" value="EUR" />
<input name="shipping" type="hidden" value="0.00" />
<input name="tax" type="hidden" value="0.00" />
<input name="return" type="hidden" value="http://www.lasortie.fr/succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="http://www.lasortie.fr/ipn.php" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="[email protected]" />
<input name="item_name" type="hidden" value="offre publicitaire" />
<input name="no_note" type="hidden" value="1" />
<input name="lc" type="hidden" value="FR" />
<input name="bn" type="hidden" value="PP-BuyNowBF" />

<input name="custom" type="hidden"value="user_id=<?php echo $_SESSION['user']['id'] ?>" />

    <input type="submit" value="S'abonner" class="btn primary">
    </form>

        
	</div>
    
    
</body>
</html>
et la page formulaire ( 1er formulaire)
<?php session_start();?>
<?php $page = "profil";?>

<?php
if(!empty($_POST)) {
 
$_SESSION['titre'] = $_POST['titre'];
$_SESSION['phone'] = $_POST['phone'];
$_SESSION['postcode'] = $_POST['postcode'];
$_SESSION['city'] = $_POST['city'];
$_SESSION['street'] = $_POST['street']; 
  
echo var_dump ($_SESSION);
}
?>

<?php

try
{
$bdd = new PDO('mysql:host=********;dbname=*******','*********','*********');
$bdd->exec('SET NAMES utf8');

}
 
catch(Exception $e)
{
        echo 'Une erreur est survenue !';
        die();
}



// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>



<?php
   
   $erreurs = array();   //tableau contenant des messages d'erreurs

 /* traitement des erreurs
 * tous les champs du formulaire non remplis seront placés
 * dans le tableau des erreurs $erreurs.A la fin du traitement
 * ce tableau sera soit vide, auquel cas on exécute la requête insert
 * pour inserer les données en bd, soit ce tableau n'est pas vide(champs non remplis) on invite
 * l'utilisateur à remplir tous les champs

 */
  if(!empty($_POST)) {//soumission du formulaire
   //Verification titre
  if(empty($_POST['titre']))
  {

   $erreurs['titre'] = 'Renseigner un nom de sortie';
  }
 
   //Verification ville
  if(empty($_POST['city']))
  {

    $erreurs['city'] = 'Renseigner une ville';
  }
 
   //Verification code postal
  if(empty($_POST['postcode']))
  {

    $erreurs['postcode'] = 'Renseigner un code postal';
  }
 


//fin traitement des erreurs


//s'il y a  problème, procède au debogage en decommentant les 2 lignes çi-dessus:
//var_dump($_POST);
//die('fin debogage');


//le tableau d'erreurs est vide alors on insère les données
if( empty( $erreurs)  ){




   $req = $bdd->prepare('INSERT INTO orders ( titre, phone, street, postcode, city)
 
  VALUES (:titre, :phone, :street, :postcode, :city)');
   
   
   
     $retour= $req->execute(array(
          'titre'=>$_POST['titre'],
          'phone'=>$_POST['phone'],
          'street'=>$_POST['street'],
          'postcode'=>$_POST['postcode'],
          'city'=>$_POST['city']
          
    ));
if( $retour ===false) echo "Problème lors de l'insertion";
       
}else{//le tableau ne contient
 echo "<p> renseignez les champs vides</p>";
}

header('Location: verification.php');

}//fin de la soumission du formulaire






$id_data = $bdd->lastInsertId();


?>



<form action="ma_pub.php" method="post" enctype="multipart/form-data">

     <!-- titre de la sortie -->
     <label>titre :</label>
     <input class="form-control" type="text" name="titre" value="<?php if(isset($_POST['titre'])) echo $_POST['titre'];?>" />
     <div class="error"><?php if(isset($erreurs['titre'])) echo $erreurs['titre'];?></div>
 
     
      <!-- Ville de la sortie -->
      <label>Ville *</label>
      <input class="form-control" type="text" name="city" value="<?php if(isset($_POST['city'])) echo $_POST['city'];?>" />
      <div class="error"><?php if(isset($erreurs['city'])) echo $erreurs['city'];?></div>
     
     
       <!-- Ville de la sortie -->
      <label>Rue</label>
      <input class="form-control" type="text" name="street" value="<?php if(isset($_POST['street'])) echo $_POST['street'];?>" />
      <div class="error"><?php if(isset($erreurs['street'])) echo $erreurs['street'];?></div>
     
      <!-- Code postal de la sortie -->
      <label>Code postal *</label>
      <input class="form-control" type="text" name="postcode" value="<?php if(isset($_POST['postcode'])) echo $_POST['postcode'];?>" />
      <div class="error"><?php if(isset($erreurs['postcode'])) echo $erreurs['postcode'];?></div>
     

       <label>Télephone</label>
       <input class="form-control" type="text" name="phone" value="<?php if(isset($_POST['phone'])) echo $_POST['phone'];?>" />
       <div class="error"><?php if(isset($erreurs['phone'])) echo $erreurs['phone'];?></div>

<input type="submit" value="S'abonner" class="btn primary">
</form>

Mammouth du PHP | 1339 Messages

15 juil. 2014, 10:09

Il faut que cela soit juste derriere la requete d'insert !
   $req = $bdd->prepare('INSERT INTO orders ( titre, phone, street, postcode, city) VALUES (:titre, :phone, :street, :postcode, :city)');
   
   
   
     $retour= $req->execute(array(
          'titre'=>$_POST['titre'],
          'phone'=>$_POST['phone'],
          'street'=>$_POST['street'],
          'postcode'=>$_POST['postcode'],
          'city'=>$_POST['city']
         
    ));
   $lastInsertId = $bdd->lastInsertId();
    echo 'Cette commande a le numero '.$lastInsertId; // Affiche l'id inséré
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 75 Messages

15 juil. 2014, 10:27

En fait il faut que je récupère l'id sur la page ipn.php

La req en question ( ou il faut que je recup l'id qui à été généré juste avant pour le mettre à la fin de ma requete dans le WHERE )
//On modifie les entrée en bdd
	$db->query("UPDATE orders SET user_id=:$uid, amount= :$payment_amount, created = NOW() ,datas= :$data ,txn_id= :$txn_id WHERE id=?");


$db->execute ( array(
user_id => $uid,
amount => $payment_amount,
created => NOW(),
datas => $data,
txn_id => $txn_id
));
Et juste pour savoir pourquoi un simple
<?php echo $_SESSION['id']; ?>
ne suffit pas pour afficher l'id ?






Page ipn.php
<?php session_start (); ?>


<?php
//permet de traiter le retour ipn de paypal
$email_account = "compte_vendeur";
$req = 'cmd=_notify-validate';
 
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
 // renvoyer au systeme Paypal pour validation

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: http://www.sandbox.paypal.com\r\n";  // http://www.paypal.com for a live site
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$first_name = $_POST['first_name'];

$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
parse_str($_POST['custom'],$custom);



if (!$fp) {
 
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// vérifier que payment_status a la valeur Completed
if ( $payment_status == "Completed") {
if ( $email_account == $receiver_email) {
/**
* C'EST LA QUE TOUT SE PASSE
* PS : tjrs penser à vérifier la somme !!
*/
 
 file_put_contents('log', print_r($_POST,true));
 
$db = new PDO('mysql:host=*********;dbname=***********','************','*********');
$req = $db->query('SELECT * FROM offers WHERE price='.$payment_amount.' LIMIT 1');
$d = $req->fetch(PDO::FETCH_ASSOC);
if(!empty($d)){
	
	$duration = $d['duration'];
	$uid = $custom['user_id'];
	$data = serialize($_POST);
	
	//On met à jour la date d'expiration
	$db->query('UPDATE users SET expiration = DATE_ADD(NOW(), INTERVAL '.$duration.' MONTH) WHERE id = '.$uid);
	

	
	//On modifie les entrée en bdd
	$db->query("UPDATE orders SET user_id=:$uid, amount= :$payment_amount, created = NOW() ,datas= :$data ,txn_id= :$txn_id WHERE id=?");


$db->execute ( array(
user_id => $uid,
amount => $payment_amount,
created => NOW(),
datas => $data,
txn_id => $txn_id
));
		
		
		
	file_put_contents('log','Le paiement à bien était confirmé');
}else{
	file_put_contents('log','Le paiement ne correspond à aucune offre');
}

/**
* FIN CODE
*/
}
}
else {
// Statut de paiement: Echec
}
exit();
}
else if (strcmp ($res, "INVALID") == 0) {
// Transaction invalide
}
}
fclose ($fp);
}