Php mysql

Résolu/Fermé
Dix - 14 nov. 2020 à 15:47
 Dix - 16 nov. 2020 à 01:04
Bonjour,
guys j'ai besoin de votre aide. j'implemente une application web pour un petit bibliotheque. j'aimerais pouvoir supprimer un livre dans la table pret en meme temps que je retourne le livre qui avait ete emprunté dans la bibliotheque. je vous montre mon code afin que vous m'aidiez a voir ou je n'ai pas assuré.

  	
	     if(isset($_POST['retourner'])){
	$identifiant = $_POST['identifiant'];
	$title = $_POST['title'];

	 /* inserer donnees dans la base pret */
	  $retourner = $connexion-> prepare("INSERT INTO retour(id_elevepret, id_livremprunter)
                              	  VALUES ( :id_elevepret, :id_livremprunter)");
	   
 /* liaison des marqueurs a des valeurs*/
	  $retourner-> bindValue(':id_elevepret', $_POST['identifiant'], PDO::PARAM_STR);
	  $retourner-> bindValue(':id_livremprunter', $_POST['title'], PDO::PARAM_STR);
	 
	  
       $insertIsOk = $retourner-> execute();
	   
	     if($insertIsOk){
			 /* effacer le livre retourner dans la table pret*/
			 $num_livre = $_POST['retourner'];
			$effacer = $connexion -> prepare("DELETE FROM pret WHERE num_livre = :num_livre");
			
			 $effacer -> bindParam(':num_livre', $num_livre, PDO::PARAM_INT);
	
			 $connexion -> exec($effacer);
			 
			 echo "Livre retourné";
		 }
     else{
		$message = 'Livre non retourné'; 
	 }
		 }
  }
  catch(PDOException $e){
	  echo 'Echec : ' .$e->getMessage();
	  
  }
  header("location: retourner-livre.php");




j'ai un table pret et une table retour pour enregistrer les livres retournés qu'on avait emprunté. l'insertion marche tres bien, mais la deuxieme requete qui etait censé suprimer le livre dans la table pret ne marche pas pourtant ça ne genere aucun message d'erreur.

3 réponses

yg_be
Messages postés
19276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 mai 2022
1 101
14 nov. 2020 à 15:50
bonjour, si je vois bien, tu ne fais rien pour détecter les erreurs: https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
0
jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
4 150
14 nov. 2020 à 16:37
Bonjour,

Si je peux me permettre .... ta structure de bdd n'est pas terrible....

