[RESOLU] une variable dans une requête sql

Eléphanteau du PHP | 28 Messages

03 août 2017, 07:18

Bonjour
j'ai écumer les sites, j'ai fais des tas de tests, mais je ne comprends toujours pas comment mettre une variable a la place d'une requête fixe ...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Prières Amour, Argent, Santé et Travail</title>
</head>

<body>
<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=bartoon;charset=utf8', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>
<form method="post" action="cible.php">
 
    <label for="ange">Vous recherchez une prière de quel ange ?</label><br />
     <select name="ange">

<?php
 
$reponse = $bdd->query('SELECT ange FROM ange_priere');
 
while ($donnees = $reponse->fetch())
{
?>
           <option value="<?php echo $donnees['ange']; ?>"> <?php echo $donnees['ange']; ?></option>
<?php
}
?>
</select>
<input type="submit" value="Valider" />
</form>
</body>
</html>
ceci est mon fichier formulaire2.php

dedans je fais un formulaire en liste déroulante ou les choix sont pris dans une table sql. je valide mon choix et pars sur un fichier cible.php que voici :
<?php echo $_POST['ange']; ?>

<?php
 
try
{
	// on se connecte a MYSQL
	$bdd = new PDO('mysql:host=localhost;dbname=bartoon;charset=utf8', 'root', '');
}

catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}


$nom_ange=$_POST['ange'];

$reponse = $bdd->query('SELECT priere1 FROM ange_priere WHERE ange= "Mahasiah" && amour= 1');

//$reponse = $bdd->query('SELECT priere1, ange FROM ange_priere WHERE ange= $nom_ange AND amour= 1 AND argent= 0 AND sante= 0 AND travail= 0');
// On affiche chaque entrée une à une


while ($donnees = $reponse->fetch())
{
?>

    <p>

    L'ange concerne est : <strong><?php echo $_POST['ange']; ?></strong>, et la priere est : <br>
    <?php echo $donnees['priere1']; ?><br /> <?php echo $nom_ange; ?>
 
<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>

Le soucis est que quand je veux remplacer "Mahasiah" par une variable (qui est a l'origine $_POST['ange'] qui vient de mon formulaire2.php dans cette ligne : $reponse = $bdd->query('SELECT priere1 FROM ange_priere WHERE ange= "Mahasiah" && amour= 1');
j'ai cette erreur Fatal error: Call to a member function fetch() on boolean in F:\www\testphp\cible.php on line 26

si je supprime tout ce qui est en rapport avec la ligne 26 et que je garde que ca :
<?php echo $_POST['ange']; ?>

<?php
 
try
{
	// on se connecte a MYSQL
	$bdd = new PDO('mysql:host=localhost;dbname=bartoon;charset=utf8', 'root', '');
}

catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}


$nom_ange=$_POST['ange'];

//$reponse = $bdd->query('SELECT priere1 FROM ange_priere WHERE ange= "Mahasiah" && amour= 1');

$reponse = $bdd->query('SELECT priere1, ange FROM ange_priere WHERE ange= $nom_ange AND amour= 1 AND argent= 0 AND sante= 0 AND travail= 0');
// On affiche chaque entrée une à une


//while ($donnees = $reponse->fetch())
//{
?>

    <p>

    L'ange concerne est : <strong><?php echo $_POST['ange']; ?></strong>, et la priere est : <br>
    <?php echo $donnees['priere1']; ?><br /> <?php echo $nom_ange; ?>
 
<?php
//}

//$reponse->closeCursor(); // Termine le traitement de la requête

?>
j'ai cette erreur :
Notice: Undefined variable: donnees in F:\www\testphp\cible.php on line 33

ce que je comprends puisque j'ai enlever la définition de $donnees
mais du coup j'ai essayer avec $reponse et plein de choses farfelu parce que je tourne en rond.
en fait j'ai surtout l'impression que c'est la ligne
$reponse = $bdd->query('SELECT priere1, ange FROM ange_priere WHERE ange= $nom_ange AND amour= 1 AND argent= 0 AND sante= 0 AND travail= 0');

et le $nom_ange qui ne va pas, mais j'ai mais des "" des '' je teste de partout ce que donne $nom_ange et il correspond bien a ce que je veux comme variable mais cette ligne ne semble pas prendre la valeur ...

quand je remplace $nom_ange par un vrai nom "Mahasiah" et que je remet mon while and co ça fonctionne et cela écrit bien la prière, mais je voudrais que ca soit une variable que je puisse choisir dans la liste, parce qu'a l’arrivée il y a 72 noms ...

je suis sur que je passe a coté d'un truc tout con, mais je viens d'y passer la nuit et la je suis même plus sur que ce que j'explique est clair ...
quelqu'un pourrait m'aider s'il vous plait?

merci d'avance.

Mammouth du PHP | 1967 Messages

03 août 2017, 07:57

Hello,

Pour concatèner des variables dans une chaine de caractère tu as 2 techniques

$string = 'ma chaine contient ' . $ma_variable . ' et c\'est super';
ou
$string = "ma chaine contient $ma_variable et c'est super';

remarque la différence entre l'utilisation des ' et des "
php interprète le contenu des "" au cos où il y a des variables mais pas les ''.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 2703 Messages

03 août 2017, 13:14

while ($donnees = $reponse->fetch())
répond en partie à l'erreur "Notice: Undefined variable: donnees in F:\www\testphp\cible.php on line 33"

Eléphanteau du PHP | 28 Messages

03 août 2017, 22:32

Bonsoir !
merci pour les messages, même si, j ai pas reellement tout compris Spols, mais bon quand je me suis lever cet aprem j'ai repris le truc et j'etais remotivé par les messages :) et j'ai réussi a ce que ça fonctionne, (même si je n'ai pas très bien compris exactement pourquoi :))
Je crois que j'ai vraiment des soucis a comprendre les variables, pourtant j ai lu les cours de open classroom et pas mal d'autres tutoriel. J'ai du mal a adapter les explications aux exemples :) bref je ne lâche pas l'affaire je vais continuer a essayer de m'y mettre.
Bon je sais pas si c'est très passionnant ce que j'ai fais mais je mets quand même le code qui fonctionne, il me reste encore a mettre en place la 2eme variable qui gère les catégories. Je pense que ça va être amusant :) en tout cas merci des réponses, car ça motive.

