Привет, ребята У меня есть табличное поле в базе данных MySQL:
userid INT(11)
Поэтому я вызываю его на свою страницу с помощью этого запроса:
"SELECT userid FROM DB WHERE name='john'"
Затем для обработки результата я делаю:
$row=$result->fetch_assoc(); $id=$row['userid'];
Теперь, если я это сделаю:
echo gettype($id);
Я получаю строку. Разве это не должно быть целым?
благодаря
Лука
Когда вы выбираете данные из базы данных MySQL с использованием PHP, тип данных всегда будет преобразован в строку. Вы можете преобразовать его обратно в целое число, используя следующий код:
$id = (int) $row['userid'];
Или с помощью функции intval()
:
$id = intval($row['userid']);
Используйте mysqlnd (собственный драйвер) для php. Если вы на ubuntu:
sudo apt-get install php5-mysqlnd sudo service apache2 restart
Собственный драйвер возвращает целые типы соответствующим образом.
Редактировать:
Как отметил @Jeroen, этот метод будет работать только для PDO (а не для mysqli).
Мое решение состоит в том, чтобы передать результат запроса $rs
и получить массив-зависимый элемент данных в качестве возвращаемого значения:
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
Нет. Независимо от типа данных, определенного в ваших таблицах, драйвер MySQL MySQL всегда служит для значений строк в виде строк.
Вам нужно указать свой идентификатор в int.
$row = $result->fetch_assoc(); $id = (int) $row['userid'];
Самое простое решение:
Вы можете заставить json_encode использовать действительные числа для значений, которые выглядят как числа:
json_encode($data, JSON_NUMERIC_CHECK)
(начиная с PHP 5.3.3).
Или вы можете просто указать свой идентификатор в int.
$row = $result->fetch_assoc(); $id = (int) $row['userid'];
Мне нравится ответ Чада, особенно когда результаты запроса будут переданы javascript в браузере. Javascript обрабатывает чисто числовые объекты как числа, но требует дополнительной работы для обработки числовых объектов, таких как строки. т.е. должны использовать parseInt или parseFloat на них.
Основываясь на решении Чада, я использую это, и часто это именно то, что мне нужно, и создает структуры, которые могут быть закодированы JSON для удобства работы с javascript.
while ($row = $result->fetch_assoc()) { // convert numeric looking things to numbers for javascript foreach ($row as &$val) { if (is_numeric($val)) $val = $val + 0; } }
Добавление числовой строки в 0 создает числовой тип в PHP и правильно идентифицирует тип, поэтому числа с плавающей запятой не будут усечены в целые числа.
Вы можете сделать это с помощью …
… в зависимости от расширения, которое вы хотите использовать. Первое не рекомендуется, поскольку расширение mysql устарело. Третья по-прежнему экспериментальная.
Комментарии к этим гиперссылкам хорошо объясняют, как установить свой тип из простой старой строки в исходный тип в базе данных.
Некоторые рамки также абстрагируют это (CodeIgniter предоставляет $this->db->field_data()
).
Вы также можете делать догадки – например, зацикливать полученные результирующие строки и использовать is_numeric () для каждого. Что-то вроде:
foreach($result as &$row){ foreach($row as &$value){ if(is_numeric($value)){ $value = (int) $value; } } }
Это превратило бы все, что похоже на число в один … определенно не идеально.
MySQL имеет драйверы для многих других языков, преобразовывая данные в строковые «стандартизованные» данные и оставляя их пользователю для ввода значений типа int или других
В моем проекте я обычно использую внешнюю функцию, которая «фильтрует» данные, полученные с помощью mysql_fetch_assoc
.
Вы можете переименовывать поля в своей таблице, чтобы было понятно, какой тип данных хранится.
Например, вы можете добавить специальный суффикс в каждое числовое поле: если userid
является INT(11)
вы можете переименовать его userid_i
или если это UNSIGNED INT(11)
вы можете переименовать userid_u
. На этом этапе вы можете написать простую функцию PHP, которая получает в качестве входных данных ассоциативный массив (извлекается с помощью mysql_fetch_assoc
) и применяет литье к «значению», хранящемуся с этими специальными «ключами».
Если используются подготовленные утверждения, тип будет там, где это необходимо. Этот код возвращает массив строк, где каждая строка является ассоциативным массивом. Например, если fetch_assoc()
был вызван для всех строк, но с сохраненной информацией типа.
function dbQuery($sql) { global $mysqli; $stmt = $mysqli->prepare($sql); $stmt->execute(); $stmt->store_result(); $meta = $stmt->result_metadata(); $params = array(); $row = array(); while ($field = $meta->fetch_field()) { $params[] = &$row[$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $params); while ($stmt->fetch()) { $tmp = array(); foreach ($row as $key => $val) { $tmp[$key] = $val; } $ret[] = $tmp; } $meta->free(); $stmt->close(); return $ret; }
Помещение плюса перед переменной также делает трюк,
$a = "120"; $b = +$a; echo gettype($b);
Очевидно, что это не лучший способ, но работает, когда у вас нет доступа к среде для установки лучшего драйвера.