Pb bouton radio booléen

Eléphant du PHP | 91 Messages

23 juil. 2007, 12:02

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());


ViPHP
ViPHP | 928 Messages

23 juil. 2007, 12:34

Boolean c'est true ou false, essaie avec un de ces deux mots clefs ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 juil. 2007, 12:47

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());
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 91 Messages

23 juil. 2007, 14:05

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juil. 2007, 14:16

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" ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 91 Messages

23 juil. 2007, 14:52

Voici l'erreur:

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

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

ViPHP
ViPHP | 928 Messages

23 juil. 2007, 14:55

Essaie comme ceci :
$reponse = ( isSet($_POST['Ques_catalogue_existant']) && $_POST['Ques_catalogue_existant'] == 'Oui' ) ? 1 : 0; 

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juil. 2007, 15:02

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....
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 91 Messages

23 juil. 2007, 15:08

Merci Genova, ça marche.
Merci aussi à tous les autres.
Bonne journée et à bientôt pour un autre problème.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 juil. 2007, 15:17

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer