【问题标题】:MySQL: Multi Query not executing 2nd and 3rd appended queriesMySQL:多查询不执行第二个和第三个附加查询
【发布时间】:2016-08-02 11:31:02
【问题描述】:

所以我正在尝试发送一个长附加的 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']的值

【问题讨论】:

  • 您有CourseID int not null/PRIMARY KEY(CourseID),但您的第二/第三次查询没有CourseID 值,并且由于它不是auto_increment,它们可能由于@ 而失败987654330@ 错误。

标签: php mysql mysqli multi-query


【解决方案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;
    

    在执行任何查询之前,插入/更新之前的数据会受到特定列类型和格式的影响。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 2020-03-09
      • 1970-01-01
      • 2022-10-04
      • 2013-10-19
      • 2014-12-02
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多