У меня есть поле таблицы в базе данных 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
Если вы находитесь на Centos:
sudo yum install php-mysqlnd
sudo service httpd restart
Собственный драйвер возвращает целочисленные типы соответственно.
Редактировать:
Как отметил @Jeroen, этот метод будет работать только из коробки для PDO.
Как указал @LarsMoelleken, этот метод будет работать с mysqli, если вы также установите для опции MYSQLI_OPT_INT_AND_FLOAT_NATIVE значение true.
Пример:
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, TRUE);
Мое решение состоит в том, чтобы передать результат запроса $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
Самое простое решение, которое я нашел:
Вы можете заставить json_encode использовать фактические числа для значений, которые выглядят как числа:
json_encode($data, JSON_NUMERIC_CHECK)
(начиная с PHP 5.3.3).
Или вы можете просто привести свое удостоверение личности к int.
$row = $result->fetch_assoc();
$id = (int) $row['userid'];
Нет. Независимо от типа данных, определенных в ваших таблицах, драйвер MySQL PHP всегда обслуживает значения строк как строки.
Вы должны привести свой идентификатор к 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 или другим.