MySQL: Multi Query не выполняет 2-й и 3-й добавленные запросы

Поэтому я пытаюсь отправить длинный добавленный SQL-запрос, который заполнит временную таблицу. Основываясь на таблице, я заполняю массив, в котором хранятся различные значения из таблицы.

Первый оператор вставки работает отлично и корректно вставляется в массив. Следующие два добавленных запроса, похоже, не заполняют массив.

После некоторой проверки ошибок я убедился, что операторы имеют правильные значения в конце запроса.

ПРИМЕЧАНИЕ: имя пользователя, пароль и база данных были удалены из кода

Любая помощь очень ценится.

<?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']

1

Решение

  1. Не используйте multi_query. Запускайте ваши запросы один за другим.
  2. ВСЕГДА заставляйте mysqli сообщать о своих ошибках. Бесполезно спрашивать людей, что не так с вашей базой данных — они не могут знать. Только ваша база данных может сказать вам наверняка.

Так что сделайте свой код таким образом

$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);
}

этот код не будет отражать бесполезный спам, но сообщит о точной ошибке, как только она произойдет.

2

Другие решения

Причина использования multi_query очень проста. Мы хотим ограничить связь с базой данных — один запрос намного быстрее, чем 1000 запросов один за другим.

Альтернативой multi_query является несколько записей в одном запросе.

INSERT INTO .. (col1, col2) VALUES (v1.1,v2.1), (v1.2, v2.2), (v1.3, v2.3) ...;

Но больше всего данных следует проверять перед вставкой в ​​запрос.
Многие объектно-ориентированные модели данных делают это для Вас на основе фактической структуры базы данных путем кэширования столбцов таблицы и типа:

DESCRIBE table;

Перед выполнением любого запроса данные перед вставкой / обновлением подвергаются компрометации с определенным типом и форматом столбца.

0

По вопросам рекламы [email protected]