PHP和MySQL - 发布双重条目

时间:2010-05-03 16:02:47

标签: php mysql

我正在尝试将包含两个字段(名称和电子邮件)的表单发布到MySQL表中。

在本地服务器(我的笔记本电脑)上,它运行正常。

但是在生产服务器上,它发布了两次!

我无法弄清楚原因。

以下是代码:

$name = ucwords(strtolower(trim($_POST['name'])));

$email = strtolower(trim($_POST['email']));

$mysqli = new mysqli($server, $serveruser, $serverpass, $dbname);

$name = $mysqli->real_escape_string($name);

$email = $mysqli->real_escape_string($email);

$sql = "INSERT INTO table_name (name, email) VALUES ('" . $name . "', '" . $email . 
"')";

$res = mysqli_query($mysqli, $sql);

这让我疯了。

5 个答案:

答案 0 :(得分:2)

我知道这听起来很明显,但是,显而易见的事情往往是我们出于某种原因检查的最后一件事......

笔记本电脑和服务器上的文件是否相同?可能是你在其他地方执行类似的SQL查询,导致双重输入?

如果您注释掉包含(您认为唯一的)SQL查询的行,是否会将任何内容输入数据库?如果是这样,您在其他地方确实有第二个SQL查询。

使用 require include 函数将包含此代码的文件合并到另一个文件中?如果是这样, require_once include_once 功能会更好吗?

虽然这些其他修复可能有效,但它们是补丁 - 删除症状而不是解决原因。最好在最深层次上找到它,而不是仅仅解决这种意外行为。

答案 1 :(得分:2)

原因1.您的html表单发布了两次,请更正您的表单。

原因2。这是$mysqli = new mysqli($server, $serveruser, $serverpass, $dbname);的面向对象类型连接,在mysqli程序查询中无法正常工作,就像您尝试的那样,您应该有更多错误。

所以!在上述连接类型上,面向对象的查询应该像这样

if(isset($_POST['submit'])){
  //Check if form submited aganist repeating submit randomly
  $name = ucwords(strtolower(trim($_POST['name'])));
  $email = strtolower(trim($_POST['email']));

  stmt = $mysqli->prepare("INSERT INTO table_name (name, email) VALUES (?, ?)");
  $stmt->bind_param("ss", $name, $email);
  $stmt->execute();
  $stmt->close();
}

但是,如果您想使用mysqli connect,则需要像下面这样更改连接:

请参见mysqli_connect();程序:https://www.php.net/manual/en/function.mysqli-connect.php

而不是像这种程序方式那样查询:

if(isset($_POST['submit'])){
  //Check if form submited aganist repeating submit randomly
  $name = ucwords(strtolower(trim($_POST['name'])));
  $email = strtolower(trim($_POST['email']));

  $sql = "INSERT INTO table_name (name, email) VALUES (?, ?)";
  $stmt = mysqli_prepare($link, $sql);
  // Bind variables to the prepared statement as parameters
  mysqli_stmt_bind_param($stmt, "ss", $name, $email);

  // Attempt to execute the prepared statement
  if (mysqli_stmt_execute($stmt)) {
    // Redirect to your page
    //Or echo your message
  } else {
    echo "Something went wrong. Please try again later.";
  }
  mysqli_stmt_close($stmt);
}

在两种针对sql注入的解决方案中使用的prepared语句,语法错误为单qoute,double qoute等。使用prepared语句摆脱该qoutes和sql注入。

如果您的表单将vals发布到php的正确方法,则两种解决方案都可以正常工作。

答案 2 :(得分:0)

我认为问题可能出在客户端。也许你的表格由于某种原因发布了两次。作为调试,我会做两件事:

  1. 在数据库中设置email PK只是为了在插入发生时立即给出错误。
  2. 检查查询结果并发布错误(如果有)

答案 3 :(得分:0)

试 $ sql =“INSERT 忽略 INTO table_name(名称,电子邮件)VALUES('。$ name。”','“。$ email。 “')”;

答案 4 :(得分:0)

我奋斗了几个小时,才发现问题仅在Chrome中出现(您可以在其中找到很多扩展)。就我而言,是安全洪流扫描程序发送了两次请求。这是:两个插入项。