我正在建立一个学习计划者。
我设计了一个草稿界面和数据库,我目前正在尝试将测试注册详细信息插入到数据库中,但我已经在这三天了,但没有成功。我非常感谢你帮我指出我做错了什么。
我得到的消息/错误是这样的:
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 © 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 */;
提前感谢您的帮助。
答案 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
上定义的外键,因为您正在插入一个空值的行
答案 1 :(得分:1)
问题是您尝试在执行任何查询之前获取最后插入的ID 。例如:
$query1 = "INSERT INTO users (firstname, lastname) VALUES ('$firstName', '$lastName');";
$id = $mysqli->insert_id;
在上面的代码中,您只需定义sql语句,但不执行它。因此,最后一个插入ID不会返回任何内容。
仅在执行查询后执行insert_id()
方法:
$result1 = mysqli_query($mysqli, $query1);