Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向MySql数据库发布两次(有时)_Php_Mysql_Session - Fatal编程技术网

Php 向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

我有一个脚本,可以将表单响应发布到MySQL数据库。然而,它有时会在每行之间的秒数内向表中发布两次

以下是处理脚本:

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来说是非常有用的信息,但实际上并不能回答这个问题。