Problème comparaison du contenu d'une variable

Fermé
scarsroga Messages postés 2 Date d'inscription samedi 11 avril 2015 Statut Membre Dernière intervention 12 avril 2015 - 11 avril 2015 à 14:37
scarsroga Messages postés 2 Date d'inscription samedi 11 avril 2015 Statut Membre Dernière intervention 12 avril 2015 - 12 avril 2015 à 16:50
Bonjour,

J'ai un problème de comparaison du contenu d'une variable à true/false.

Voici la fonction en php qui retourne le résultat d'existence d'un nom d'hotel et qui retourne un résultat correct :


$nom=$_POST['nom'];
$query = mysql_query("SELECT nomH FROM hotel WHERE nomH = '$nom'" );
$res=mysql_num_rows($query);

if( $res== 1)
echo 'true';
else
echo 'false';


Et voici le code de vérification. Le problème est dans la comparaison.

$(document).ready(function(){
$('#formHotel').submit(function() {
$.ajax({
type: 'POST',
url: 'existence_hotel.php',
data: $(this).serialize(),
success:
function(reponse) {
if(reponse == 'true'){
console.log("Hotel existant");
}
else
{
console.log("nouveau");
}
}
});
return false;
});
});


Ce code m'affiche toujours le message "nouveau".

Merci.

2 réponses

Salut,

sans m'attarder je vois que vous écrivez:

if(reponse == 'true')

Les guillemets indique que vous parlez d'un texte qui a comme contenu 'true'.
Or la valeur tue n'est pas un texte, cela à rapport avec e typage des variables.

Le type d'une variable est peut important en PHP mais utile quand même.
On parles d'un type de variable pour indiquer à quoi correspond sa valeur.
Par exemple en PHP(qu'on dit peu typé) il n'y a pas de différences entre le type numérique et le type texte.

var nombre=10;
et var texte='10';
Sont équivalent même si l'utilisation des guillemets indique une valeur texte(2ème var) et l'écriture sans guillemet fais référence à une valeur numérique.

Par contre quant on parle utilise une valeur il faut utiliser la syntaxe adaptée.

Vous ne pouvez pas écrire:

var resultat= 10+'5';
car vous ne pouvez additionner un nombre avec une chaîne de caractère(du texte).

Il en est de même de vos comparaisons:

reponse == 'true'
indique la condition réponse est identique à la chaîne de caractère 'true' ce qui n'est pas le cas de la valeur booléenne true. true/false est de type booléen donc il faut utiliser le mot qui lui est attribué:

reponse == true;
ne sera pas lu comme une chaîne de caractère mais comme la valeur true.
Tout comme
reponse==0;

Même remarque avec la valeur null

if(valeur=='null')

Ici on compare avec une chaîne de caractères pour savoir si celle ci contient exactement comme valeur le texte null et non la valeur null(pour une variable non assignée) et qui s'écrit comme ceci
if(valeur==null){
echo ('la variable est indéfinie');
}

Plus d'informations et toutes les valeurs utilisables pour le booléen true dans la doc de php:
http://php.net/manual/fr/language.types.boolean.php
0
ps:
puisque vous cherchez à obtenir un nombre à partir d'enregistrements dans une base pourquoi ne pas utiliser tout simplement COUNT et vous simplifier le PHP.
Avec COUNT vous obtiendrez le nombre d'hôtel ayant le nom recherché et vous avez une condition toute simple:
if($res>0){
//il y a un hôtel de ce nom là
}else{}
//pas d'hôtel portant ce nom
]

Surtout que ça peut être pratique avec la condition LIKE pour éviter le formalisme de devoir écrire le nom exact.

ps2:
if( $res== 1)
echo 'true';
else
echo 'false';

Dans l'état il vous manque l'attribution de la variable à tester et n'oubliez pas que 'true' indique du texte et true la valeur vrai.
0
scarsroga Messages postés 2 Date d'inscription samedi 11 avril 2015 Statut Membre Dernière intervention 12 avril 2015
Modifié par scarsroga le 12/04/2015 à 17:14
Bonjour,

Merci pour votre réponse. J'ai pris en considération vos conseils et j'ai abouti au bon résultat en utilisant le booléen.

En revanche, j'ai voulu bloquer l'envoi du formulaire lorsque l'hôtel existe. Le fait d'écrire return false bloque le renvoie.
J'y est ajouté un test avec une variable booléenne et ça n'a pas marché.
En affichant le résultat de la variable booléenne j'ai trouvé que l'exécution ne se fait pas dans l'ordre. C'est à dire il exécute les instruction de test puis il exécute le bloc "ajax" pour le contrôle.

Je n'ai pas compris la cause. J'ai même essayé de mettre le bloc ajax dans une fonction externe et l'appeler , ça donne le même résultat.

Voila le code pour mieux comprendre :


$(document).ready(function(){

$('#formHotel').submit(function() {
var existe=false;

/**** Bloc exécuté en 2eme position *****/

$.ajax({
type: 'POST',
url: 'existence_hotel.php',
data: $(this).serialize(),
success:
function(reponse) {


if(reponse == true){
console.log("Hotel existant");
existe=true;
}
else
console.log("Nouveau hotel");

console.log("Message 1 : existe =" + existe);

}
});


/**** Bloc exécuté en 1ere position *****/

console.log("Message 2 : existe =" + existe);

if(existe)
return false; // bloquer l'envoi du formulaire
});
});


Voici le résultat de l'affichage :


Et dans tous les cas, il teste sur existe = false , donc le formulaire n'est pas bloqué.

PS : Lorsque je ne met pas de test, le blocage d'envoi est validé. Et lorsque je ne met pas de return, le formulaire est envoyé.

Merci.
0