在php中添加记录时未将正确的数据插入数据库

在php中添加记录时未将正确的数据插入数据库,php,mysql,mysqli,Php,Mysql,Mysqli,试图将记录插入数据库,但数据未正确插入数据库表 以下是数据库表: 问题数据库表: question_number question_no text status 1 1 html 1 2 2 php 0 id question_number is_correct text status 1 1 1 ab

试图将记录插入数据库,但数据未正确插入数据库表

以下是数据库表:

问题数据库表:

question_number  question_no  text  status
1                 1           html    1
2                 2           php     0
id   question_number   is_correct  text   status
1       1                1        abc       1
2       1                0        abc       1
3       1                0        abc       1
4       1                0        abc       1 
5       2                0        abcdfd    0
6       2                1        abcdsf    0
7       2                0        abcdsf    0
8       2                0        abcsdfg   0
id   question_number   is_correct  text          status
9        2             1           abchdfgh        1
10       2             0           abfdhdfc        1
11       2             0           afdhgbc         1
12       2             0           adfhbc          1 
选择数据库表:

question_number  question_no  text  status
1                 1           html    1
2                 2           php     0
id   question_number   is_correct  text   status
1       1                1        abc       1
2       1                0        abc       1
3       1                0        abc       1
4       1                0        abc       1 
5       2                0        abcdfd    0
6       2                1        abcdsf    0
7       2                0        abcdsf    0
8       2                0        abcsdfg   0
id   question_number   is_correct  text          status
9        2             1           abchdfgh        1
10       2             0           abfdhdfc        1
11       2             0           afdhgbc         1
12       2             0           adfhbc          1 
如果我试图添加一条新记录,它将以这种格式插入数据库表中

问题表:

question_number  question_no  text  status
3                2           html    1
选择数据库表:

question_number  question_no  text  status
1                 1           html    1
2                 2           php     0
id   question_number   is_correct  text   status
1       1                1        abc       1
2       1                0        abc       1
3       1                0        abc       1
4       1                0        abc       1 
5       2                0        abcdfd    0
6       2                1        abcdsf    0
7       2                0        abcdsf    0
8       2                0        abcsdfg   0
id   question_number   is_correct  text          status
9        2             1           abchdfgh        1
10       2             0           abfdhdfc        1
11       2             0           afdhgbc         1
12       2             0           adfhbc          1 
在选项表中,将问题编号插入为2,但在此处应插入为3

以下是代码:

<?php
if(isset($_POST['submit'])){
    //Get post variables
    $question_number = $_POST['question_no'];
    $question_text = $_POST['question_text'];
    $correct_choice = $_POST['correct_choice'];
    //Choices array
    $choices = array();
    $choices[1] = $_POST['choice1'];
    $choices[2] = $_POST['choice2'];
    $choices[3] = $_POST['choice3'];
    $choices[4] = $_POST['choice4'];
    $choices[5] = $_POST['choice5'];

    //Question query
    $query = "INSERT INTO `questions`(question_no, text)
                VALUES('$question_number','$question_text')";
            //print_r($query);
            //die();                
    //Run query
    $insert_row = $mysqli->query($query) or die($mysqli->error.__LINE__);

    //Validate insert
    if($insert_row){
        foreach($choices as $choice => $value){
            if($value != ''){
                if($correct_choice == $choice){
                    $is_correct = 1;
                } else {
                    $is_correct = 0;
                }
                //Choice query
                $query = "INSERT INTO `choices` (question_number, is_correct, text)
                        VALUES ('$question_number','$is_correct','$value')";

                //Run query
                $insert_row = $mysqli->query($query) or die($mysqli->error.__LINE__);

                //Validate insert
                if($insert_row){
                    continue;
                } else {
                    die('Error : ('.$mysqli->errno . ') '. $mysqli->error);
                }
            }
        }
        $msg = 'Question has been added';
    }
}

/*
* Get total questions
*/
$query = "SELECT * FROM `questions` WHERE status='1'";
//Get The Results
$questions = $mysqli->query($query) or die($mysqli->error.__LINE__);
$total = $questions->num_rows;
$next = $total+1;
?>
        <form method="post" action="add.php">
            <p>
                <label>Question Number: </label>
                <input type="number" value="<?php echo $next; ?>" name="question_no" />
            </p>
            <p>
                <label>Question Text: </label>
                <input type="text" name="question_text" required/>
            </p>
            <p>
                <label>Choice #1: </label>
                <input type="text" name="choice1" required/>
            </p>
            <p>
                <label>Choice #2: </label>
                <input type="text" name="choice2" required/>
            </p>
            <p>
                <label>Choice #3: </label>
                <input type="text" name="choice3" required/>
            </p>
            <p>
                <label>Choice #4: </label>
                <input type="text" name="choice4" required/>
            </p>
            <p>
                <label>Choice #5: </label>
                <input type="text" name="choice5" required/>
            </p>
            <p>
                <label>Correct Choice Number: </label>
                <input type="number" name="correct_choice" />
            </p>
            <p>
                <input type="submit" name="submit" value="Submit" />
            </p>
        </form>

