У меня есть таблица в mysql:
CREATE TABLE user (id INT, name VARCHAR(250));
Я запрашиваю таблицу:
$result = mysql_query("SELECT id,name FROM user");
Я собираю результаты:
while($row = mysql_fetch_assoc($result) $rv[] = $row;
И я возвращаю данные:
echo json_encode($rv);
Проблема в том, что id возвращается как строка, а не int, даже до json_encode. Если i force $ row ['id'] = (int) $ row ['id']; – он отлично работает.
Как заставить mysql возвращать правильный тип данных в строке $?
10x.
PDO-> bindColumn может это
$stmt = $dbh->prepare($sql); $stmt->bindColumn('int_col', $intVar, PDO::PARAM_INT); $stmt->bindColumn('string_col', $strVar, PDO::PARAM_STR); $stmt->execute(); $stmt->fetch(PDO::FETCH_BOUND);
$ intVar будет автоматически преобразован в int
К сожалению, с PHP <= 5.2 функции / классы MySQL (т.е. mysql_*
, mysqli_*
и PDO
) основаны на libmysql – библиотеке C, которая обеспечивает поддержку связи с сервером MySQL.
Функции, использующие эту библиотеку, всегда возвращают строки, даже для столбцов integer и float, и вы ничего не можете с этим поделать: единственным решением является наличие некоторого «слоя сопоставления» (такого как ORM), который «знает», на PHP side, который должен содержать каждый столбец, и будет делать преобразование каждый раз, когда некоторые данные извлекаются из базы данных.
Примечание. То, как вы вставляете данные, ничего не меняет о том, что вы получите строки при извлечении данных из БД.
С PHP> = 5.3 функции, которые обмениваются данными с сервером MySQL, могут использовать mysqlnd (MySQL Native Driver) вместо libmysql – это должно быть настроено во время компиляции.
И возможность общения с «родными» типами данных при определенных обстоятельствах является одной из приятных вещей, которые предоставляет mysqlnd; о том, что в этой статье должно быть несколько интересной информации: PHP: новый сетевой трафик, экономия памяти и памяти с помощью mysqlnd .
Чтобы сделать вещи короткими: