【问题标题】:PHP MySQLi prepared statement not inserting data into tablePHP MySQLi准备好的语句没有将数据插入表中
【发布时间】:2016-04-30 03:40:20
【问题描述】:

我正在设计一个带有用户登录和注册邮箱验证的网站,当用户注册一个帐户时,它会成功、正确地将用户记录插入到“用户”表中的数据库中。

但是,当我尝试提取插入时创建的用户 ID 以将它们插入到第二个表中以获取站点所有成员的花名册(这是针对游戏部落)时,它会将用户 ID 插入为 0 roster 表,无论他们的 id 在该用户的“users”表中是什么。

这是我的代码:

if($insert_stmt = $db->prepare("INSERT INTO users (username, password, email, date, actcode) VALUES (?, ?, ?, ?, ?)"))
    {
        $insert_stmt->bind_param('sssss', $username, $password, $email, $date, $actcode);

        $stmt = $db->prepare("SELECT id FROM users WHERE email = ?");
        if($stmt)
        {
            $stmt->bind_param('s', $email);
            $stmt->execute();
            $stmt->fetch();
            $stmt->store_result();
            $stmt->bind_result($ui);
        }

        $stmt = $db->prepare("INSERT INTO roster (userid, joindate) VALUES (?, ?)");
        if($stmt)
        {
            $stmt->bind_param('ss', $ui, $date);
            $stmt->execute();
        }

        if(!$insert_stmt->execute()) {
            header('Location: error.php?err=Registration failure: INSERT');
        }
    }

出于安全原因,我省略了与本节无关的某些变量和代码部分,这让我很头疼。

我不明白为什么它没有将该用户帐户从“users”中新创建的“id”插入“userid”列下的“roster”表中。

另外,为了测试一些东西,我还设置了一个会话变量

$_SESSION['uid'] = $ui;

直接在该行之后

$stmt->store_result($ui);

并在我的 index.php 文件中回显它,它也将会话变量显示为 0。

【问题讨论】:

  • 您确定该代码块正在执行吗?您应该添加一些 mysqli_error()s 以查看是否有任何问题。看起来一切都会默默地失败。
  • 你能在你的代码中添加调试语句吗? print_r($stmt); 的输出是什么

标签: php sql mysqli prepared-statement


【解决方案1】:

您可以简单地使用这个函数:mysqli::$insert_id 而不是编写第二个查询。

替换这一行:

$stmt = $db->prepare("SELECT id FROM users WHERE email = ?");

与:

$userid = $db->insert_id; 

让我知道这是否有效。

【讨论】:

  • 假设 `id` 列是 AUTO_INCREMENT,并且列的值不是由 BEFORE INSERT 触发器设置的。
  • 用户注册表几乎肯定应该有一个 ID 列是 AUTO_INCREMENT。
  • 是的,很明显 id 列是自动递增的。除非像在企业 Web 应用程序中那样插入长字符而不是数字,在这种情况下我对此表示怀疑。
【解决方案2】:

仍然无法使其与提供的解决方案一起使用,但决定将所有内容合并到用户表中,从而解决了问题。至于检查它是否正在执行,我正在进行一些检查以确保它通过。感谢您的帮助和建议。

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多