我有一个php函数,它使用mysqli预处理语句将32个字符的标记保存到mysql数据库。我遇到的问题是,当这个32字符的字母数字标记插入数据库时,如果标记以数字开头,则只存储第一组连续数字,否则为0.例如:
表格设置如下:
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
相关的PHP代码是:
$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调用传递给另一个正确接收它的服务。有没有人见过这样的事情或者知道发生了什么?
编辑:我将添加使用我的数据库客户端直接与数据库进行交互将允许我存储整个值,因此它似乎不是MySQL或表定义本身的问题,而是某种程度上值是被准备好的声明改变了。无论如何,我最好的猜测。PHP版本5.5.26,MySQL版本5.0.96
第二个问题是为什么我必须传递int' id'作为准备好的声明成功的字符串?无法让它在bind_param中作为int工作。
答案 0 :(得分:0)
只是为了回答。
以某种方式,准备好的声明
正在改变这个值
准备好的声明不会改变您的数据。所有更改只能通过用户代码完成。检查你的代码。
为什么我必须将int'id'作为字符串传递
你不必。如果你不能让它工作,那么你做错了。仔细检查您的代码。
答案 1 :(得分:-1)
在客户端和服务器计算机上更新mysql和php版本后,问题就消失了。看起来即使MySQLi在我运行的版本上得到支持,也不是没有问题。