Tu as utilisé deux tables ( Tu as donc augmenté le risque d'erreur ...) ... alors qu'une seule table suffisait.

Dans ta table "livre" il te suffit d'avoir une colonne 'statut' pour savoir si il est là ou non....
Et si tu veux conserver l'historique des prêts, tu peux ajouter une seconde table pour lister les dates de prêts et de retours d'un livre
histo_pret(#id, id_livre, date_pret, date_retour, id_emprunteur)

De cette façon, tu pourras retrouver tous les livres qui n'ont pas été rendus simplement en regardant ceux pour lesquels la date de retour est vide...


Et en complément du lien que t'a donné Yg_be, j'ajouterai celui la :
https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
0
Merci bcp pour ton aide Jordan45. Je veux aller suivre ton conseil et aller dans ton sens, mais maintenant ma question etant: comment je vais faire pour enregistrer un pret? Et comment je faire pour retourner un livre en utilisant ta table histo_pret? Est-ce qu'a chaque insertion de pret je vais laisser le champs date de retour vide et/ou à chaque retour je vais laisser le champs pret vide. Explique moi stp
0
Jordane45, tu m'as ete d'une tres grande aide. merci beaucoup, quant à mon premier commentaire je l'ai posté sans vraiment l'analyser. Je vais suprimer ma table pret et retour pour creer une table histopret avec tes champs indiqués c vraiment plus simple. Mais je me demande maintenant si je le fais comme tu m'as dit pour histopret est-ce que c vraiment necessaire d'ajouter le champs statut a la table livres?
0
jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
4 150 > Dix
Modifié le 15 nov. 2020 à 08:32
Non le champ statut n'est pas nécessaire. ( cela ne servait que si tu ne faisais pas la table histo )
Il suffit de vérifier si tu as une ligne sans date de retour dans la table histo pour savoir si le livre est là ou non.
0
Bonjour Jordane45, j'ai suivi ton conseil, j'ai enlevé les tables pret et retour et les remplacer par une table emprunt ou il y a (id, num_livre, num_emprunteur, date_retour et date_pret). Pour faire un pret j'ai fait une insertion en laissant la date_retour vide(NULL) et ça marche tres bien. Now mon probleme se trouve quand je dois faire un retour: j'ai fait un UPDATE sur la meme ligne pour pouvoir remplir le champs date_retour mais ca ne marche pas et pourtant ca ne m'envoie aucun message d'erreur. A noté que j'ai ajouté le script de gestion d'erreur dans ma page php.


je te montre mon code

<?php
/* gestion des erreurs*/
require_once("erreurdebug.php");

/* connexion a la base de donnees*/
include("connect.php");

      if(isset($_POST['retourner'])){
		  $id = $_POST['id'];
          $num_livre = $_POST['num_livre'];
	      $num_emprunteur = $_POST['num_emprunteur'];
	      $date_pret = $_POST['date_pret'];
	      $date_retour = $_POST['date_retour'];
	      

	 /* inserer donnees dans la base pret */
	           $retourner = $connexion-> prepare("UPDATE emprunter SET date_retour = $date_retour WHERE num_livre = $num_livre and num_emprunteur=$num_emprunteur");    
 
	  
       				 
			 echo "Livre retourné";
	
		 }
  
  
  header("location: retourner-livre.php");
?>






A noté que dans mon formulaire de retour; j'ai donné la possibilité a l'utilisateur de rentrer son id, le titre du livre que j'ai géré avec une liste deroulante drop down ou se trouve seulement les livres n'ayant pas de date de retour, et ensuite date_retour.


Aide-moi stp
0
jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
4 150
Modifié le 15 nov. 2020 à 15:36
As tu activé l'affichage des erreurs PDO dans ta connexion à la bdd ?
car visiblement tu n'as pas placé ta requête dans un bloc try/catch tel qu'indiqué dans le lien qu' Yg_be t'avait donné...

Je te conseille également d'utiliser les requêtes préparées et de désactiver la redirection le temps des tests... sinon tu ne verras pas les messages d'erreur.

Ton code un peu améliorer donnerait :
<?php
/* gestion des erreurs*/
require_once("erreurdebug.php");

/* connexion a la base de donnees*/
include("connect.php");

if(isset($_POST['retourner'])){
  //récupération PROPRE des variables AVANT de les utiliser
  $id = !empty($_POST['id']) ? $_POST['id'] : NULL;
  $num_livre = !empty($_POST['num_livre']) ? $_POST['num_livre'] : NULL;
  $num_emprunteur = !empty($_POST['num_emprunteur'] )? $_POST['num_emprunteur'] : NULL;
  $date_pret = !empty($_POST['date_pret']) ? $_POST['date_pret'] : NULL;
  $date_retour = !empty($_POST['date_retour']) ? $_POST['date_retour'] : date('Y-m-d H:i:s');


/* inserer donnees dans la base pret */
  $sql = "UPDATE emprunter 
            SET date_retour = :date_retour 
        WHERE num_livre = :num_livre 
          AND num_emprunteur=:num_emprunteur
          AND  date_retour IS NULL";
          
  $datas = array(':date_retour'=>$date_retour,
                  ':num_livre'=>$num_livre,
                  ':num_emprunteur'=>$num_emprunteur
                  );
  try{
    $prep = $connexion-> prepare($sql);    
    $prep->execute($datas);
    echo "Livre retourné";
    header("location: retourner-livre.php");
    exit;
  }catch(Exception $e){
    echo "Erreur " . $e->getMessage();
    exit;
  }
 

}
0
Dix > jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022

15 nov. 2020 à 15:02
avant le retour j'avais deja effectué une insertion de pret avec la date du pret. l'Updatde c pour le retour du livre; on modifie la ligne qu'on avait iserer lors du pret, c pourquoi je pense que la date_pret ne peut pas etre null dans l'update. on doit le laisser avec la meme la date, ici la seule valeur a ajouter c la date_retour
0
jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
4 150 > Dix
15 nov. 2020 à 15:09
Pardon oui
C'est date retour qu'il faut vérifier si null.
0
Dix > jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022

15 nov. 2020 à 15:20
j'ai copié - collé ton code après avoir fermé les parenthèses des lignes 12, 13 et 14 ça ne marche toujours pas. le champs date_retour est toujours NULL.
0
jordane45
Messages postés
35435
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
4 150 > Dix
15 nov. 2020 à 15:38
As tu, comme je te l'ai demandé, mis en commentaire la redirection ?

As tu testé, directement dans ta bdd, via phpmyadmin, si la requête fonctionnait ( en remplaçant les variables nommées :truc ) par de "vraies" valeurs ?

As tu bien le champ date_retour à null dans ta bdd ou au format 0000-00-00 00:00:00 ?
0