10
votes

Test si la chaîne pourrait être boolean php

Je reçois une corde à partir d'un _GET et je tiens à tester si cela pourrait être un booléen, avant de l'utiliser pour une partie d'une requête MySQL. Y a-t-il une meilleure façon de le faire que: xxx


8 commentaires

Cela ne fonctionnera de toute façon. Quel est votre type de colonne pour mâle ? Le type Boolean MySQL n'est vraiment qu'un tinyint (1) donc si c'est que vous ne devriez alors vérifier que 1s ou 0s. Si vous utilisez CHAR / VARCHAR et que vous avez déjà défini sur "TRUE", comparez-la avec "Oui" ou "1" ne correspondra toujours pas.


Point pris pour vérifier Oui et Non, édité mon extraiplement en conséquence. Type de colonne est en effet Tinyint (1)! tellement vrai, faux, 1 et 0 est ce que j'ai besoin de vérifier


@Dexcurl, cela ne change rien vraiment. Vous devrez toujours utiliser votre propre fonction, réécriture de votre réponse ci-dessous.


Vérification de la chaîne équivalence ne fonctionnera cependant pas. Votre SQL met $ _GET ['mâle'] à l'intérieur des marques de devis, donc si $ _GET ['mâle'] était "vrai" que vous obtiendriez choisir * de my_table où mâle = "vrai '. Cela retournera en fait des lignes où mâle = 0 parce que MySQL tente de convertir la chaîne "true" à un nombre mais ne peut pas ainsi qu'il lui donne la valeur 0. Sortez les devis simples et cela fonctionne comme prévu.


@Daiscog, je crois que vous n'avez pas eu le point de la question.


@Daiscog Test ceci maintenant et apparemment au travail parfaitement


@JEffPigarelli Je comprends la question, soulignez simplement que Sélectionnez * à partir de My_Table où mâle = 'true' pourrait ne pas se comporter comme étant vous attendre et SELECT * de My_Table où le mâle = vrai < / code> est ce dont vous avez besoin.


@DEXCURL SELECT * de My_Table où mâle = "vrai" n'a pas fonctionné quand je l'ai essayé.


8 Réponses :


2
votes

Non, vous l'avez eu, vous n'avez rien de plus que vous pouvez faire, vous avez toutes les valeurs possibles qui seraient normalement considérées comme vraies ou fausses et que vous faites la comparaison de la bonne façon, vous pouvez l'optimiser à l'aide d'un in_array Peut-être, mais même si, je trouve déjà cette version déjà bonne.


0 commentaires

17
votes

Vous pouvez soit utiliser is_bool () ou comme suggéré sur php.net:xxxx

http://php.net/manual/fr/funfunction.is-bool.php

Le dernier acceptera des chaînes comme "on" et "oui" aussi vrai aussi.


5 commentaires

+1 J'utilise PHP depuis des années et je n'ai jamais entendu parler de cette fonction "filtre_var". frais! Bien que vous deviez utiliser PHP> = 5.2. Merci!


Cela ne résout pas vraiment rien. "FALSE" retournera false dans les deux is_bool () et $ b .


Merci pour votre réponse Zrvan! is_bool () ne fonctionne pas avec des chaînes telles que testées par var_dump (is_bool ("vrai")); et filtrer_var fonctionne bien pour transformer quelque chose en une réponse booléenne, mais j'avais besoin de quelque chose à vérifier si la chaîne est un booléen premier


is_bool () fonctionne avec des chaînes: elle retourne toujours false, quelle est la bonne réponse puisque les chaînes sont des cordes, pas des booléens ;-p


@ Shoe Voir mon Répondre pour comment filtre_var () peut être utilisé pour valider les chaînes comme "Faux «Et être une solution viable au problème.



12
votes

Il y a, à la manière, une façon plus propre d'écrire: xxx

mais oui. Celui que vous avez écrit est le seul moyen.


7 commentaires

Merci pour votre Jeff, très bonne façon de le faire. Très appréciée!


