在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 INTOchoices
(问题编号,是否正确,文本)值(“$question\u编号”,“$is\u正确”,“$value”)";问题编号
和问题编号
之间有什么区别?其中一个是自动递增的ID吗?那么,您是否已转储所有执行的INSERT
查询并对其进行检查?问题编号是自动递增的ID,问题编号是我插入的问题编号您是否检查了哪里出错了?您可以在执行SQL查询之前简单地转储它们,以检查生成是否不正确work@NicoHaase它是在选项插入表//Choice query$query=“INSERT INTOchoices
(问题编号,是否正确,文本)值(“$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
是一个字符串。添加此插入问题后,选项表的数字为零,添加此插入问题后,选项表的数字为零