mysql_query сохранить тип данных, созданный в таблице на возврат? - PullRequest
5 голосов
/ 23 февраля 2010

У меня есть таблица в 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. Если я заставлю $ row ['id'] = (int) $ row ['id']; - отлично работает.

Как я могу заставить mysql возвращать правильный тип данных в строке $?

10x.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

К сожалению, в PHP <= 5.2 функции / классы MySQL (т.е. <code>mysql_*, mysqli_* и PDO) основаны на libmysql - библиотеке C, которая обеспечивает поддержку связи с сервером MySQL.

Функции, использующие эту библиотеку, всегда возвращают строки, даже для целочисленных и плавающих столбцов - и с этим ничего не поделаешь: единственное решение - иметь некоторый «слой отображения» (например, ORM) который «знает», на стороне PHP, какой тип должен быть у каждого столбца, и будет выполнять преобразование каждый раз, когда некоторые данные извлекаются из базы данных.

Примечание: способ, которым вы вставляете данные, ничего не меняет в том факте, что вы получите строки при извлечении данных из БД.


С PHP> = 5.3 функции, которые взаимодействуют с сервером MySQL, могут использовать mysqlnd (MySQL Native Driver) вместо libmysql - хотя это должно быть настроено во время компиляции.

И способность общаться с «нативными» типами данных при определенных обстоятельствах является одной из приятных вещей, которые предоставляет mysqlnd; Об этом должна быть пара интересных сведений в этой статье: PHP: новый сетевой трафик, экономия ресурсов процессора и памяти с помощью mysqlnd .


Чтобы сделать вещи короткими:

  • В PHP 5.2 вы будете получать только строки из базы данных; и вам придется самостоятельно выполнять преобразование типов
  • В PHP 5.3 вы можете получить собственные типы данных - по крайней мере, в некоторых случаях.
2 голосов
/ 23 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...