Cela pourrait avoir l'air Natre mais implique plus de frais généraux pour PHP. Il doit créer un tableau, le stocker dans le tas, puis appeler une autre fonction qui fait la comparaison. La fonction d'origine est plus efficace.


@Daiscog, sérieusement? Combien coûte plus? 0.000000000000000000000000000001 Nanoseconde pour effectuer 123456789 appels à cette fonction? Il sera probablement près de 3 minutes le temps que vous devrez déterminer ce que cette fonction originale fait.


Haha, oui j'ai beaucoup cette discussion. Mais je pense que la fonction originale est assez claire et je suis l'une des brigade "TOUTES CYCLE CYCLE", j'ai peur. À l'ancienne, je suppose, mais je pense que tout s'ajoute, en particulier dans les grandes applications.


Voir Ma réponse à une autre question pour une solution plus flexible (mais plus verbose). Dexcurl devrait vraiment utiliser des requêtes paramétrées , de toute façon.


L'appel à in_array () devrait inclure true pour le troisième paramètre pour effectuer une comparaison stricte si vous souhaitez n'avoir pas "1.0" ou "0,0" traité comme un bool.


@Justinschwartzenberger merci. Mis à jour.



0
votes

Pour ce que ça vaut la peine, si vous vouliez vraiment accepter "oui" ou "non" comme entrée valide de l'utilisateur, je ferais quelque chose comme ceci:

function toBoolean($string){
    $string = strtolower($string);
    if ($string == "true" || $string == "1"|| $string == "yes" )
        return true;
    elseif ($string == "false" || $string == "0" || $string == "no")
        return false;
    else
        throw new Exception("You did not submit a valid value, you naughty boy");
}

try {
    $query = "SELECT * FROM my_table WHERE male=" . (toBoolean($_GET['male']) ? "1" : "0" );
    $result = mysql_query($query) or die(mysql_error());
} catch (Exception $e) {
    // handle bad user input here
}


1 commentaires

Qu'en est-il de récupérer toutes ces instructions ... "Chaque cycle d'horloge compte" Brigade ... Ahah



1
votes

Votre checkbool () est tout à fait juste, IMHO, bien qu'il y ait un problème avec le code SQL résultant. Vous pouvez utiliser true et false , mais vous devez être conscient qu'ils ne sont pas des cordes:

Les constantes vraies et fausses évaluent respectivement à 1 et 0. Les Les noms constants peuvent être écrits dans n'importe quelle lettre. P> blockQuote>

alors où il est dit que: p> xxx pré>

... il devrait dire ceci: p>

'SELECT * FROM my_table WHERE male='.$_GET['male']


0 commentaires

4
votes

Si vous utilisez le drapeau filtre_null_on_failure code>, filtre_var () code> fonctionnera bien:

function CheckBool($Value) {
  return null !== filter_var($Value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}


0 commentaires

0
votes

Vous pouvez utiliser is_bool pour tester votre chaîne: xxx


1 commentaires

is_bool retournera true si $ VAL est "pure" true ou false , mais il retournera false pour "vrai" et "false" cordes.



2
votes

Les variables booléennes contiennent des valeurs vraies ou fausses. Pour tester si la chaîne pourrait être booléenne, différentes approches peuvent être utilisées:

  • is_bool ($ var) :. Les contrôles is_bool () fonction si le type d'une variable est booléenne et renvoie true ou false

  • Comparaison avec « === » ou ($ var === vrai || $ var === false) : Si vous comparez la variable avec l'opérateur « === » avec vrai et faux et si elle est identique à l'une des valeurs, il est alors une valeur booléenne. Étant donné que la fonctionnalité de is_bool ($ var) est le même, la fonction doit être préféré.

  • Comparaison avec « == » ou ($ var == true || $ var == false) : Si vous utilisez « == » comme un opérateur à la place, le test est plus tolérant. Par exemple, 0 (nombre entier) ou « » (chaîne vide) se traduirait aussi par une valeur booléenne.

    En savoir plus Comment pour vérifier si une variable est un booléen en PHP?


0 commentaires