Неявное преобразование чисел в строки в PHP в результатах запроса к MySQL
26 июня 2011, 4:33
Автор: 1234ru
Неявное преобразование чисел в строки в результатах запроса к MySQL
При работе с MySQL в PHP следует помнить, что числа в результатах запроса неявно преобразуются в строки:
Оба числа в итоге оказались строками:
Это может приводить к неожиданному поведению программ, когда нужно проверить значение на пустоту.
Не беда, если сравнение происходит с целым числом — в этом случае сравнение даст ожидаемый результат:
К FALSE приводится и нулевая величина с плавающей точкой:
Однако следующая конструкция даст результат, противоположный ожидаемому:
Поэтому при подобных проверках чисел с плавающей точкой следует всегда явно приводить их к своему типу:
При работе с MySQL в PHP следует помнить, что числа в результатах запроса неявно преобразуются в строки:
$result = mysql_query("SELECT 0, 0.000");
$row = mysql_fetch_row($result);
var_dump($row);
$row = mysql_fetch_row($result);
var_dump($row);
Оба числа в итоге оказались строками:
array(2) {
[0]=>
string(1) "0"
[1]=>
string(5) "0.000"
}
[0]=>
string(1) "0"
[1]=>
string(5) "0.000"
}
Это может приводить к неожиданному поведению программ, когда нужно проверить значение на пустоту.
Не беда, если сравнение происходит с целым числом — в этом случае сравнение даст ожидаемый результат:
echo ($row[0])
? '0 is NOT FALSE!'
: '0 is FALSE (OK)';
// выведет '0 is FALSE (OK)'
? '0 is NOT FALSE!'
: '0 is FALSE (OK)';
// выведет '0 is FALSE (OK)'
К FALSE приводится и нулевая величина с плавающей точкой:
echo (0.000)
? '0.000 is NOT FALSE!'
: '0.000 is FALSE (OK)' ;
// 0.000 is FALSE
? '0.000 is NOT FALSE!'
: '0.000 is FALSE (OK)' ;
// 0.000 is FALSE
Однако следующая конструкция даст результат, противоположный ожидаемому:
echo ($row[1]) // тут 0.000 из MySQL
? '0.000 from MySQL is NOT FALSE!'
: '0.000 from MySQL is FALSE (OK)' ;
// 0.000 from MySQL is NOT FALSE!
? '0.000 from MySQL is NOT FALSE!'
: '0.000 from MySQL is FALSE (OK)' ;
// 0.000 from MySQL is NOT FALSE!
Поэтому при подобных проверках чисел с плавающей точкой следует всегда явно приводить их к своему типу:
echo (floatval($row[1])) // тут 0.000 из MySQL
? 'floatval of 0.000 from MySQL is NOT FALSE!'
: 'floatval of 0.000 from MySQL is FALSE (OK)' ;
// floatval of 0.000 from MySQL is FALSE (OK)
? 'floatval of 0.000 from MySQL is NOT FALSE!'
: 'floatval of 0.000 from MySQL is FALSE (OK)' ;
// floatval of 0.000 from MySQL is FALSE (OK)