<?php

function priere_amour($magic) {
	include("connexionpriere.php");
$reponse = $pdo->prepare(
	'SELECT priere1 FROM ange_priere WHERE ange= :ange && amour= 1');
$reponse ->execute(['ange' => $_POST['ange']]);
$donnees = $reponse ->fetch();
return $donnees['priere1'];
}
{
?>

    <p>

    L'ange concerne est : <strong><?php echo $resultat; ?></strong>, et la priere est : <br>
   <?php echo (priere_amour([$_POST],1)); ?>
 
<?php
}
?>
En fait j'ai décomposer en 3 fichiers, j'ai cru lire que c’était mieux d'apprendre a faire comme ça, même si du coup j'ai un peu honte d'avoir mis autant de temps a faire ce fichier ridicule :)

Mammouth du PHP | 1967 Messages

04 août 2017, 08:01

Je te propose cette amèlioration
<?php

function priere_amour($ange) {
  include("connexionpriere.php");
$reponse = $pdo->prepare(
  'SELECT priere1 FROM ange_priere WHERE ange= :ange && amour= 1');
$reponse ->execute(['ange' => $ange]);
$donnees = $reponse ->fetch();
return $donnees['priere1'];
}
{
?>

    <p>

    L'ange concerne est : <strong><?php echo $resultat; ?></strong>, et la priere est : <br>
   <?php echo (priere_amour([$_POST['ange']],1)); ?>
 
<?php
}
?>
Ainsi tu utilisera correctement le principe d'argument de fonction, c'est a dire que tu donne à ta fonction les données dont elle a réellement besoin, et non plus un amas de donnée que tu n'utilisait finalement pas.

un autre avantage, c'est que désormais ta fonction priere_amour() est réutilisable peu importe le contexte, que ce soit depuis un formulaire comme ici ou tout autre application future. Il suffira de donner à ta fonction l'ange désiré.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 28 Messages

04 août 2017, 16:11

Bonjour
j'ai pris ton code (j 'ai juste remis le $resultat=$_POST['ange']; car sinon le $resultat qui donne l'ange a la dernière ligne n’était pas définit. Cela donne donc :
<?php

$resultat=$_POST['ange'];

function priere_amour($ange) {
  include("connexionpriere.php");
$reponse = $pdo->prepare(
  'SELECT priere1 FROM ange_priere WHERE ange= :ange && amour= 1');
$reponse ->execute(['ange' => $ange]);
$donnees = $reponse ->fetch();
return $donnees['priere1'];
}
{
?>

    <p>

    L'ange concerne est : <strong><?php echo $resultat; ?></strong>, et la priere est : <br>
   <?php echo (priere_amour([$_POST['ange']],1)); ?>
 
<?php
}
?>
et quand je teste il me dit : Notice: Array to string conversion in F:\www\testphp\priere_ange.php on line 9

pourquoiiiiii ???

Est ce que quand je fais : $resultat=$_POST['ange']; je vide ma variable $_POST['ange'] et que du coup c'est du a ca ??

(je sais je suis chiant mais j'essaye vraiment de bien comprendre)

Mammouth du PHP | 1967 Messages

05 août 2017, 15:53

J'ai copié un peu vite ton code, tu mets des [] en trop dans ton appel de fonction, du coup plutot que de passer une chaine de caractère, tu donne à ta fonction un tableau

tente ceci
priere_amour($_POST['ange'])

Au passage le 2ème paramètre ne servait à rien
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 28 Messages

06 août 2017, 02:15

Merci a toi j ai compris :)