Как лучше всего сравнить с 0 в PHP? - PullRequest
13 голосов
/ 18 мая 2009

В одном бите кода, над которым я работаю, мне нужно извлечь значение из базы данных и проверить, является ли оно 0. Первоначально я написал это как:

if ($myVal == 0) { ...

Но когда я сегодня снова посмотрел на нее, я обнаружил там ошибку:

var_dump("foo" == 0);  // bool(true)

// and while we're here...
var_dump(intval("foo")); // int(0)

Поскольку это значение поступает из базы данных, то обычно означает, что это будет строка, поэтому я полагаю, что я мог бы сделать это:

if ($myVal === "0")

но это кажется нелогичным, поскольку я на самом деле хочу иметь дело с целым числом, и это может показаться, что мы работаем со строками. (Надеюсь, это имеет смысл для вас.) Кроме того, не должно быть неожиданным, что любой данный метод доступа к БД приведёт значения к их соответствующему типу, учитывая тип поля.

Какой метод вы используете для проверки значения 0, когда это может быть строка или целое число?

Ответы [ 6 ]

20 голосов
/ 18 мая 2009

Короткая версия:

if ("$myVal" === '0')

или

if (strval($myVal) === '0')

Длинная версия:

if ($myVal === 0 || $myVal === '0')
2 голосов
/ 18 мая 2009

Лучшее, что у меня есть на данный момент:

is_numeric($myVal) && $myVal == 0
1 голос
/ 18 мая 2009

Я думаю, вы должны просто использовать

if ($myVal == 0)

Не думаю, что нужно беспокоиться о том, является ли $ myVal "foo". Вы сами сказали, что это значение будет только числом.

Другими словами, если вы когда-либо испытывали $ myVal как «foo», ошибка не в том, что «foo» == 0, а в том, что $ myVal - это «foo», когда предполагается, что это число.

1 голос
/ 18 мая 2009

Если значения, которые вы возвращаете из базы данных, являются строками, но исходный тип данных является целочисленным, то вы, вероятно, хотите, чтобы ваш DAO (объект доступа к данным или что-то еще, что извлекает данные) приводил данные к ожидаемым типам данных , Таким образом, код PHP, который смотрит на значения, смотрит на ожидаемый тип данных.

Проблема, конечно, в том, что нет соответствия 1-1 между типами данных, которые определяет БД, и типами данных, которые определяет PHP. Тем не менее, по большей части это не проблема, так как для большинства типов, которые мы обычно используем, есть эквивалентные типы: int, float, bool, string.

В результате, между местом, где вы запрашиваете базу данных, и местом, где вы проверяете эти значения, эти значения должны быть преобразованы в ожидаемые вами типы данных. Я только что протестировал mysql_fetch_object () в таблице MySQL, содержащей int (10) и varchar (50); оба поля всегда вытягивались PHP как строка типа. Поэтому, если вы хотите, чтобы одно из полей рассматривалось как int, приведите его к int, прежде чем что-либо делать с ним. Например:

$rs = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_object($rs)) {
    $RealRow->id = (int)$row->id;
    $RealRow->name = $row->name;
    // etc.
}

// ... later ...

if ($RealRow->status == 0) {
    // do something
}

Запрос и материал RealRow должны быть внутри класса / метода, чтобы он был инкапсулирован; таким образом, ЛЮБАЯ часть вашего кода, которая получает данные из table, всегда получит вместо этого объект $ RealRow, в котором все будет настроено на соответствующие типы данных. Конечно, если вы меняете типы данных, это требует ручного редактирования DAO, чтобы справиться с приведением типов; также можно было бы запросить БД, чтобы получить тип каждого поля (с «SHOW COLUMNS FROM table»), и автоматически приведёт поля к нужному типу данных.

0 голосов
/ 01 апреля 2017
if( ('integer' === gettype($is_anonymous) && $is_anonymous === 0 )
    ||
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')    
 ) {
    echo 'matches';
}
0 голосов
/ 18 мая 2009

Попробуйте использовать intval () для приведения строки к int

if( intval($myVal) == 0 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...