Php 向MySql数据库发布两次(有时)
我有一个脚本,可以将表单响应发布到MySQL数据库。然而,它有时会在每行之间的秒数内向表中发布两次 以下是处理脚本:Php 向MySql数据库发布两次(有时),php,mysql,session,Php,Mysql,Session,我有一个脚本,可以将表单响应发布到MySQL数据库。然而,它有时会在每行之间的秒数内向表中发布两次 以下是处理脚本: if (isset($_POST['SignIn'])) { $Name = $_POST['Name']; $Sleep = $_POST['Sleep']; $Soreness = $_POST['Soreness']; $Fatigue = $_POST['Fatigue']; $Ene
if (isset($_POST['SignIn']))
{
$Name = $_POST['Name'];
$Sleep = $_POST['Sleep'];
$Soreness = $_POST['Soreness'];
$Fatigue = $_POST['Fatigue'];
$Energy = $_POST['Energy'];
$Stress = $_POST['Stress'];
$Total = $Sleep + $Soreness + $Fatigue + $Energy + $Stress;
$Comments = $_POST['Comments'];
$sql = "
INSERT INTO
YDP_Wellbeing (Name, Sleep, Soreness, Fatigue, Energy, Stress, Total, Comments)
VALUES
('$Name', $Sleep, $Soreness, $Fatigue, $Energy, $Stress, $Total, '$Comments')";
if (mysqli_query($con, $sql))
{
$_SESSION['alert-type'] = 'success';
$_SESSION['alert-head'] = 'Welcome!';
$_SESSION['alert-body'] = 'Thank You <strong>' . $Name . '</strong> You\'re Response Has Been Submitted.';
header("location: index.php");
}
else
{
echo "Failed: " . mysqli_error($con);
}
}
if(设置($\u POST['sign']))
{
$Name=$_POST['Name'];
$Sleep=$_POST['Sleep'];
$sorness=$_POST['sorness'];
$Fatigue=$_POST['Fatigue'];
$Energy=$_POST['Energy'];
$Stress=$_POST['Stress'];
$总计=$睡眠+$疼痛+$疲劳+$能量+$压力;
$Comments=$_POST['Comments'];
$sql=”
插入
YDP_健康(姓名、睡眠、疼痛、疲劳、精力、压力、总数、评论)
价值观
(“$Name”、$Sleep、$sorness、$failure、$Energy、$Stress、$Total、$Comments”)”;
if(mysqli_查询($con,$sql))
{
$\会话['alert-type']='success';
$_会话['alert-head']=“欢迎!”;
$\u SESSION['alert-body']='谢谢你。$Name.你的回复已经提交';
标题(“location:index.php”);
}
其他的
{
echo“失败:”.mysqli_错误($con);
}
}
有时它会发布一次,有时它会发布两次,因此问题是间歇性的,可能会出现?您的代码容易受到以下攻击 1.)将变量直接传递到sql查询时,sql注入攻击。我已经用事先准备好的声明缓解了它 2.)Html注入和XSS攻击:您需要确保对表单输入进行消毒。我对整数使用了
intval()
,对字符串使用了strip\u tags()
,假设
你想去掉危险的html
3.)会话固定攻击。我还使用session\u regenate\u id()
这是您重新编写的代码
<?php
$servername = "localhost";
$username = "db username goes here";
$pass = "your db password here";
$db_name = "your db name here";
// Create connection
$conn = new mysqli($servername, $username, $pass, $db_name);
// Check connection
if ($conn->connect_error) {
echo "Connection to db failed";
}
if(isset($_POST['SignIn'])) {
$Name = strip_tags($_POST['Name']);
$Sleep = intval($_POST['Sleep']);
$Soreness = intval($_POST['Soreness']);
$Fatigue = intval($_POST['Fatigue']);
$Energy = intval($_POST['Energy']);
$Stress = intval($_POST['Stress']);
$Total = $Sleep + $Soreness + $Fatigue + $Energy + $Stress;
$Comments = strip_tags($_POST['Comments']);
// prepare your data
// i stands for integers and s stands for string
$stmt = $conn->prepare("INSERT INTO YDP_Wellbeing (Name, Sleep, Soreness, Fatigue, Energy, Stress, Total, Comments) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("siiiiiis", $Name,$Sleep,$Soreness,$Fatigue,$Energy,$Stress,$Total,$Comments);
$stmt->execute();
if($stmt){
echo "data inserted successfully";
// create session
session_start();
// prevents session fixation attacks using session regenerate id
session_regenerate_id();
//
$_SESSION['alert-type'] = 'success';
$_SESSION['alert-head'] = 'Welcome!';
$_SESSION['alert-body'] = 'Thank You <strong>' . $Name . '</strong> You\'re Response Has Been Submitted.';
header("location: index.php");
}else{
echo "data insertion failed";
}
}
$stmt->close();
$conn->close();
?>
不一致行为最可能的原因是重定向后未能停止脚本。如果不添加die()
或exit()
,脚本将继续执行
由于您在if
子句中包含了该部分,该部分用于测试后期提交,因此我假设如果测试失败,它将提交一份表单。由于脚本在重定向后无法终止,它将再次打印表单(可能重定向,也可能不重定向)
因此,可能发生的情况是您的用户正在提交表单;然后看到提交后提交的相同表格
走在他快乐的路上
重新提交表格,或
尝试按“上一步”按钮并意外地重新提交表单
听起来代码有时会被调用两次。可以是用户在等待片刻时再次单击按钮,也可以是重新加载处理表单帖子的页面。这既是一个安全问题,也是常见的bug来源。您将希望在此处了解SQL注入:以及有关如何防止SQL注入的信息和示例:@David是正确的。这里没有任何东西会插入两次,因此用户必须调用它两次重定向后的代码>以阻止脚本继续。请看,您是否验证了重定向是否确实有效,或者它只是返回到同一页面,看起来像重定向了一样?为什么strip_tags()
和intval()
?请阅读第2句。我刚刚添加了它,我说假设他想要去除所有html元素。Intval()我需要确保他要求和的值是整数。感谢这是为了查看,而不是为了在执行查询时阻止sql注入。事先准备好的陈述会解决这个问题。为什么要重写?不管他们最后发生了什么,你的回答IMHO,都不能解决这个问题。虽然这对OP来说是非常有用的信息,但实际上并不能回答这个问题。