Проводка дважды в базу данных MySql (по случаю) - PullRequest
0 голосов
/ 10 октября 2019

У меня есть скрипт, который отправляет ответы формы в базу данных 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);
        }
    }

Иногда он публикует один раз, а иногда - дважды, поэтомупроблема непостоянна, это могло бы появиться?

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Наиболее вероятной причиной несогласованного поведения является сбой остановки скрипта после перенаправления. Без добавления die() или exit() сценарий будет продолжать выполняться.

Поскольку вы включили раздел в предложение if, которое проверяет отправку POST, я предполагаю, что в случае сбояпроверить это представит форму для отправки. Поскольку сценарий не может завершиться после перенаправления, он снова напечатает форму (и может перенаправить, а может и не перенаправить).

Поэтому, вероятно, ваш пользователь отправляет форму;и затем, увидев ту же форму, представленную после отправки, либо

  1. продолжает свой веселый путь,
  2. повторно отправляет форму, либо
  3. пытается нажать кнопку возврата иповторно отправляет форму случайно
0 голосов
/ 10 октября 2019

Ваш код уязвим для следующих атак. Атаки

1.) SQL-инъекция Атака , поскольку вы передали переменную непосредственно в SQL-запросы. Я смягчил его, используя подготовленные операторы

2.) Html-инъекции и XSS-атака: вам нужно будет обеспечить санацию для входных данных формы. я использовал intval() для целых чисел и strip_tags() для строк, предполагая, что вы хотите удалить опасный html.

3.) атаку с фиксацией сеанса. Я также устраняю это, используя session _regenerate_id()

Вот ваш код Re написано

<?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();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...