INSERT语句没有插入一些值

时间:2015-04-27 15:45:24

标签: php html

我正在尝试使用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之外,所有内容都被插入到表中。为什么会这样?

3 个答案:

答案 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如何运作

PHP中的

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作为分组语句语法的一部分。

您的HTML

未设置$_POST['submit']的原因可能是,因为form中没有给出值。您可以尝试在提交按钮的name上设置<input> - 属性。

<input type="submit" name="submit" />

让PHP更有帮助

PHP可以帮助您指出代码中的错误。您在插入代码未初始化中使用了$ Q2变量。这应该是一个错误,并用Zen of Python

来解释
  

错误不应该默默地传递。
  除非明确地保持沉默。

特别是在开发过程中,您应该将error_reporting设置为严格的内容,例如E_ALL。