У меня есть функция php, которая сохраняет токен из 32 символов в базу данных mysql с помощью подготовленного mysqli оператора. Проблема, которую я имею что когда 32 буквенно-цифровой маркер вставляется в базу данных только первый набор смежных номеров сохраняется, если маркер начинается с числом, в противном случае 0. Например:PHP MySQLi: Строка преобразуется в int?
- 47f1f737fe813b9f19ecadc524eddcc1 хранится в виде 47
- cba73ec72629938c92b5bb81207c8b0b хранится как 0
- 1c1348bb3f85f006151b0111b5ae26f7 хранится в виде 1
установки Таблица выглядит следующим образом:
CREATE TABLE `user_password_tokens` (
`id` int(9) NOT NULL,
`token` varchar(64) NOT NULL,
`expiration` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `token` (`token`),
CONSTRAINT `user_password_tokens_id` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Соответствующий код РНР:
$log->add("ID: " . $parameters['data']['id'] . " | Token: " . $parameters['token']['value'], 1);
$stmt = $db->prepare("
INSERT INTO user_password_tokens
VALUES (?, ?, NOW() + INTERVAL 1 HOUR)
ON DUPLICATE KEY UPDATE id=id, token=VALUES(token), expiration=VALUES(expiration)");
$stmt->bind_param("ss", $parameters['data']['id'], $parameters['token']['value']);
$stmt->execute()
Оператор каротажа в начале коды PHP дает ожидаемое значение для маркеров. Также токен передается через вызов API другой службе, которая получает его правильно. Кто-нибудь когда-либо видел что-то подобное или знал, что происходит?
EDIT: добавлю, что взаимодействие непосредственно с базой данных с использованием моего клиента базы данных позволит мне сохранить все значение, поэтому оно не представляет проблемы с MySQL или самим определением таблицы, а скорее каким-то значением в соответствии с подготовленным заявлением. Мое лучшее предположение.
PHP версии 5.5.26, MySQL версии 5.0.96
Вторичный вопрос, почему я должен передать «идентификатор» ИНТ как строка для подготовленное заявление, чтобы добиться успеха? Невозможно заставить его работать как int в bind_param.
Таким образом, мои выводы после того, как я столкнулся с этим в течение другого дня, заключаются в том, что использование стандартного запроса работает нормально, но для подготовленного оператора требуется, чтобы я привязывал все параметры как строки, иначе запрос терпит неудачу. Я попытался использовать различные функции PHP, чтобы придать значения INT значениям, а затем использовать их без успеха. На этом этапе я думаю, что версия MySQL устарела настолько, что у нее возникают проблемы с подготовленным оператором. Это приводит к неправильной привязке параметров, а также к неумному вводу данных. – Andy