我正在尝试将包含两个字段(名称和电子邮件)的表单发布到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);
这让我疯了。
答案 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)
我认为问题可能出在客户端。也许你的表格由于某种原因发布了两次。作为调试,我会做两件事:
email
PK只是为了在插入发生时立即给出错误。 答案 3 :(得分:0)
试 $ sql =“INSERT 忽略 INTO table_name(名称,电子邮件)VALUES('。$ name。”','“。$ email。 “')”;
答案 4 :(得分:0)
我奋斗了几个小时,才发现问题仅在Chrome中出现(您可以在其中找到很多扩展)。就我而言,是安全洪流扫描程序发送了两次请求。这是:两个插入项。