2017-04-08 67 views
1

我建立一个研究计划者实物援助。与插入到多个表

我设计了一个接口草案和数据库,目前我正在试图插入考试报名信息存入数据库,但我一直在这三天,现在没有成功。请高度赞赏,指出我做错了什么。

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

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 @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@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 [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

请多关照的协助。

+0

的可能的复制[MySQL错误1452 - 不能添加或更新子行,外键约束失败(HTTP://计算器。 com/questions/1253459/mysql-error-1452-can-add-or-update-a-child-row-a-foreign-key-constraint-fa) – asteriskTheServer

+0

嗨,@asteriskTheServer,感谢您提出的类似问题,不过,我已经看到后,并没有告诉我足够的之前,我决定把我自己的职位。虽然我同意有类似性,我相信我的PHP是错误的,建议的回答可以帮不了我这一点。此外,我正在处理更多的表格,这使得事情变得更加棘手,所以请,如果有人能够看看我自己的案例并提供一些建议,我将不胜感激。 –

回答

1

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

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

在上面的代码你刚才定义的SQL语句,但你不执行它。因此最后一个插入ID不会返回任何内容。

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

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

非常感谢,@Shadow,我会让你知道它是如何工作的。 –

+0

它现在正在工作。非常感谢你,当你需要时,你也可以找到帮助! –

1

的问题是,你正在使用mysqli->insert_id已执行查询之前。当你定义的第一个查询,该数据库还没有生成的ID,但因为插入尚未执行。

这样做的正确的方法是

$query1 = "INSERT INTO users (firstname, lastname) VALUES ('$firstName', '$lastName');"; 

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

$id = $mysqli->insert_id; 

//go on with the next insert 
//defining the query, executing it and then using the generated id 

所有的,当你运行QUERY2,您违反您已经在user_id定义的外键的事实所引起的错误信息,因为你插入一个空值的行。

+0

非常感谢@Stefano Zanini,我会让你知道它是如何工作的。 –

+0

它现在正在工作。非常感谢你,当你需要时,你也可以找到帮助! –