2015-07-09 3 views
1

У меня есть функция 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.

+0

Таким образом, мои выводы после того, как я столкнулся с этим в течение другого дня, заключаются в том, что использование стандартного запроса работает нормально, но для подготовленного оператора требуется, чтобы я привязывал все параметры как строки, иначе запрос терпит неудачу. Я попытался использовать различные функции PHP, чтобы придать значения INT значениям, а затем использовать их без успеха. На этом этапе я думаю, что версия MySQL устарела настолько, что у нее возникают проблемы с подготовленным оператором. Это приводит к неправильной привязке параметров, а также к неумному вводу данных. – Andy

ответ

-1

После обновления версии mysql и php на клиентских и серверных машинах проблема исчезла. Похоже, что хотя MySQLi, как говорили, поддерживали версии, которые я запускал, это было не без проблем.

0

Просто ради ответа.

каким-то ценность их изменения в подготовленном заявлении

Подготовленные заявления не изменяют свои данные. Все изменения могут быть сделаны только с помощью кода пользователя. Проверьте свой код.

почему я должен пройти Int «ID» как строка

Вам не придется. Если вы не можете заставить его работать, то вы делаете что-то неправильно. Дважды проверьте свой код.

+1

Вопрос не был бы опубликован, если бы я еще не перешагнул его 30-40 раз. «Посмотрите на это снова» не добавляет значения. – Andy

Смежные вопросы