Как исправить 'SQLSTATE [22007]: неверный формат даты и времени: 1292 усечено неверное значение DOUBLE:' X ''

Решение (короче говоря):

Всегда используйте in_array() с третьим параметром strict true:

$arrayWithTrue = ['Andreas', 'Philipp', true];
$arrayWithNull = [1, 2, 3, null];
$arrayWithMinusOne = [-1];

var_dump(in_array('Gary', $arrayWithTrue, true)); // returns bool(false)
var_dump(in_array(0, $arrayWithNull, true)); // returns bool(false)
var_dump(in_array(true, [-1], true)); // returns bool(false)

Итак, когда вы используйте in_array() с true в качестве третьего параметра, сравнение между искомым значением и массивом выполняется строго, что означает, что in_array() работает так, как вы ожидали бы этого.

(Параметр Строгое также описано в документации php.net .)

Объяснение

Без параметра strict установлено to true, сравнение между искомым значением и каждым значением массива выполняется равенством, а не идентификатором. Это означает, что тип значения не имеет значения, и, таким образом, PHP преобразует значения внутри одного и того же типа данных, чтобы иметь возможность их сравнивать.

Это означает, что в первом примере искомое значение 'Gary' преобразуется в булево, когда его сравнивают с true, поэтому он приводит к сравнению true с true, что, очевидно, true.

То же самое происходит со вторым массивом , где 0, наконец, сравнивается с null, что приводит к true, хотя 0, очевидно, не совпадает с null (это может быть особенно сложно, когда вы работаете с числами и / или результатами функции для Например, где null может выразить пустое значение, а не 0).

Третий массив выглядит действительно странным, потому что мы проверяем значение true в массиве, которое содержит только -1, но in_array() все еще возвращает true для сравнения. В этом случае -1 преобразуется в boolean true. Таким образом, проблема в обоих направлениях одинакова.

Вы можете найти больше примеров проблемы сравнения в PHP (потому что это то же самое, что == / ===) в , это переполнение стека answer .

К сожалению, по умолчанию для параметра strict при вызове in_array() есть ... ну, да, false. : - / PHP и набирает текст ...

Последствия

Вы действительно никогда не будете называть in_array() без параметра strict , установленного на true , Если у вас нет массивов смешанных типов, и вы проверяете только значения одного типа, in_array() работает, как и ожидалось. См. Этот пример:

$arrayWithStrings = ['Andreas', 'Philipp', 'Friedrich'];
var_dump(in_array('Gary', $arrayWithStrings)); // returns bool(false)

Итак, по крайней мере, это работает так, как ожидалось. Но, на мой взгляд, гораздо проще просто вызвать in_array() с strict true. (Совместим с «проблемой впрыска SQL» ... Просто всегда используйте PDO и подготовленные инструкции, чтобы вы были в безопасности, даже если это запрос без переменных параметров. Вы всегда в безопасности.)

Be осторожно, хотя

Вы должны обязательно называть in_array() с strict true. Но есть один недостаток, хотя я хочу упомянуть (хотя это очевидно). Вы должны обязательно использовать правильные типы при вызове in_array():

$arrayWithNumbers = [1, 2, 3];
var_dump(in_array('1', $arrayWithNumbers, true)); // returns bool(false)

Но вы можете просто использовать Type Casting, когда знаете, что сравниваете числа:

$arrayWithNumbers = [1, 2, 3];
var_dump(in_array((int)'1', $arrayWithNumbers, true)); // returns bool(true)

Бонус

// Comparing false with an empty array
var_dump(in_array(false, [[]])); // returns bool(true)

Ну, да ... Просто используйте его с strict , установленным в true. ; -)

0
задан Pierre-Alain Tietz 18 January 2019 в 15:54
поделиться

1 ответ

Небольшой контроль с моей стороны, в моем контроллере, у меня есть:

->addConnections($repository[0]->getIdSite());

Когда это должно быть:

->addConnections($repository[0]->getName());

Я изменил его, теперь он работает. Извините!

0
ответ дан Pierre-Alain Tietz 18 January 2019 в 15:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: