Вставьте несколько операторов SQL в PHP из массива для цикла или foreach - PullRequest
0 голосов
/ 13 июня 2019

Это мой код, я должен вставлять массив каждое значение в инструкции вставки

if(isset($_POST['add'])){
    $batch = $_POST['batch'];
    $course = explode(':', $_POST['course']);
    $cid = $course[0];
    $rowCount = count($_POST['branch']);
    $branch = implode(',', $_POST['branch']);
    $semester = $_POST['sem'];
    $day = $_POST['day'];
    $hour = $_POST['hour'];


    for($i=0;$i<$rowCount;$i++){
        $description = $_POST['branch'][$i];
        $sql. = "INSERT INTO batch (batch,bdescription,branch,course,semester,day,hour,user) VALUES ('$batch','$description',$i,'$cid','$semester','$day','$hour','$usnid');";

    }


    if($conn->query($sql)){
        $_SESSION['success'] = 'batch  added successfully';
    }
    else{
        $_SESSION['error'] = $conn->error;
    }
}

Пожалуйста, помогите спасибо

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

Barmar верен, вы не можете выполнить несколько операторов SQL с query(). Есть mysqli_multi_query(), но вряд ли когда-либо есть оправдание для использования этого. Бывший технический директор MySQL однажды сказал мне однозначно: «нет причин для существования нескольких запросов».

Вы должны использовать параметры вместо копирования переменных $ _POST непосредственно в ваши строки SQL. Это не сложно, на самом деле это делает код проще , чем возиться с запутанными кавычками в кавычках и mysqli_real_escape_string() и так далее.

Я бы не стал пытаться вставить несколько кортежей в один оператор INSERT. Сколько веток может быть в одном POST? Максимум несколько десятков? Недостаточно, чтобы сделать INSERT одним оператором. Так что просто позвоните execute() для подготовленной вставки, один раз для каждой строки.

$sql = "INSERT INTO batch 
        SET batch=?, bdescription=?, branch=?, course=?, semester=?,
            day=?, hour=?, user=?";
$stmt = $conn->prepare($sql) or die($conn->error);

$description = '';
$stmt->bind_param('ssssssss', $batch, $description, $i, $cid, $semester, $day, $hour, $usnid);

for($i=0;$i<$rowCount;$i++){
    $description = $_POST['branch'][$i];
    $stmt->execute() or die($stmt->error);
}

Прочтите руководство для https://www.php.net/manual/en/mysqli-stmt.bind-param.php, чтобы получить больше примеров кода.

0 голосов
/ 14 июня 2019

Так я исправил свой код.Я использовал для петли

    if(isset($_POST['addstd'])){
    $rowCount = count($_POST['student']);

        for($i=0;$i<$rowCount;$i++){
            $stdid = $_POST['student'][$i];
            $course = $_POST['course'][$i];
            $batch = $_POST['batch'][$i];
            $branch = $_POST['branch'][$i];
            //insert students into attendance table

            $sqlsel =  "SELECT year,student_id, student_rollno,firstname,lastname, branch,active, nr FROM student WHERE student.student_id = '$stdid' AND student.branch = '$branch'";
            $querysel = $conn->query($sqlsel) or die($conn->error);
            $rowsel = $querysel->fetch_assoc();
                if($rowsel !== null){
                    $year = $rowsel['year'];
                    $rollno = $rowsel['student_rollno'];
                    $active = $rowsel['active'];        
                    $branch = $rowsel['branch'];
                    $name = $rowsel['firstname'].$rowsel['lastname'];


            $sql = "INSERT IGNORE INTO class (year,regno, rollno,name, programme,coursecode,batch,user,active,count) VALUES ('$year','$stdid','$rollno','$name','$branch','$course','$batch','$usnid','$active','$i');";

            if($conn->query($sql)){
                $_SESSION['success'] = 'Students Added To Batch Successfully';
            }
            else{
                $_SESSION['error'] = $conn->error;
            }
            }
                else{
                    continue;
                }
        }

}
else{
    $_SESSION['error'] = 'Fill up add form first';
}
0 голосов
/ 13 июня 2019

Вы не можете выполнить несколько запросов одним вызовом $conn->query().

Измените свой запрос так, чтобы он представлял собой просто один оператор INSERT с несколькими списками значений после VALUES.

$sql = "INSERT INTO batch (batch,bdescription,branch,course,semester,day,hour,user) VALUES "
for($i=0;$i<$rowCount;$i++){
    $description = $_POST['branch'][$i];
    $sql. = "('$batch','$description',$i,'$cid','$semester','$day','$hour','$usnid'),";
}
$sql = substr($sql, 0, -1); // remove last comma

Вы также должны использовать $conn->real_escape_string() для экранирования всех входных данных, для защиты от SQL-инъекций (было бы даже лучше сделать это с подготовленным оператором, но трудно создать подготовленный оператор в mysqli с динамическими параметрами ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...