【问题标题】:INSERT into table with foreign key - PHP PDO插入带有外键的表 - PHP PDO
【发布时间】:2017-08-27 23:32:37
【问题描述】:

我有一个名为“Profiles”的数据库。 该数据库包含两个名为“users”和“profiles”的表:

用户:
用户ID
名称
电子邮件
密码

个人资料:
profile_id
名字
姓氏
总结

我正在使用 PHP 和 PDO 处理 CRUD 场景。目前,我正在尝试“添加”(创建)一个新的配置文件条目。分配声明:“确保使用当前登录用户的外键 user_id 标记条目。(创建)”。

我不明白如何在 PDO 中将两个表连接在一起。我收到以下错误:

致命错误:未捕获的 PDOException:SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 (profiles.profile, CONSTRAINT profile_ibfk_2 FOREIGN KEY (@987654324 @) 参考 users (user_id) ON DELETE CASCADE ON UPDATE CASCADE) in /websites-mamp/asmt-profile/add.php:32 堆栈跟踪:#0 /websites-mamp/asmt-profile/add.php (32): PDOStatement->execute(Array) #1 {main} 在第 32 行的 /websites-mamp/asmt-profile/add.php 中抛出

另外,CONSTRAINT profile_ibfk_2 是什么意思?

我的代码是:

<?php
session_start();
require_once "pdo.php";

// Validate field entries
if ( isset($_POST['first_name']) && isset($_POST['last_name']) && isset($_POST['summary'])) {


    $sql = "INSERT INTO profile (first_name, last_name, summary)
               VALUES (:first_name, :last_name, :summary)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array(
        ':first_name' => $_POST['first_name'],
        ':last_name' => $_POST['last_name'],
        ':summary' => $_POST['summary']
        ));
    $_SESSION['success'] = "Record added";
    header("Location: index.php");
    return;
} 

?>

<!DOCTYPE html>
<html>
<head>
<title>Add</title>
</head>
<body>

 <div class="container">

    <form method="post">
        <p>First Name:
        <input type="text" name="first_name" /></p>
        <p>Last Name:
        <input type="text" name="last_name" /></p>
        <p>Summary:
        <textarea type="text" name="summary"></textarea></p>
        <input type="submit" value="Add">
        <input type="submit" name="logout" value="Cancel">
    </form>

</div>
</body>
</html>

我在代码中的什么位置连接到外键?我试过 WHERE 子句,但这没有帮助。有人可以轻松解释一下吗?我一直在这里探索 StackOverflow 来解决类似的问题,但其中大部分都在我的脑海中,或者它不是 PDO。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • INSERT 不允许使用 where 子句。要解决此问题,只需像添加其他外键一样添加外键。
  • @MariaGosur 我认为你应该使用存储过程。
  • @user3441151 为什么 OP 必须使用存储过程?
  • @Akin 您能否详细说明添加外键的方式与添加其他键的方式相同吗?我不是很明白..

标签: php mysql pdo insert foreign-keys


【解决方案1】:

profile_ibfk_2 是外键的名称。您正在尝试将一行添加到您的 profile 表中,但您也没有设置 user_id。所以改变你的INSERT 声明:

$sql = "INSERT INTO profile (first_name, last_name, summary, user_id)
           VALUES (:first_name, :last_name, :summary, :user_id)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(
    ':first_name' => $_POST['first_name'],
    ':last_name' => $_POST['last_name'],
    ':summary' => $_POST['summary'],
    ':user_id' => $whatEverToGetTheCurrentUserID,
    ));

【讨论】:

  • $whatEverToGetTheCurrentUserID 也会变成 $_POST['user_id']; 吗?我不明白 $variable 是什么?
  • 此变量包含用户的 ID。这取决于您的应用程序。
【解决方案2】:

一种方法是,如果您有 user_id 的会话存储变量 由于您的代码中有 session_start,因此将其放入您的 login.php 文件或在用户进入您的主页之前您拥有的任何文件名中,首先您需要在从登录界面登录的情况下选择您的 user_id

$user = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * FROM tablename WHERE username = :user,password = :password";
$stmnt = $pdo->prepare($sql);
$stmnt->execute(array(':user'=>$user,':password'=>$password));
$data = $stmnt->fetch(PDO::FETCH_ASSOC);
$userid = $data['id'];

然后像这样将您的用户 ID 存储到会话中:

$_SESSION['currentid'] = $userid;

然后将用户 ID 添加到您的插入语句中:


$id = $_SESSION['currentid'];

if ( isset($_POST['first_name']) && isset($_POST['last_name']) && isset($_POST['summary'])) {


    $sql = "INSERT INTO profile (first_name, last_name, summary,userid)
               VALUES (:first_name, :last_name, :summary,:userid)";
    $stmnt = $pdo->prepare($sql);
    $stmnt->execute(array(
        ':first_name' => $_POST['first_name'],
        ':last_name' => $_POST['last_name'],
        ':summary' => $_POST['summary'],
        ':userid' => $id;
        ));
    $_SESSION['success'] = "Record added";
    header("Location: index.php");
    return;
} 

您的子表 Profiles 中必须有一个外键,该外键链接到父表 Users 中,以防止使用外键破坏您的表的完整性,假设您的 login.php 文件或任何文件名中也有 session_start是。 或者,如果您没有登录界面,只需使用 select 搜索要插入配置文件的用户的用户 ID 并将其存储到任何变量中,您也可以将其存储到输入标签中,如下所示:

<input type="hidden" name="userid" value="<?php echo $id; ?>">

只需确保在要包含的表单中包含输入标签

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多