我正在尝试使用PHP和HTML进行测验。某些选定的选项会插入results
表中,而其他选项则不会。 PHP代码如下:
<?php
error_reporting(E_ALL ^ E_NOTICE);
$conn = mysqli_connect("localhost", "student", "student") or die(mysqli_error());
mysqli_select_db($conn,'game') or die(mysqli_error());
if (isset ($_POST['submit']))
$Q2 = $_POST['Q2'];
$Q3 = $_POST['Q3'];
$Q4 = $_POST['Q4'];
$Q5 = $_POST['Q5'];
$Q6 = $_POST['Q6'];
echo "<h2>Data has been inserted</h2>";
$query = "INSERT into results values('$Q2','$Q3','$Q4','$Q5','$Q6')";
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
?>
这是HTML代码:
<p>Question 1 : When was the PS3 first released? </p>
<p align="left">
<input type="radio" name="Q2" value="2005">
2005
<br>
<input type="radio" name="Q2" value="2006">
2006
</p>
我遇到的问题是除了$Q2
之外,所有内容都被插入到表中。为什么会这样?
答案 0 :(得分:3)
您的if
语句仅在紧随其后的行上运行,因为它缺少括号。
你希望它是这样的:
if (isset ($_POST['submit']))
{
$Q2 = $_POST['Q2'];
$Q3 = $_POST['Q3'];
$Q4 = $_POST['Q4'];
$Q5 = $_POST['Q5'];
$Q6 = $_POST['Q6'];
echo "<h2>Data has been inserted</h2>";
$query = "INSERT into results values('$Q2','$Q3','$Q4','$Q5','$Q6')";
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
}
以及您的HTML:
<form action="your-pagename" method="POST">
<p>Question 1 : When was the PS3 first released? </p>
<p align="left">
<input type="radio" name="Q2" value="2005">
2005
<br>
<input type="radio" name="Q2" value="2006">
2006</p>
<br />
<input type="submit" value="Submit Test" />
</form>
但这很容易被SQL注入!请在执行之前清理并绑定或准备您的声明。
答案 1 :(得分:1)
任何mysql插入查询的工作方式如下(see)
同样来自doc
如果列列表和VALUES列表都为空, INSERT创建一行,每列设置为其默认值:
INSERT INTO tbl_name () VALUES();
在严格模式下,如果任何列没有默认值,则会发生错误。否则,MySQL使用 任何未明确显示的列的隐式默认值 定义默认值。
OR
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
[(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
或者:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
或者:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
[(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
所以你需要 COLUMN NAMES 才能正常工作
答案 2 :(得分:0)
正如有些人已经提到的那样,你的代码中有一个sql injection vulnerability。我认为阅读更有帮助,而不是将其修复到您的代码中: How can I prevent SQL injection in PHP?我可以为您修复此代码,但由于这是一个常见错误(#1中的OWASP top 10),如果您了解问题,它将使您的未来代码更好。
我遇到的问题是所有被插入到数据库除了'$ Q2'之外,这很奇怪,我似乎无法找到问题。 HTML在下面;
我认为isset($_POST['submit'])
是假的。除 $Q...
之外,每个 $Q2
都会从$ _POST 中分配一个值,因为它的分配是有条件的。它只发生if (isset($_POST['submit']))
if
如何运作 As advertised只有if
后面的单一语句是有条件的。
if ( isset($_POST['submit']) )
$Q2 = $_POST['Q2']; #this statement is conditional
$Q3 = $_POST['Q3']; #this one isn't
$Q4 = $_POST['Q4'];
$Q5 = $_POST['Q5'];
$Q6 = $_POST['Q6'];
#if there is no submit in $_POST, $Q2 is still uninitialized
#insert using $Q2, $Q3, $Q3 etc.
您可以使用大括号{}
将多个语句组合成一个。您可能只打算有条件地执行整个插入块:
if ( isset($_POST['submit']) ) { # { starts the conditional statement group
$Q2 = $_POST['Q2'];
$Q3 = $_POST['Q3'];
$Q4 = $_POST['Q4'];
$Q5 = $_POST['Q5'];
$Q6 = $_POST['Q6'];
#insert using $Q2, $Q3, $Q3 etc.
} # } ends the statement group
请注意,我使用缩进来清楚地传达if语句的块。一些设计得很好(而不是有机种植的)语言use indentation作为分组语句语法的一部分。
未设置$_POST['submit']
的原因可能是,因为form中没有给出值。您可以尝试在提交按钮的name
上设置<input>
- 属性。
<input type="submit" name="submit" />
PHP可以帮助您指出代码中的错误。您在插入代码未初始化中使用了$ Q2变量。这应该是一个错误,并用Zen of Python:
来解释错误不应该默默地传递。
除非明确地保持沉默。
特别是在开发过程中,您应该将error_reporting设置为严格的内容,例如E_ALL。