MySQL целочисленное поле возвращается как строка в PHP

Привет, ребята У меня есть табличное поле в базе данных 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 и правильно идентифицирует тип, поэтому числа с плавающей запятой не будут усечены в целые числа.

    Вы можете сделать это с помощью …

    1. mysql_fetch_field ()
    2. mysqli_result :: fetch_field_direct или
    3. PDOStatement :: getColumnMeta ()

    … в зависимости от расширения, которое вы хотите использовать. Первое не рекомендуется, поскольку расширение 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); 

    Очевидно, что это не лучший способ, но работает, когда у вас нет доступа к среде для установки лучшего драйвера.