php - 插入多个表的帮助

标签 php mysql

我正在构建一个学习计划器。

我已经设计了一个界面和数据库草案,目前我正在尝试将测试注册详细信息插入数据库,但我已经进行了三天,但没有成功。请指出我做错了什么,我将不胜感激。

我得到的消息/错误是这样的:

Connected successfully

Error details for Result 2: Cannot add or update a child row: a foreign key constraint fails (`p00702`.`universityreferences`, CONSTRAINT `universityreferences_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE).

Error details for Result 3: Cannot add or update a child row: a foreign key constraint fails (`p00702`.`mobiles`, CONSTRAINT `mobiles_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE).

Error details for Result 4: Cannot add or update a child row: a foreign key constraint fails (`p00702`.`logins`, CONSTRAINT `logins_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE).

All queries were rolled back

我还注意到 $id = $mysqli->insert_id; 在第一个查询之后也不起作用,我不知道为什么,但我怀疑这可能是根本原因。

我的 PHP 代码是:

<?php
if (isset($_POST['submitted'])) {

    include 'serverSide/connectToServer.php';

    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];
    $studentId = $_POST['studentId'];
    $mobile = $_POST['mobile'];
    $username = $_POST['username'];
    $password = $_POST['password'];

    //turn off autocommit
    $mysqli->autocommit(false);

    $flag = true;

    // attempt insert query executions
    $query1 = "INSERT INTO users (firstname, lastname) VALUES ('$firstName', '$lastName');";
    $id = $mysqli->insert_id;

    $query2 = "INSERT INTO universityreferences (userid, universityreference) VALUES ('$id', '$studentId');";
    $id2 = $mysqli->insert_id;

    $query3 = "INSERT INTO mobiles (userid, mobile) VALUES ('$id2', '$mobile');";
    $id3 = $mysqli->insert_id;

    $query4 = "INSERT INTO logins (userid, username, password) VALUES ('$id3', '$username', '$password');";

    $result1 = mysqli_query($mysqli, $query1);
    if (!$result1) {
        $flag = false;
        echo "Error details for Result 1: " . mysqli_error($mysqli) . ".";
    }

    $result2 = mysqli_query($mysqli, $query2);
    if (!$result2) {
        $flag = false;
        echo "Error details for Result 2: " . mysqli_error($mysqli) . ".";
    }

    $result3 = mysqli_query($mysqli, $query3);
    if (!$result3) {
        $flag = false;
        echo "Error details for Result 3: " . mysqli_error($mysqli) . ".";
    }

    $result4 = mysqli_query($mysqli, $query4);
    if (!$result4) {
        $flag = false;
        echo "Error details for Result 4: " . mysqli_error($mysqli) . ".";
    }

    if ($flag) {
        mysqli_commit($mysqli);
        echo "All queries were executed successfully";
    } else {
        mysqli_rollback($mysqli);
        echo "All queries were rolled back";
    }

    mysqli_close($mysqli);
}
?>

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->

<html>
    <head>
        <meta charset="UTF-8">
        <link rel="shortcut icon" type="image/png" href="/images/favicon.png"/>
        <title>Just-Read</title>
        <link rel="stylesheet" type="text/css" href="css/styles.css">
    </head>
    <body>
        <!-- Link to external JavaScript file -->
        <script src="javascript/validator.js"></script>
        <div id="container">
            <div id="header">
                <!-- Web site Logo -->
                <div class="logo">
                    <img src="images/logo.png" width="128" height="93.5" alt="Logo"/><br><br>
                </div>
                <div id="logoText">
                    <h1>Just Read</h1>
                </div>
            </div>
            <div id="leftColumn">
                <h4>The ultimate study planner</h4>
            </div>
            <div id="rightColumn">
                <!-- Registration Form -->
                <h3>Please fill out the form below</h3>
                <form name="Register" action="registration.php" onsubmit="return registrationValidator()" autocomplete="on" method="POST">
                    <!--According to YouTuber Ralph Philips, this makes sure a blank form cannot be submitted to the database-->
                    <input type="hidden" name="submitted" value="true"/>
                    <div class="register">
                        <label><b>First Name*</b></label>
                        <input type="text" id="firstName" name="firstName" placeholder="Enter your first name" autofocus/>
                        <label><b>Last Name*</b></label>
                        <input type="text" id="lastName" name="lastName" placeholder="Enter your last name" />
                        <label><b>Student ID*</b></label>
                        <input type="text" id="studentId" name="studentId" placeholder="Enter your university ID" />
                        <label><b>Mobile</b></label>
                        <input type="text" id="mobile" name="mobile" placeholder="Enter your phone number" />
                        <label><b>Email Address (Username)*</b></label>
                        <input type="email" id="username" name="username" placeholder="Enter your email address" />
                        <label><b>Password*</b></label>
                        <input type="password" id="password" name="password" placeholder="Enter your password" />

                        <button type="submit">Register</button>
                    </div>
                    <div id="back">
                        <a href="index.php">Back</a>
                    </div>
                    <div id="mandatoryFields">
                        <h4>* Mandatory Fields</h4>
                    </div>
                </form>
            </div>
            <div id="footer">
                Copyright &copy; 2017, Chizzy Meka.
            </div>
        </div>
    </body>
</html>

我的完整 MySQL 代码是:

-- phpMyAdmin SQL Dump
-- version 4.6.4
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Apr 08, 2017 at 06:49 PM
-- Server version: 5.7.14
-- PHP Version: 5.6.25

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `p00702`
--

-- --------------------------------------------------------

--
-- Table structure for table `comments`
--

CREATE TABLE `comments` (
  `commentid` int(10) NOT NULL,
  `modulecodeid` int(10) NOT NULL,
  `comment` text,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `logins`
--

CREATE TABLE `logins` (
  `loginid` int(10) NOT NULL,
  `userid` int(10) NOT NULL,
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `mobiles`
--

CREATE TABLE `mobiles` (
  `mobileid` int(10) NOT NULL,
  `userid` int(10) NOT NULL,
  `mobile` varchar(10) DEFAULT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `modulecodes`
--

CREATE TABLE `modulecodes` (
  `modulecodeid` int(10) NOT NULL,
  `userid` int(10) NOT NULL,
  `modulecode` varchar(10) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `moduletitles`
--

CREATE TABLE `moduletitles` (
  `moduletitleid` int(10) NOT NULL,
  `modulecodeid` int(10) NOT NULL,
  `moduletitle` varchar(100) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `studyplans`
--

CREATE TABLE `studyplans` (
  `studyplan` int(10) NOT NULL,
  `modulecodeid` int(10) NOT NULL,
  `studydate` date NOT NULL,
  `numberofstudyhours` int(10) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `universityreferences`
--

CREATE TABLE `universityreferences` (
  `universityreferenceid` int(10) NOT NULL,
  `userid` int(10) NOT NULL,
  `universityreference` varchar(100) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE `users` (
  `userid` int(10) NOT NULL,
  `firstname` varchar(100) NOT NULL,
  `lastname` varchar(100) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `comments`
--
ALTER TABLE `comments`
  ADD PRIMARY KEY (`commentid`),
  ADD KEY `modulecodeid` (`modulecodeid`);

--
-- Indexes for table `logins`
--
ALTER TABLE `logins`
  ADD PRIMARY KEY (`loginid`),
  ADD KEY `userid` (`userid`);

--
-- Indexes for table `mobiles`
--
ALTER TABLE `mobiles`
  ADD PRIMARY KEY (`mobileid`),
  ADD KEY `userid` (`userid`);

--
-- Indexes for table `modulecodes`
--
ALTER TABLE `modulecodes`
  ADD PRIMARY KEY (`modulecodeid`),
  ADD KEY `userid` (`userid`);

--
-- Indexes for table `moduletitles`
--
ALTER TABLE `moduletitles`
  ADD PRIMARY KEY (`moduletitleid`),
  ADD KEY `modulecodeid` (`modulecodeid`);

--
-- Indexes for table `studyplans`
--
ALTER TABLE `studyplans`
  ADD PRIMARY KEY (`studyplan`),
  ADD KEY `modulecode` (`modulecodeid`);

--
-- Indexes for table `universityreferences`
--
ALTER TABLE `universityreferences`
  ADD PRIMARY KEY (`universityreferenceid`),
  ADD KEY `userid` (`userid`);

--
-- Indexes for table `users`
--
ALTER TABLE `users`
  ADD PRIMARY KEY (`userid`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `comments`
--
ALTER TABLE `comments`
  MODIFY `commentid` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `logins`
--
ALTER TABLE `logins`
  MODIFY `loginid` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `mobiles`
--
ALTER TABLE `mobiles`
  MODIFY `mobileid` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `modulecodes`
--
ALTER TABLE `modulecodes`
  MODIFY `modulecodeid` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `moduletitles`
--
ALTER TABLE `moduletitles`
  MODIFY `moduletitleid` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `studyplans`
--
ALTER TABLE `studyplans`
  MODIFY `studyplan` int(10) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `universityreferences`
--
ALTER TABLE `universityreferences`
  MODIFY `universityreferenceid` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
  MODIFY `userid` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- Constraints for dumped tables
--

--
-- Constraints for table `comments`
--
ALTER TABLE `comments`
  ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`modulecodeid`) REFERENCES `modulecodes` (`modulecodeid`) ON UPDATE CASCADE;

--
-- Constraints for table `logins`
--
ALTER TABLE `logins`
  ADD CONSTRAINT `logins_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE;

--
-- Constraints for table `mobiles`
--
ALTER TABLE `mobiles`
  ADD CONSTRAINT `mobiles_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE;

--
-- Constraints for table `modulecodes`
--
ALTER TABLE `modulecodes`
  ADD CONSTRAINT `modulecodes_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE;

--
-- Constraints for table `moduletitles`
--
ALTER TABLE `moduletitles`
  ADD CONSTRAINT `moduletitles_ibfk_1` FOREIGN KEY (`modulecodeid`) REFERENCES `modulecodes` (`modulecodeid`) ON UPDATE CASCADE;

--
-- Constraints for table `studyplans`
--
ALTER TABLE `studyplans`
  ADD CONSTRAINT `studyplans_ibfk_1` FOREIGN KEY (`modulecodeid`) REFERENCES `modulecodes` (`modulecodeid`) ON UPDATE CASCADE;

--
-- Constraints for table `universityreferences`
--
ALTER TABLE `universityreferences`
  ADD CONSTRAINT `universityreferences_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

提前感谢您的帮助。

最佳答案

问题是您试图在执行任何查询之前获取最后插入的 ID。例如:

$query1 = "INSERT INTO users (firstname, lastname) VALUES ('$firstName', '$lastName');";
$id = $mysqli->insert_id;

上面的代码中你只是定义了sql语句,并没有执行它。因此,最后插入的 ID 不会返回任何内容。

仅在执行查询后才执行 insert_id() 方法:

$result1 = mysqli_query($mysqli, $query1);

关于php - 插入多个表的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43299221/

相关文章:

MySQL 数据汇总/计数表

php - 显示 oscommerce 中类别下的子类别

php - 想要添加一列并最终显示结果?

php - topbar 菜单的性能 - mysql 或 json

php - 如果存在某些值,则 mysql 更新,否则创建一个新条目

php - 1/1 NotFoundHttpException in Controller.php line 268 : Controller method not found. in laravel 5

php - WooCommerce - 隐藏特定变体

javascript - JSON数组存储之前的数据结果

php - 取消设置类以清除内存

java - 从 jdbc ResultSet 获取数据行