Page 1 sur 1

Pb bouton radio booléen

Posté : 23 juil. 2007, 12:02
par laeti
Bonjour,

Dans un formulaire, j'ai un groupe de bouton radio avec comme valeur oui ou non. Dans ma base de données, j'ai typé mon champs correspond au groupe de bouton radio en bool. Lorsque je souhaite récupérer la valeur du bouton coché pour l'insérer, j'ai une erreur:

Query failed: ERROR: invalid input syntax for type boolean: "Oui"

Je n'aurai pas dû typer en bool? ou dois-je convertir ma variable en bool?
Est-ce que quelqu'un pourrait m'aider un peu?

<TR>
	<TD><font face="Verdana" size="1">Vos données sont-elles cataloguées ?:</font></TD>
	<TD><input type="radio" name="Ques_catalogue_existant" value="Oui"><font face="Verdana" size="1">Oui</font></TD>
        <TD><input type="radio" name="Ques_catalogue_existant" value="Non"><font face="Verdana" size="1">Non</font></TD>
</TR>

//Traitement de la saisie

// On prépare la requête pour insérer les réponses aux questions booléennes dans la table questions_ouinon et on exécute la requête
		$sql = "INSERT INTO questions_ouinon(ques_catalogue_existant) VALUES ('".$Ques_catalogue_existant."')";
		$req = pg_query($sql) or die('Erreur SQL !'.$sql.'<br>'.pg_result_error());


Posté : 23 juil. 2007, 12:34
par Genova
Boolean c'est true ou false, essaie avec un de ces deux mots clefs ;)

Posté : 23 juil. 2007, 12:47
par zeus
Ou, pour ne pas être tributaire du formulaire, tu peut modifier la récupération de la réponse.
De plus, prend l'habitude d'utiliser les superglobales $_GET et $_POST. Car, actuellement, tant que la directive de configuration register_global est activée, ça marche ... mais c'est en phase de disparaitre ;)

Voici un exemple de ce que je te conseille :
// Récupération de la réponse
$reponse = ( $_POST['Ques_catalogue_existant'] == 'Oui' ) ? true : false; // $reponse va contenir true si le choix "Oui" à été sélectionné, false dans tout les autres cas
// On prépare la requête pour insérer les réponses aux questions booléennes dans la table questions_ouinon et on exécute la requête
        $sql = "INSERT INTO questions_ouinon(ques_catalogue_existant) VALUES ('" . $reponse . "')";
        $req = pg_query($sql) or die('Erreur SQL !'.$sql.'<br>'.pg_result_error());

Posté : 23 juil. 2007, 14:05
par laeti
Merci beaucoup pour ton bout de code. Cela marche très bien lorsque je coche OUI mais j'ai une erreur pour le NON. Je ne comprends pas.
Merci aussi pour le conseil sur le $_POST.

Posté : 23 juil. 2007, 14:16
par Ryle
Et tu ne voudrais pas partager le message d'erreur avec nous, qui ne sommes pas devant ton écran ? ;)

A noter que si aucune valeur n'est cochée (sachant que tu n'en a coché aucune par défaut), le champ ne sera pas envoyé et tu auras probablement une erreur du type $_POST['...'] n'est pas définie. Il faut dans ce cas tester si la variable existe avec isSet() avant de pouvoir l'utiliser :)
$reponse = ( isSet($_POST['Ques_catalogue_existant']) && $_POST['Ques_catalogue_existant'] == 'Oui' ) ? true : false;
A noter que le test effectué dans la parenthèse retourne déjà un booléen (vrai ou faux) on peût réduire le code à :
$reponse = ( isSet($_POST['Ques_catalogue_existant']) && $_POST['Ques_catalogue_existant'] == 'Oui' ) ;
En effet, l'opérateur ternaire n'a pas un grand intérêt : "si l'expression est vraie retourne vrai, sinon retourne faux" revient au même que "retourne la valeur de l'expression" ;)

Posté : 23 juil. 2007, 14:52
par laeti
Voici l'erreur:

Query failed: ERROR: invalid input syntax for type boolean: ""

Le test sur la variable ne change rien.[/php]

Posté : 23 juil. 2007, 14:55
par Genova
Essaie comme ceci :
$reponse = ( isSet($_POST['Ques_catalogue_existant']) && $_POST['Ques_catalogue_existant'] == 'Oui' ) ? 1 : 0; 

Posté : 23 juil. 2007, 15:02
par Ryle
C'est parceque pour php FALSE, 0 et "" (chaine vide), c'est du pareil au même... du coup il colle une chaine vide au lieu du zéro attendu...

Si la solution de Genova ne change rien, tu peux essayer avec un cast implicite :
$sql = "INSERT ... VALUES ('" . ( (int) $reponse ) . "')"; 
A tester....

Posté : 23 juil. 2007, 15:08
par laeti
Merci Genova, ça marche.
Merci aussi à tous les autres.
Bonne journée et à bientôt pour un autre problème.

Posté : 23 juil. 2007, 15:17
par zeus
En fait, ma solution via l'opérateur ternaire avait un sens dans l'idée que je voulais écrire ça :
// Récupération de la réponse
$reponse = ( $_POST['Ques_catalogue_existant'] == 'Oui' ) ? 'true' : 'false';

Put*** de coloration syntaxique qui n'est pas présente dans la zone de saisie :lol:


En fait, il ne faut pas que tu passes les valeurs booléennes à ta requête mais le texte "true" ou "false" pour que ça soit le SGBD et non pas le PHP qui l'interprète ;)