У меня есть поле таблицы в базе данных MySQL:
userid INT(11)
Поэтому я вызываю его на свою страницу с таким запросом:
"SELECT userid FROM DB WHERE name='john'"
Затем для обработки результата я делаю:
$row=$result->fetch_assoc();
$id=$row['userid'];
Теперь, если я это сделаю:
echo gettype($id);
Получаю шнурок. Разве это не должно быть целым числом?
$conn->query("your query")
я получил целочисленные поля в виде строки, но когда я использовал,$conn->prepare("your query")
я получил параметры, как они были в базе данныхОтветы:
Когда вы выбираете данные из базы данных MySQL с помощью PHP, тип данных всегда будет преобразован в строку. Вы можете преобразовать его обратно в целое число, используя следующий код:
Или с помощью функции
intval()
:источник
Используйте mysqlnd (собственный драйвер) для php.
Если вы используете Ubuntu:
Если вы используете Centos:
Собственный драйвер соответствующим образом возвращает целочисленные типы.
Редактировать:
Как отметил @Jeroen, этот метод будет работать только для PDO из коробки.
Как указал @LarsMoelleken, этот метод будет работать с mysqli, если вы также установите для параметра MYSQLI_OPT_INT_AND_FLOAT_NATIVE значение true.
Пример:
источник
$link = mysqli_connect('localhost', 'root', ''); mysqli_set_charset($link,'utf8'); $result = mysqli_query($link,'SELECT CAST(\'3.51\' AS DECIMAL(3,2))'); $row = mysqli_fetch_assoc($result); var_dump($row);
возвращает:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
Самое простое решение, которое я нашел:
Вы можете заставить json_encode использовать фактические числа для значений, которые выглядят как числа:
(начиная с PHP 5.3.3).
Или вы можете просто преобразовать свой идентификатор в int.
источник
json_encode
для преобразования строки в int, если это возможно, похоже на использование микроскопа для заглушки гвоздей.UNIX_TIMESTAMP()
, например,.Мое решение - передать результат запроса
$rs
и получить в качестве возврата связанный массив приведенных данных:Пример использования:
источник
Нет. Независимо от типа данных, определенного в ваших таблицах, драйвер MySQL PHP всегда обрабатывает значения строк как строки.
Вам нужно преобразовать свой идентификатор в int.
источник
Мне нравится ответ Чада, особенно когда результаты запроса будут переданы в javascript в браузере. Javascript четко обрабатывает числовые объекты как числа, но требует дополнительной работы для работы с числовыми объектами как строками. т.е. должен использовать на них parseInt или parseFloat.
Основываясь на решении Чада, я использую это, и часто это именно то, что мне нужно, и создает структуры, которые могут быть закодированы в JSON для упрощения работы с javascript.
Добавление числовой строки к 0 дает числовой тип в PHP и правильно определяет тип, поэтому числа с плавающей запятой не будут усечены до целых.
источник
Это происходит, когда
PDO::ATTR_EMULATE_PREPARES
установленоtrue
соединение.Однако будьте осторожны: установка этого параметра
false
запрещает использование параметров более одного раза. Я считаю, что это также влияет на качество возвращаемых сообщений об ошибках.источник
Вы можете сделать это с помощью ...
... в зависимости от расширения, которое вы хотите использовать. Первый не рекомендуется, потому что расширение mysql устарело. Третий пока экспериментальный.
Комментарии к этим гиперссылкам хорошо объясняют, как установить тип из простой старой строки в исходный тип в базе данных.
Некоторые фреймворки также абстрагируют это (CodeIgniter предоставляет
$this->db->field_data()
).Вы также можете делать предположения - например, перебирать полученные строки и использовать is_numeric () для каждой из них. Что-то вроде:
Это превратит все, что выглядит как число, в единицу ... определенно не идеально.
источник
if (is_float()) { $value = (float)$value; }
В своем проекте я обычно использую внешнюю функцию, которая «фильтрует» полученные данные
mysql_fetch_assoc
.Вы можете переименовывать поля в своей таблице, чтобы было интуитивно понятно, какой тип данных хранится.
Например, вы можете добавить специальный суффикс к каждому числовому полю: если
userid
он,INT(11)
вы можете переименовать его,userid_i
а если он,UNSIGNED INT(11)
вы можете переименоватьuserid_u
. На этом этапе вы можете написать простую функцию PHP, которая принимает на вход ассоциативный массив (полученный с помощьюmysql_fetch_assoc
) и применяет приведение к «значению», хранящемуся с этими специальными «ключами».источник
Если используются подготовленные операторы, то там, где это необходимо, тип будет int. Этот код возвращает массив строк, где каждая строка является ассоциативным массивом. Как if
fetch_assoc()
был вызван для всех строк, но с сохраненной информацией о типе.источник
MySQL имеет драйверы для многих других языков, преобразование данных в строку «стандартизирует» данные и предоставляет пользователю возможность преобразовывать значения в int или другие.
источник
В моем случае
mysqlnd.so
расширение было установлено. НО я этого не сделалpdo_mysqlnd.so
. Итак, проблема была решена заменойpdo_mysql.so
наpdo_mysqlnd.so
.источник
Мне нравится техника вдохновителя , но код может быть проще:
Я также добавил проверку того, что запрос возвращает false, а не набор результатов.
И проверка строки с полем с нулевым значением.
И если желаемый тип - это строка, я не трачу на это время - это уже строка.
Я не использую это в большинстве PHP-кода; Я просто полагаюсь на автоматическое преобразование типов в php. Но при запросе большого количества данных для последующего выполнения арифметических вычислений целесообразно заранее привести к оптимальным типам.
источник