1

我有一个 HTML 表单,它将值提交到以下 PHP 文件,该文件将它们插入 MySQL 数据库:

<?php
  $con = mysql_connect("*","*","*");
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("*", $con);

  $sql="INSERT INTO scores (hometeam, awayteam, result)
  VALUES
  ('" . mysql_real_escape_string($_POST['hometeam']) . "',
   '" . mysql_real_escape_string($_POST['awayteam']) . "',
   '" . mysql_real_escape_string($_POST['result']) . "')";

  if (!mysql_query($sql,$con))
    {
    die('Error: ' . mysql_error());
    }
  echo "1 record added";

  mysql_close($con);
?>

有时 HTML 表单中的输入字段会留空,在这种情况下,我不希望将任何内容插入数据库。我希望该值保持NULL。在我这样填写表格的那一刻:

主队:蓝队
客队:[空白]
结果:获胜

以下内容被插入到我的数据库中:

主队:蓝队
客队:' '
结果:获胜

我想要插入/不插入的是:

主队:蓝队
客队:NULL
结果:获胜

我已经寻找了几个小时的解决方案。任何人都可以帮忙吗?谢谢你。

4

6 回答 6

2

好吧,它只会插入最终值,因为您正在执行 $sql 并且 $sql 的最后一个值是"INSERT INTO scores (result) VALUES ('$_POST[result]')";您通过放置相同的变量名来覆盖以前的值。

(!empty($_POST[hometeam]))如果字段有时可以为空,也请删除 !empty 。

于 2012-06-30T14:04:36.927 回答
2

您每次都在覆盖您的 SQL 语句。因为您的“结果”字段不为空,您将 SQL 语句设置为:

"INSERT INTO scores (result) VALUES ('$_POST[result]')"

这是唯一正在执行的语句 - 您的其他值将被忽略,因为它们不是该语句的一部分。

您需要做的是首先设置变量:

$hometeam = isset($_POST['hometeam']) ? $_POST['hometeam'] : NULL;
$awayteam = isset($_POST['awayteam']) ? $_POST['awayteam'] : NULL;
$result = isset($_POST['result']) ? $_POST['result'] : NULL;

然后,您可以进行数据库交互:

$sql = "INSERT INTO scores hometeam, awayteam, result VALUES $hometeam, $awayteam, $result";
if (!mysql_query($sql,$con))
{
    die('Error: ' . mysql_error());
}
echo "1 record added";

mysql_close($con);

我应该说我没有在这方面包含任何安全性 - 您应该查看 PDO 或准备好的语句以确保您的数据库不对 SQL 注入开放。

希望这可以帮助!

于 2012-06-30T14:05:15.273 回答
1

我认为在您的 html 表单中声明输入字段的名称存在一些问题。确保 $_POST[hometeam] 必须与表单中的输入名称相同

示例:在您的表单中

<input type="text" name="hometeam" value="" />

在你的 PHP

 if (!empty($_POST[hometeam])) {
  $sql="INSERT INTO scores (hometeam) VALUES ('$_POST[hometeam]')";
 } 

此外,在将其添加到数据库之前,请在您的帖子值中使用 addlashes 或 mysql_real_escape_string。

看看下面这个链接:

http://php.net/manual/en/function.addslashes.php

http://php.net/manual/en/function.mysql-real-escape-string.php

于 2012-06-30T14:03:02.900 回答
1

首先,这段代码有一个巨大的安全漏洞,它没有清理你的输入。用户可以插入他们喜欢的任何内容,并且无需任何检查即可在数据库上执行。这是不好的。 至少,您应该使用 mysql_real_escape_string() 之类的东西,即使这并不是最适合这项工作的东西(例如 Google PHP + PDO)。

其次,您实际上是在使用一个变量执行一个查询。如果设置了 $_POST['result'],则 $sql 将始终是最后一个值。您可能想要做的是像这样进行查询:

$query = 'INSERT INTO scores ('.$fields.') VALUES ('.$values.')';

并使用您的 if(!empty( .. )) 代码构造 $fields 和 $values 变量。

但是要重申清理您的输入

于 2012-06-30T14:03:38.580 回答
1

3 insert into 语句将插入 3 条记录,未指定的字段保留为 null 或默认值。您必须使用 1 insert into 语句,例如:

  <?php
  $con = mysql_connect("*","*","*");
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("*", $con);
  @$sql="INSERT INTO scores (hometeam,awayteam,result) VALUES ('{$_POST[hometeam]}','{$_POST[awayteam]}','{$_POST[result]}')";



  if (!mysql_query($sql,$con))
    {
    die('Error: ' . mysql_error());
    }
  echo "1 record added";

  mysql_close($con);
?>

在这里,未指定的值将作为空字符串出现,如果这是一个问题,首先使用 ifs 将它们分配给 3 个单独的变量(例如将空值设置为 null),然后使用它们

于 2012-06-30T14:05:51.840 回答
0
if (!empty($_POST['hometeam'])) {
  $sql="INSERT INTO scores (hometeam) VALUES ('" . $_POST['hometeam'] . "')";
}

注意“hometeam”部分周围的单引号。您还应该使用mysql_real_escape_string($_POST['hometeam']).

请记住,这将为每个调用创建多达 3 行,如果您想要有类似分数的行(主队、客队、结果),您需要以不同的方式构建查询(即单个查询而不是 3 个单独的查询)。

于 2012-06-30T14:02:48.767 回答