Проверьте, может ли строка быть логическим PHP - PullRequest
8 голосов
/ 25 ноября 2011

Я получаю строку из $ _GET и хочу проверить, может ли она быть логической, прежде чем использовать ее для части запроса mysql. Есть ли лучший способ сделать это, чем:

function checkBool($string){
    $string = strtolower($string);
    if ($string == "true" || $string == "false" || 
        $string == "1" || $string == "0"){
        return true;
    }
    else {
        return false;
    }
}

if (checkBool($_GET['male'])){
    $result = mysql_query(
        "SELECT * FROM my_table " .
        "WHERE male='".$_GET['male']."'") or die(mysql_error());
}

Ответы [ 7 ]

13 голосов
/ 25 ноября 2011

Вы можете использовать is_bool() или как предложено на php.net:

<?php
$myString = "On";
$b = filter_var($myString, FILTER_VALIDATE_BOOLEAN);
?>

http://php.net/manual/en/function.is-bool.php

Последний будет принимать строки типа «on» и «yes»так же верно.

11 голосов
/ 25 ноября 2011

Кстати, есть более чистый способ написания:

function checkBool($string){
    $string = strtolower($string);
    return (in_array($string, array("true", "false", "1", "0", "yes", "no"), true));
}

Но да. Тот, который вы записали, - единственный путь.

2 голосов
/ 25 ноября 2011

Нет, вы поняли, вы больше ничего не можете сделать, вы получили все возможные значения, которые обычно считаются истинными или ложными, и вы делаете сравнение правильно, вы МОЖЕТЕ оптимизировать его, используя IN_ARRAY возможно, но даже в этом случае я нахожу эту версию довольно хорошей.

1 голос
/ 10 февраля 2016

Если вы используете флаг FILTER_NULL_ON_FAILURE, filter_var() будет работать хорошо:

function CheckBool($Value) {
  return null !== filter_var($Value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}
1 голос
/ 25 ноября 2011

Ваш checkBool () совершенно прав, ИМХО, хотя есть проблема с результирующим кодом SQL.Вы можете использовать TRUE и FALSE , но вы должны знать, что они не являются строками:

Константы TRUE и FALSE оцениваются в 1 и 0 соответственно.Имена констант могут быть записаны в любом регистре букв.

Так, где это говорит:

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

... это должно сказать это:

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

Было бы лучше, если бы checkBool() было на самом деле convertToBool(), и вы бы указали в своем запросе его значение результата, а не исходное значение $ _GET, но ваш код на самом деле не так.

Кстати, ям при условии, что вы используете тип BOOL столбца .Вот что говорится в руководстве:

Эти типы являются синонимами для TINYINT (1).Нулевое значение считается ложным.Ненулевые значения считаются истинными

Конечно, вам решать, использовать ли BOOL, ENUM, CHAR (1) или что-то еще, а также принять или нет 33 как синоним для TRUE;-)

0 голосов
/ 11 июня 2018

Вы можете использовать is_bool для проверки вашей строки:

if(is_bool($val)){
  // is boolean
}else{
  // not a boolean
}
0 голосов
/ 25 ноября 2011

Для чего бы это ни стоило, если вы действительно хотите принять «да» или «нет» в качестве действительного ввода от пользователя, то я бы сделал что-то вроде этого:

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
}
...