Данные не будут вставлены в базу данных после использования циклов foreach - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно вставить 2 варианта ($choices) и 2 категории ($categories), которые связаны с вопросом, который последний раз вставлялся Question_ID.Вопрос вставляет нормально.Тем не менее, выбор и категории не делают.Оба массива содержат все данные, которые необходимы.Мне нужно, чтобы каждый вариант был вставлен одновременно с идентификатором соответствующей категории, так как он необходим в другой точке сайта, и каждый выбор должен относиться к конкретному Category_ID.

ОБНОВЛЕНИЕ - я добавил оператор if во внутренний цикл foreach, который продолжит цикл, если оператор выполняется, а если нет, то будет отображаться ошибка.Ошибка была отражена.Как я могу это исправить?

Код PHP:

<?php
session_start();
include_once 'DBConnection.php';

if(isset ($_POST['Question']) && isset($_POST['Category_ID1']) && isset($_POST['Category_ID2']) && isset($_POST['Choice1']) && isset($_POST['Choice2'])) {
//get post variable
$question = $_POST['Question'];
//category array
$categories = array();
$categories[0] = $_POST['Category_ID1'];
$categories[1] = $_POST['Category_ID2'];
//Choices array
$choices = array();
$choices[0] = $_POST['Choice1'];
$choices[1] = $_POST['Choice2'];

//Insert question query
$stmt = mysqli_prepare($conn, "INSERT INTO Questions (Question) VALUES ('?')");
mysqli_stmt_bind_param($stmt, 's',$question_p);
$question_p = $question;
mysqli_stmt_execute($stmt);

$result = mysqli_stmt_num_rows($stmt);
$id = mysqli_insert_id($conn);

if ($result) {
    foreach ($choices as $choice) {
        if ($choice != '') {
            //Choice query
            foreach ($categories as $category) {
                if ($category != '') {
                    $query = "INSERT INTO Choices(Choice, Question_ID, Category_ID) VALUES ('$choice', '$id', '$category')";
                    $results = $conn->query($query);
                    if($results){
                        continue;
                    }else{
                        echo "error";
                    }
                }
            }
        }
    }
} else {
    echo $conn->error;
}
}else{
echo "Not Set";
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Используйте подготовленные операторы, а PDO улучшит безопасность и сделает код более эффективным.

Попробуйте что-то вроде этого:

//.... 
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

// connecting to db
$pdo = new PDO($dsn, $user, $pass, $opt);

$sql = "INSERT INTO Questions (Question) VALUES (:question)";

try{
    //prepare your first query
    $stmt = $pdo->prepare($sql);

    //now you can bind your parameters to the query
    $stmt->bindParam(':question', $question, PDO::PARAM_STR);

    $stmt->execute();
    $id = $pdo->lastInsertId();

    // check id instead -- result can be true even if the row wasn't inserted
    if ($id > 0) {
        // define your next query only once!
        $query = "INSERT INTO Choices(Choice, Question_ID, Category_ID) VALUES (:choice, :id, :category)";

        //prepare only once!
        $stmtQuery = $pdo->prepare($query);

        //bind only once!
        $stmtQuery->bindParam(':choice', $choice, PDO::PARAM_STR);
        $stmtQuery->bindParam(':id', $id, PDO::PARAM_INT); //assuming id is type int
        $stmtQuery->bindParam(':category', $category, PDO::PARAM_STR);

        foreach ($choices as $choice) {
            if ($choice != '') {
                //Choice query
                foreach ($categories as $category) {
                    if ($category != '') {
                        //execute as often as needed
                        $stmt->execute();
                    }
                }
            }
        }
    }
    else {
        echo = "no row inserted";
    }
}
catch (PDOException $e){
    echo = "An error occurred." . $e->getMessage();
}

Отказ от ответственности

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

РЕДАКТИРОВАТЬ

С функцией вставки зависимостей (... необходимость вставки новой строкиТОЛЬКО в случае успешной предыдущей вставки) следует включить стратегию beginTransaction / commit / rollback, которая подходит лучше всего.Используя $pdo->beginTransaction(); в начале $pdo->rollback();, если вы хотите откатиться при возникновении ошибки, и $pdo->commit();, где вы готовы сделать все изменения «постоянными».

0 голосов
/ 24 мая 2018

Попробуйте добавить раздел else, чтобы перехватить потенциальные ошибки:

else
{
    echo $conn->error;
}

Никогда не следует использовать пользовательский ввод непосредственно в операторе SQL.Используйте подготовленные операторы для защиты вашего сайта от SQL-инъекций.

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