【问题标题】:mySQL INSERT to multiple tables using PHP statments使用 PHP 语句的 mySQL INSERT 到多个表
【发布时间】:2016-07-22 16:27:31
【问题描述】:

我正在努力使用 PHP 语句将 mySQL 数据插入到多个表中。

我有两张桌子:

用户

user_ID (PK)

名字

姓氏

电子邮件

密码

个人资料

profile_ID (PK)

user_ID (FK)

profile_image

profile_image_name

我像这样更新用户表:

$sql = "INSERT INTO user (first_name, last_name, email, password)
    VALUES
    ('$_POST[first_name]', '$_POST[last_name]', '$_POST[email]', '$_POST[password]')";

user_ID 在数据库中设置为自动递增,因此当执行此代码时,插入的数据会自动分配给唯一的 PK,并存储在会话中。但在同一点(创建帐户),我需要将 user_ID 作为 FK 插入到配置文件表中。这样,当用户上传他们的个人资料图片时,它将被分配给他们,他们将在个人资料表中拥有一条记录。

例如,在图片上传页面上我使用了这个代码:

        $user_ID = $_SESSION['login'];


        $ins1 = mysqli_query($db, "UPDATE profile SET `profile_image_name`='" . $profile_image_name . "' WHERE `user_ID`='$user_ID'");
        $ins2 = mysqli_query($db, "UPDATE profile SET `profile_image`='" . $profile_image . "' WHERE `user_ID`='$user_ID'");

此代码仅在 user_ID FK 已存在于配置文件表中时才有效,那么如何使用 php 语句插入它,就像我之前所做的那样?我再次尝试使用第一种方法,但它似乎不起作用......

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您将创建严重的SQL injection bugs从不$_POST数据直接放入查询中。
  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。在这个简短的示例中,您有许多危险的SQL injection vulnerabilities 来自鲁莽地缺少proper escaping。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。

标签: php mysql


【解决方案1】:

试试这个:

INSERT INTO
`profile`(`user_ID`,`profile_image`,`profile_image_name`)
VALUES
('$user_ID','$profile_image','$profile_image_name')
ON DUPLICATE KEY UPDATE 
`profile_image`='$profile_image',`profile_image_name`='$profile_image_name'

user_ID 必须是唯一的

【讨论】:

    【解决方案2】:

    插入创建新记录,更新更改现有记录。使用您当前的方案,您需要插入到配置文件中。显然,这意味着您不能使用与更改配置文件相同的代码来创建配置文件。但还有一个选项 REPLACE 与 INSERT 具有相同的语法,但会覆盖现有记录。

    但是,如果每个用户只有一个配置文件,则详细信息应保存在一个表中,而不是两个表中。

    评论:将密码存储为纯文本是一个非常糟糕的主意,请阅读密码哈希。您还应该有一个用于 SQL 注入的 Google;您的身份验证很容易绕过并且很容易被破坏。

    【讨论】:

      【解决方案3】:

      您可以使用insert_id 获取您在 Mysql 上插入的最后一个 PK 自动增量

      http://php.net/manual/mysqli.insert-id.php

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 2016-06-09
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 2019-07-22
        • 2011-12-04
        • 1970-01-01
        相关资源
        最近更新 更多