![](/img/trans.png)
[英]Mysql transactions, using LAST_INSERT_ID() in both the 2nd and 3rd query?
[英]MySQL: Multi Query not executing 2nd and 3rd appended queries
因此,我試圖發送一個長附加的sql查詢,該查詢將填充一個臨時表。 基於表,我正在填充一個存儲表中不同值的數組。
第一條insert語句運行得很好,並且可以正確地插入到數組中。 接下來的兩個附加查詢似乎並未填充數組。
在進行了一些錯誤檢查之后,我已驗證語句在查詢末尾確實具有正確的值。
注意:用戶名,密碼和數據庫已從代碼中刪除
任何幫助都將不勝感激。
<?php
session_start();
$servername = "localhost";
$username = "";
$password = "";
$db = "";
$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("Connection failed:" . $conn->connect_error);
}
$courseID = $_GET['id'];
echo $courseID;
$studentID = $_SESSION['memberID'];
echo $studentID;
$maketemp = "CREATE TEMPORARY TABLE IF NOT EXISTS TempCourseProfile (
CourseID int not null,
CourseName varchar(100),
CourseDescription varchar(200),
CourseObjectives varchar(200),
CourseStartDate date,
CourseEndDate date,
InstructorFirstName varchar(50),
InstructorLastName varchar(50),
PRIMARY KEY(CourseID))";
if($conn->query($maketemp) === TRUE){
echo "you win";
}
else {
echo "you lose";
}
$query = "INSERT INTO TempCourseProfile(CourseID, CourseName, CourseDescription, CourseObjectives)
SELECT CourseID, CourseName, CourseDescription, CourseObjectives FROM Course WHERE CourseID = $courseID;";
$query .= "INSERT INTO TempCourseProfile(CourseStartDate, CourseEndDate)
Select CI.ClassStartDate, CI.ClassEndDate From CourseInSemester CI JOIN ClassSchedule CS on CI.CourseInSemesterID = CS.CourseInSemesterID WHERE CS.StudentID = $studentID AND CI.CourseID = $courseID;";
$query .= "INSERT INTO TempCourseProfile(InstructorFirstName, InstructorLastName)
Select M.FirstName, M.LastName from Member M JOIN CourseInSemester CI ON CI.TeacherID = M.MemberID JOIN ClassSchedule CS ON CS.CourseInSemesterID = CI.CourseInSemesterID WHERE CI.CourseID = $courseID AND CS.StudentID = $studentID;";
echo $query;
if ($conn->multi_query($query)) {
do{
echo "added";
}while($conn->next_result());
} else {
echo "failed to create temp" . $conn->error;
}
$tmparray = array();
$sql = "SELECT * FROM TempCourseProfile where CourseID = $courseID";
//$result = $conn->query($sql);
if($result = $conn->query($sql)){
while ($r = $result->fetch_array()) {
$e = array();
$e['CourseID'] = $r['CourseID'];
$e['CourseName'] = $r['CourseName'];
$e['CourseDescription'] = $r['CourseDescription'];
$e['CourseObjectives'] = $r['CourseObjectives'];
$e['CourseStartDate'] = $r['CourseStartDate'];
$e['CourseEndDate'] = $r['CourseEndDate'];
$e['InstructorFirstName'] = $r['InstructorFirstName'];
$e['InstructorLastName'] = $r['InstructorLastName'];
array_push($tmparray, $e);
}
} else {
echo $conn->error;
}
echo json_encode($tmparray);
?>
該問題必須處理$e['CourseStartDate']
, $e['CourseEndDate']
, $e['InstructorFirstName']
, $e['InstructorLastName']
因此,以這種方式編寫代碼
$queries = ["CREATE TEMPORARY TABLE IF NOT EXISTS TempCourseProfile (
CourseID int not null,
CourseName varchar(100),
CourseDescription varchar(200),
CourseObjectives varchar(200),
CourseStartDate date,
CourseEndDate date,
InstructorFirstName varchar(50),
InstructorLastName varchar(50),
PRIMARY KEY(CourseID))"];
$queries[] = "INSERT INTO TempCourseProfile(CourseID, CourseName, CourseDescription, CourseObjectives)
SELECT CourseID, CourseName, CourseDescription, CourseObjectives FROM Course WHERE CourseID = $courseID;";
$queries[] = "INSERT INTO TempCourseProfile(CourseStartDate, CourseEndDate)
Select CI.ClassStartDate, CI.ClassEndDate From CourseInSemester CI JOIN ClassSchedule CS on CI.CourseInSemesterID = CS.CourseInSemesterID WHERE CS.StudentID = $studentID AND CI.CourseID = $courseID;";
$queries[] = "INSERT INTO TempCourseProfile(InstructorFirstName, InstructorLastName)
Select M.FirstName, M.LastName from Member M JOIN CourseInSemester CI ON CI.TeacherID = M.MemberID JOIN ClassSchedule CS ON CS.CourseInSemesterID = CI.CourseInSemesterID WHERE CI.CourseID = $courseID AND CS.StudentID = $studentID;";
foreach ($queries as $query) {
$conn->query($query) or trigger_error($conn->error);
}
此代碼不會回顯任何無用的垃圾郵件,但是一旦發生,它將報告確切的錯誤。
使用multi_query的原因非常簡單。 我們希望限制與數據庫的通信-單個請求比1000個請求一個接一個地快得多。
multi_query的替代方法是單個查詢中有多個記錄。
INSERT INTO .. (col1, col2) VALUES (v1.1,v2.1), (v1.2, v2.2), (v1.3, v2.3) ...;
但是,所有數據中的大多數都應在插入查詢之前進行驗證。 許多面向對象的數據模型都通過緩存表列和類型來根據實際的數據庫結構為您完成此操作:
DESCRIBE table;
在執行任何查詢之前,會使用特定的列類型和格式來折衷用於插入/更新的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.