8722 sujets

Développement web côté serveur, CMS

Bonjour,

je souhaite coder une insertion en bdd avec pdo, le mieux possible et j'aurais besoin de vos conseils.
Il s'agit d'un panier simplifié: je teste la réf. du panier et si elle correspond à une entrée en bdd, je met cette entrée à jour, sinon, je créé l'entrée correspondante.
Je me perd entre tous les try et catch, je ne sais pas s'ils sont au bon endroit, s'il n'y en a pas qui seraient redondants etc.
Ensuite, j'ai utilisé 2 variables différentes $stmt et $stmtA et ce n'est sans doute plus la peine (mon code était différent à l'origine).

Voici le code, merci à ceux qui prendront le temps d'y jeter un œil!

try {
	$stmt = $dbh->prepare("SELECT COUNT(*) as nbe FROM $table WHERE refCmd = :refCmd");
	$stmt->bindParam(':refCmd', $reference);
	$stmt->execute();
	$res = $stmt->fetchAll();
	$nombre = $res[0]['nbe'];
	//$nombre =1;
	
	if ($nombre>0) {// s'il y a déjà une commande avec cette référence, on l'écrase...
		try{  
			$stmtA = $dbh->prepare("UPDATE $table SET refCmd = :refCmd, dateCmd = :dateCmd, civilite = :civilite, nom = :nom, prenom = : prenom, mail = :mail, adresse = :adresse, 
				cp = :cp, ville = :ville, pays = : =pays, montant = :montant, commentaire = :commentaire WHERE refCmd = :refCmd");
		} catch (PDOException $erreur) {
  			  if ($version) { echo 'Erreur : '.$erreur->getMessage();
   				 } else { echo 'Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.';
   				}
   			}
   	} else {// si la référence n'existe pas
   			try{  
			$stmtA = $dbh->prepare("INSERT INTO $table (refCmd, dateCmd, civilite, nom, prenom, mail, adresse, cp, ville, pays, montant, commentaire) 
  				values (:refCmd, :dateCmd, :civilite, :nom, : prenom, :mail, :adresse, :cp, :ville, : pays, :montant, :commentaire)");
		} catch (PDOException $erreur) {
  			  if ($version) { echo 'Erreur : '.$erreur->getMessage();
   				 } else { echo 'Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.';
   				}
   			}
   		}

	try {  //on passe les paramètres et on execute
	  $stmtA->bindParam(':refCmd', $reference);
	  $stmtA->bindParam(':dateCmd',$dateCmd);
	  $stmtA->bindParam(':civilite', $civilite);
	  $stmtA->bindParam(':nom', $nom);
	  $stmtA->bindParam(':prenom', $prenom);
	  $stmtA->bindParam(':mail', $mail);
	  $stmtA->bindParam(':adresse', $adresse);
	  $stmtA->bindParam(':cp', $codePostal);
	  $stmtA->bindParam(':ville', $ville);
	  $stmtA->bindParam(':pays', $pays);
	  $stmtA->bindParam(':montant', $montant);
	  $stmtA->bindParam(':commentaire', $commentaire);
	  
	  $stmtA->execute();
	  $dbh = null;
	  
	} catch (PDOException $erreur) {
	    if ($version) {
	        echo 'Erreur : '.$erreur->getMessage();
	    } else {
	        echo 'Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.';
	    }
	}
} catch (PDOException $erreur) {
	if ($version) {
	    echo 'Erreur : '.$erreur->getMessage();
	} else {
	    echo 'Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.';
	}
}

Modifié par Acidy (29 Jul 2014 - 17:55)
Bonjour,

quelques conseils techniques pour ce script:
-> essaie d'utiliser les transactions, beginTransaction() commit() et rollback() lorsqu'une erreur survient. Il vaut mieux sécuriser au maximum les paniers avec un mécanisme d'annulation au cas ou
Quoiqu'il arrive les données d'une table seront intègres

-> tu peux simplifier ton script en 1 requete (à tester),
INSERT INTO $table ....
ON DUPLICATE KEY UPDATE ...