由于您的
问题编号
是插入问题的自动递增ID,因此您需要在
选项
中的新行的
问题编号
列中插入该值

通过执行以下操作获取最后插入的id

$insert_row->insert_id;
我已经修改了您的代码以简化它,并将其转换为使用准备好的语句,您也应该对
问题
insert执行此操作

在循环中插入多行时,使用预先准备好的语句还有其他好处。您只需准备一次查询,然后执行多次

if ($insert_row) {
    $question_number = $insert_row->insert_id;

    $query = "INSERT INTO `choices` (question_number, is_correct, text) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($query) or die($mysqli->error.__LINE__);
    foreach ($choices as $choice => $value) {
        if (!empty($value) {
            $is_correct = (int)($correct_choice == $choice);
            //Choice query

            //Run query
            $stmt->bind_param('sss', $question_number, $is_correct, $value);
            $stmt->execute();

            if ($stmt->errno) {
                die('Error : ('.$stmt->errno . ') '. $stmt->error);
            }
        }
    }
    $stmt->close();
    $msg = 'Question has been added';
}

  • (如果您也将第一个查询转换为准备好的语句)

由于您的
问题编号
是插入问题的自动递增ID,因此您需要在
选项
中的新行的
问题编号
列中插入该值

通过执行以下操作获取最后插入的id

$insert_row->insert_id;
我已经修改了您的代码以简化它,并将其转换为使用准备好的语句,您也应该对
问题
insert执行此操作

在循环中插入多行时,使用预先准备好的语句还有其他好处。您只需准备一次查询,然后执行多次

if ($insert_row) {
    $question_number = $insert_row->insert_id;

    $query = "INSERT INTO `choices` (question_number, is_correct, text) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($query) or die($mysqli->error.__LINE__);
    foreach ($choices as $choice => $value) {
        if (!empty($value) {
            $is_correct = (int)($correct_choice == $choice);
            //Choice query

            //Run query
            $stmt->bind_param('sss', $question_number, $is_correct, $value);
            $stmt->execute();

            if ($stmt->errno) {
                die('Error : ('.$stmt->errno . ') '. $stmt->error);
            }
        }
    }
    $stmt->close();
    $msg = 'Question has been added';
}

  • (如果您也将第一个查询转换为准备好的语句)

在您的选择查询中,您插入了
$question\u number
,但应该是您在问题表中插入的最后一个插入id,用于最后一个插入id使用此
$last\u id=mysqli\u插入id($conn)


希望这对您的选择查询有所帮助,您可以插入
$question\u number
,但应该是您在问题表中插入的最后一个插入id,用于最后一个插入id使用此
$last\u id=mysqli\u insert\u id($conn)

$last_id = $mysqli->insert_id; 
希望这有帮助

$last_id = $mysqli->insert_id; 
已处理此查询



处理此查询时

是否检查了哪里出错?您可以在执行SQL查询之前简单地转储它们,以检查生成是否不正确work@NicoHaase它是在选项插入表//Choice query$query=“INSERT INTO
choices
(问题编号,是否正确,文本)值(“$question\u编号”,“$is\u正确”,“$value”)";
问题编号
问题编号
之间有什么区别?其中一个是自动递增的ID吗?那么,您是否已转储所有执行的
INSERT
查询并对其进行检查?问题编号是自动递增的ID,问题编号是我插入的问题编号您是否检查了哪里出错了?您可以在执行SQL查询之前简单地转储它们,以检查生成是否不正确work@NicoHaase它是在选项插入表//Choice query$query=“INSERT INTO
choices
(问题编号,是否正确,文本)值(“$question\u编号”,“$is\u正确”,“$value”)";
问题编号
问题编号
之间有什么区别?其中一个是自动递增的ID吗?那么,您是否转储了所有执行的
INSERT
查询并检查了它们?问题编号是自动递增的ID,问题编号是我插入的问题编号嗨,您在
$stmt->bind\u param('sss',$Is\u correct,$value)中缺少一个参数哎呀。谢谢@Qirel我有一个疑问,为什么您在bind_param中提到sss,它是与该绑定相关联的变量的类型
s
表示字符串,如果处理的是整数,则为
i
。因此,从技术上讲,您应该是
iis
,因为
$question\u number
$is\u correct
是一个整数,而
$value
是一个字符串哎呀。谢谢@Qirel我有一个疑问,为什么您在bind_param中提到sss,它是与该绑定相关联的变量的类型
s
表示字符串,如果处理的是整数,则为
i
。因此,从技术上讲,您的应该是
iis
,因为
$question\u number
$is\u correct
是一个整数,而
$value
是一个字符串。添加此插入问题后,选项表的数字为零,添加此插入问题后,选项表的数字为零