Сделать mysql fetch assoc автоматически обнаруживать возвращаемые типы данных?
при использовании mysql_fetch_assoc в PHP, как я могу заставить его вернуть правильные типы данных? Прямо сейчас он, похоже, преобразует все в строки, Я бы предпочел, чтобы он оставил Ints как Ints и как-то обозначил дату/время как объект или как-то отличается от строк.
причина этого в том, что я использую PHP в качестве бэкэнда для приложения Flex, а Flex имеет некоторые функции, такие как автоматическое обнаружение типов возврата, которые не работают так хорошо, если все приходит в качестве струны.
4 ответов
Я думаю, что хорошей стратегией здесь является программно определить тип данных каждого столбца в таблице и соответственно привести возвращаемые результаты. Это позволит вам взаимодействовать с вашей базой данных более согласованным и простым способом, предоставляя вам контроль, необходимый для хранения переменных правильного типа данных.
одно из возможных решений: вы можете использовать mysql_fetch_field() для получения объекта, который содержит метаданные о столбце таблицы и затем верните строку к нужному типу.
//run query and get field information about the row in the table
$meta = mysql_fetch_field($result, $i);
//get the field type of the current column
$fieldType = $meta->type
полный пример можно найти здесь:http://us2.php.net/manual/en/function.mysql-fetch-field.php
поскольку PHP слабо типизирован, вы должны иметь относительно легкое время с этим.
Если вы используете методы OO (объектно-ориентированные), вы можете создать класс с этой функциональностью в методах setter (), чтобы вам не пришлось дублировать код.
просто вносит небольшое улучшение ответить mastermind202 обрабатывать больше типов данных. Спасибо mastermind для делать тяжелый подниматься!
function cast_query_results($rs) {
$fields = mysqli_fetch_fields($rs);
$data = array();
$types = array();
foreach($fields as $field) {
switch($field->type) {
case MYSQLI_TYPE_NULL:
$types[$field->name] = 'null';
break;
case MYSQLI_TYPE_BIT:
$types[$field->name] = 'boolean';
break;
case MYSQLI_TYPE_TINY:
case MYSQLI_TYPE_SHORT:
case MYSQLI_TYPE_LONG:
case MYSQLI_TYPE_INT24:
case MYSQLI_TYPE_LONGLONG:
$types[$field->name] = 'int';
break;
case MYSQLI_TYPE_FLOAT:
case MYSQLI_TYPE_DOUBLE:
$types[$field->name] = 'float';
break;
default:
$types[$field->name] = 'string';
break;
}
}
while($row=mysqli_fetch_assoc($rs)) array_push($data,$row);
for($i=0;$i<count($data);$i++) {
foreach($types as $name => $type) {
settype($data[$i][$name], $type);
}
}
return $data;
}
пример использования:
$db = mysqli_connect(...);
$rs = mysqli_query($db, "SELECT ...");
$results = cast_query_results($rs);
возвращает ассоциативный массив строк с полями
вы можете создать MySQL-специфичный слой вокруг mdb2, который автоматически обнаруживает типы полей с помощью ПОКАЗАТЬ СТОЛБЦЫ команда, но это будет своего рода поражение цели использования mdb2.
имейте в виду, также, что mysql поддерживает целые числа далеко за пределами диапазона PHP, (UNSIGNED BIGINT-64 бита; PHP поддерживает, в лучшем случае, 64 бит подпись ints и менее на 32-битных платформах), поэтому автоматическое литье может быть нежелательным в некоторых контекстах. В тех случаях, вы действительно хотите сохранить большие ints в их Строковой форме и манипулировать ими с помощью bcmath
Я хотел поделиться функцией, которую я написал для этой же проблемы. Передайте результат запроса $rs
и получить массив assoc литых данных в качестве возврата:
function cast_query_results($rs) {
$fields = mysqli_fetch_fields($rs);
$data = array();
$types = array();
foreach($fields as $field) {
switch($field->type) {
case 3:
$types[$field->name] = 'int';
break;
case 4:
$types[$field->name] = 'float';
break;
default:
$types[$field->name] = 'string';
break;
}
}
while($row=mysqli_fetch_assoc($rs)) array_push($data,$row);
for($i=0;$i<count($data);$i++) {
foreach($types as $name => $type) {
settype($data[$i][$name], $type);
}
}
return $data;
}
пример использования:
$dbconn = mysqli_connect('localhost','user','passwd','tablename');
$rs = mysqli_query($dbconn, "SELECT * FROM Matches");
$matches = cast_query_results($rs);
// $matches is now a assoc array of rows properly casted to ints/floats/strings