使用外键INSERT到表中 - PHP PDO

时间:2017-04-03 07:29:01

标签: php mysql pdo insert foreign-keys

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

用户:
USER_ID
命名
电子邮件
密码

配置文件:
PROFILE_ID
FIRST_NAME
姓氏
摘要

我正在使用PHP和PDO开发CRUD场景。目前,我正在尝试“添加”(创建)新的个人资料条目。赋值声明:“确保使用当前登录用户的外键 user_id 标记条目。(创建)”。

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

  

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

此外,user_id是什么意思?

我的代码是:

CONSTRAINT profile_ibfk_2

我在代码中的哪个位置连接到外键?我已经尝试过WHERE子句,但这没有帮助。有人能轻易解释一下吗?我一直在这里探索StackOverflow类似的问题,但大多数都在我的头上,或者它不是PDO。感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

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,
    ));

答案 1 :(得分:0)

一种方法是,如果您有会话存储的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;
} 

您必须在子表“个人档案”中具有外键,该“个人档案”已链接到父表“用户”,以防止使用外键对表进行完整性侵犯,前提是您的login.php文件或其他文件名中也包含session_start是。 或者,如果您没有登录界面,只需使用select搜索要插入配置文件的用户的用户ID,然后将其存储在任何变量中,也可以将其存储在这样的输入标签中:

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

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