我试图将登录令牌存储在数据库中,但是出现多个错误。我到处看,但找不到解决方案。
我尝试了多种操作,对于id列,我尝试为null,
我尝试这样做:
DB::query('INSERT INTO login_token (token, user_id) VALUES (null, :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
但是然后我得到这个错误:SQLSTATE [HY000]:常规错误:1364字段“ id”没有默认值
最后,我尝试使用:(''),但这是针对字符串而非整数
这是我当前的代码:
$cstrong = True;
$token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
$user_id = DB::query('SELECT user_id FROM user WHERE username = :username', array(':username'=>$username))[0]['user_id'];
DB::query('INSERT INTO login_token VALUES (null, :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
数据库表如下:
id int
令牌字符(64)
user_id int
也许有人可以帮助我解决这个问题
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你的描述,你遇到的问题是由于在尝试插入数据时,数据库表的id
字段没有默认值,且你在插入语句中明确指定了该列为null
,而id
字段看起来像是一个自增字段(通常用于主键)。在MySQL中,如果一个列被定义为自增(AUTO_INCREMENT),你不应该手动插入任何值,包括NULL
。
解决这个问题的方法很简单,就是直接从你的插入语句中移除对id
列的任何操作,因为数据库会自动为这个字段生成下一个可用的唯一ID。修改后的代码如下:
$cstrong = true;
$token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
$user_id = DB::query('SELECT user_id FROM user WHERE username = :username', array(':username'=>$username))[0]['user_id'];
// 仅插入token和user_id,id列由数据库自动生成
DB::query('INSERT INTO login_token (token, user_id) VALUES (:token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
这样,当你执行插入操作时,数据库会自动处理id
列的值,你应该不会再看到那个错误了。同时,请确保你的login_token
表的id
字段确实被设置为了自增类型。如果还没有设置,可以通过以下SQL语句来修改(请先备份你的数据库):
ALTER TABLE login_token MODIFY id INT AUTO_INCREMENT PRIMARY KEY;
这将把id
列设置为自增主键,前提是它还没有被用作其他用途的主键。