使用外键插入到表中-PHP PDO

使用外键插入到表中-PHP PDO,php,mysql,pdo,insert,foreign-keys,Php,Mysql,Pdo,Insert,Foreign Keys,我有一个数据库叫Profiles。 此数据库包含两个名为“用户和配置文件”的表: 用户: 用户id 名称 电子邮件 密码 简介: 个人资料 名字 姓 总结 我正在使用PHP和PDO处理CRUD场景。目前,我正在尝试添加并创建一个新的配置文件条目。分配状态:确保使用当前登录用户的外键用户id标记条目。创造 我不明白如何在PDO中将这两个表连接在一起。我得到以下错误: 致命错误:未捕获PDOException:SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败p

我有一个数据库叫Profiles。 此数据库包含两个名为“用户和配置文件”的表:

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

简介: 个人资料 名字 姓 总结

我正在使用PHP和PDO处理CRUD场景。目前,我正在尝试添加并创建一个新的配置文件条目。分配状态:确保使用当前登录用户的外键用户id标记条目。创造

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

致命错误:未捕获PDOException:SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败profiles.profile,约束配置文件\u ibfk\u 2外键用户\u id在/websites-mamp/asmt-profile/add.php:32堆栈跟踪:0/websites-mamp/asmt-profile/add.php32:PDOStatement->executeArray 1{main}在/websites-mamp/asmt-profile/add.php第32行抛出

此外,约束配置文件_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。非常感谢您的帮助,谢谢

profile_ibfk_2是外键的名称。您正试图在配置文件表中添加一行,但没有设置用户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,
    ));

$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;
} 

一种方法是将会话存储为user_id的变量 由于您的代码中有session_start,因此在用户进入主页之前,请将其放入login.php文件或任何文件名中,首先您需要在登录界面中选择您的用户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'];
然后将您的用户标识存储到会话中,如下所示:

$_SESSION['currentid'] = $userid;

<input type="hidden" name="userid" value="<?php echo $id; ?>">
然后将用户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,
    ));

$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;
} 
您的子表配置文件中必须有一个外键,该外键链接到父表用户,以防止使用外键违反表的完整性,假设您的login.php文件或任何文件名中也有session_start。 或者,如果没有登录界面,只需使用select搜索要插入配置文件的用户的用户ID并将其存储到任何变量中,也可以将其存储到如下输入标记中:

$_SESSION['currentid'] = $userid;

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

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

INSERT不允许where子句。若要解决此问题,只需以添加其他外键的相同方式添加外键。@MariaGosur我认为您应该使用存储过程。@user3441151为什么OP必须使用存储过程?@Akin您能否详细说明如何以添加其他外键的相同方式添加外键?我不太明白...$whatEverToGetTheCurrentUserID是否也会变成$\u POST['user\u id'];?我不明白$variable是什么?这个变量包含用户的ID。这取决于你的申请。