2016-04-12 2 views
1

So versuche ich eine lange angefügte SQL-Abfrage zu senden, die eine temporäre Tabelle auffüllen wird. Basierend auf der Tabelle bearbeite ich ein Array, das die verschiedenen Werte aus der Tabelle speichert.MySQL: Multi Query führt keine zweite und dritte angefügte Abfragen aus

Die erste INSERT-Anweisung läuft einwandfrei und wird korrekt in das Array eingefügt. Die nächsten zwei angefügten Abfragen scheinen das Array nicht zu füllen.

Nach einigen Fehlerprüfung habe ich überprüft, dass die Anweisungen die richtigen Werte am Ende der Abfrage haben.

HINWEIS: Benutzername, Passwort und Datenbank wurden aus dem Code entfernt

Jedwedes Hilfe ist sehr willkommen.

<?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); 

?> 

Das Problem hat mit den Werten von $e['CourseStartDate'], $e['CourseEndDate'], $e['InstructorFirstName'], $e['InstructorLastName']

+0

Sie haben 'CourseID int nicht null' /' PRIMARY KEY (CourseID) ', aber Ihre 2/3-Abfragen haben keinen' CourseID'-Wert, und da es kein 'auto_increment' ist, fallen sie wahrscheinlich aus Schlüsselfehler zu duplizieren. – Sean

Antwort

2
  1. Verwenden Sie keine multi_query beschäftigen. Führen Sie Ihre Abfragen nacheinander aus.
  2. IMMER machen mysqli seine Fehler melden. Es macht keinen Sinn, die Leute zu fragen, was mit Ihrer Datenbank nicht stimmt - sie können es nicht wissen. Nur Ihre Datenbank kann Ihnen das sicher sagen.

So Ihren Code auf diese Weise machen

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

diesen Code wird keine nutzlosen Spam-Echo, doch es wird eine genaue Fehlermeldung aus, sobald sie auftritt.