Savoir si la requête sql ne renvoie pas de données...

Fermé
luiss_1984 Messages postés 2 Date d'inscription dimanche 9 juin 2013 Statut Membre Dernière intervention 10 juin 2013 - 9 juin 2013 à 22:30
luiss_1984 Messages postés 2 Date d'inscription dimanche 9 juin 2013 Statut Membre Dernière intervention 10 juin 2013 - 10 juin 2013 à 01:24
Bonjour,

j'ai une question sur une requête sql : je n'arrive pas à entrer dans ma condition else, peut-être parce que $donnees existe toujours.
L'idée est que l'utilisateur envoie un template via un formulaire (POST "template"), le code ci-dessous vérifie d'abord si le template existe dans la base (table "infos"). Si le template existe, alors il est mis à jour avec les infos envoyées (template, site_url, etc.). Et s'il n'existe pas (et c'est là où je n'y arrive plus), l'idée serait de créer le template.

Merci de votre aide !

<?php
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=templates', 'root', '');
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}
$exist = $bdd->prepare('SELECT * FROM infos WHERE template=?');
$exist->execute(array($_POST['template']));
$donnees = $exist->fetch();
if (isset($donnees)){
while ($donnees = $exist->fetch())
{
$req = $bdd->prepare('UPDATE infos SET site_url = :site_url,
sous_domaine = :sous_domaine, site_name = :site_name, lang = :lang, tag_type = :tag_type WHERE template = :template');
$req->execute(array(
'template' => $_POST['template'],
'site_url' => $_POST['site_url'],
'sous_domaine' => $_POST['sous_domaine'],
'site_name' => $_POST['site_name'],
'lang' => $_POST['lang'],
'tag_type' => $_POST['tag_type']
));
echo 'mis a jour';
}
// header('Location: test.php?nom='.$_POST['template']);
}else{
$req = $bdd->prepare('INSERT INTO infos(template, site_url, sous_domaine, site_name, lang, tag_type) VALUES(:template, :site_url,
:sous_domaine, :site_name, :lang, :tag_type)');
$req->execute(array(
'template' => $_POST['template'],
'site_url' => $_POST['site_url'],
'sous_domaine' => $_POST['sous_domaine'],
'site_name' => $_POST['site_name'],
'lang' => $_POST['lang'],
'tag_type' => $_POST['tag_type']
));
echo 'créé';}
$exist->closeCursor();
?>

1 réponse

Utilisateur anonyme
9 juin 2013 à 23:14
Bonjour

Je regarde ces trois lignes :
$donnees = $exist->fetch(); 
if (isset($donnees)){ 
while ($donnees = $exist->fetch()) 

Deux remarques :
- à partir du moment où tu as fait à la première ligne $donnees = qq chose, la variable $donnees est définie, donc if (isset($donnees)) sera obligatoirement true
- quand tu fais $donnees = $exist->fetch(); à la première ligne, tu 'consommes' une ligne dans la réponse à la requête, donc quand tu feras while ($donnees = $exist->fetch()) ensuite, il te manquera la première ligne.

À mon avis, ceci devrait mieux marcher :
S'il doit y avoir un seul template, pas besoin de boucle :
$exist->execute(array($_POST['template'])); 
$donnees = $exist->fetch();  
if ($donnees ) { 
...echo 'mis a jour'; 
// header('Location: test.php?nom='.$_POST['template']); 
}else{ 


S'il peut y avoir plusieurs templates :
$exist->execute(array($_POST['template'])); 
$donnees = $exist->fetch();  
if ($donnees ) { 
while ($donnees) {
...echo 'mis a jour'; 
$donnees=$exist->fetch();
}
// header('Location: test.php?nom='.$_POST['template']); 
}else{ 
0
luiss_1984 Messages postés 2 Date d'inscription dimanche 9 juin 2013 Statut Membre Dernière intervention 10 juin 2013
10 juin 2013 à 01:24
Merci le père ! Je n'aurai qu'un template, je prends donc l'option #1
0