Запрос SQL вставляет данные в базу данных дважды - PullRequest
0 голосов
/ 05 марта 2019

Я обновлял поля базы данных, используя php и mysql, когда дублирующаяся строка начала сохраняться в БД. Не работает ни на локальном хосте, ни на сервере Вот код:

<?php
$con = mysqli_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysqli_error($con));
  }
mysqli_select_db($con,"excel");
$sql="INSERT INTO mark (date, time_stamp, agency, a_name, first_name, last_name, address, city, zip, phone, auto, ins_det)
VALUES ('$_POST[date]','$_POST[time]','$_POST[agency]','$_POST[a_name]','$_POST[f_name]','$_POST[l_name]','$_POST[add]','$_POST[city]','$_POST[zip]','$_POST[phone]','$_POST[auto]','$_POST[ins_det]')";

$res = mysqli_query($con,$sql);
if (!$res)
  {
  die('Error: ' . mysqli_error($con));
  }
    else
    {
        echo "1 record added";
    }
mysqli_close($con);
?>

Вот код для веб-формы, который перенаправляет на вышеуказанный код при отправке

<html>
    <head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
    <h2 align='center'>Mark Noffsinger</h2>
    </head>
<body>
    <div class="outer-container">
        <div class="col-sm-4"><form action="show_data.php">
            <input type="submit" class="btn btn-default" value="Show this month's leads"/></form>
            </div>
        <form action="form_data.php" method="post" class="form-horizontal">

            <div class="col-sm-8" "form-group">
                <label>Date:</label><br>
                <input type="date" class="form-control" id="date" name="date"/>
                <label>Time:</label><br>
                <input type="time" class="form-control" id="time" name="time"/>
                <label>Agency:</label><br>
                <input type="text" class="form-control" id="agency" name="agency"/>
                <label>Agent's Name:</label><br>
                <input type="text" class="form-control" id="a_name" name="a_name"/>
                <label>First Name:</label><br>
                <input type="text" class="form-control" id="f_name" name="f_name"/>
                <label>Last Name:</label><br>
                <input type="text" class="form-control" id="l_name" name="l_name"/>
                <label>Address:</label><br>
                <input type="text" class="form-control" id="add" name="add"/>
                <label>City:</label><br>
                <input type="text" class="form-control" id="city" name="city"/>
                <label>Zip:</label><br>
                <input type="number" class="form-control" id="zip" name="zip"/>
                <label>Phone:</label><br>
                <input type="number" class="form-control" id="phone" name="phone"/>
                <label>Auto:</label><br>
                <input type="number" class="form-control" id="auto" name="auto"/>
                <label>Insurance Details:</label><br>
                <input type="text" class="form-control" id="ins_det" name="ins_det"/><br>
                <input type="Submit" value="Submit" class="btn btn-default" />
            </div>  
        </form>
    </div>
    </body>
</html>

edit: номер телефона используется здесь в качестве первичного ключа, и каждый раз, когда я вставляю данные, я думаю, используя кэшированную информацию, пытался очистить кеш, использовал разные браузеры, но все же каждый раз, когда я отправляю форму, он принимает номер телефона последней строки обновляется и выдает ошибку для дублирования отведений

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

когда вы используете INSERT, наиболее вероятно (попытка) INSERT новой строки ...

правильный глагол будет REPLACE INTO, который либо UPDATE, либо INSERT INTO.это сохраняет один предыдущий оператор SELECT, который должен определить, следует ли использовать UPDATE или INSERT INTO;потому что вы пытаетесь дважды добавить ключ UNIQUE, что строго запрещено.

с использованием phone в качестве PRIMARY KEY может привести к проблемам.Я бы предпочел вместо этого использовать какой-нибудь столбец AUTOINCREMENT contact_id ... просто потому, что существуют разные способы форматирования номера телефона - и это ввод пользователя - для дальнейшей проверки ввода $_POST с помощью isset() и !empty() предлагается;дополнительная проверка данных на стороне клиента здесь не имеет значения.Я также нахожу странное имя таблицы mark, которое, скорее всего, следует нормализовать к столбцу agent_id.

, см. Документацию по подготовленным операторам , которые весьма полезны.

0 голосов
/ 06 марта 2019

Как и другие разработчики Stackoverflow, ваш код представляет собой угрозу безопасности, если вы планируете использовать его в рабочей среде.

Я просто выбираю три параметра формы ** (имя, фамилия, адрес) ** длявоссоздайте этот код, гарантируя, что атака с использованием SQL-инъекций невозможна.Вы можете добавить другие параметры формы, следуя моему методу.

Пожалуйста, убедитесь, что все учетные данные базы данных в порядке, прежде чем тестировать

<?php
$con=mysqli_connect("localhost","root","my_password","yourdb goes");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// escape variables Against sql injections
$firstname = mysqli_real_escape_string($con, $_POST['f_name']);
$lastname = mysqli_real_escape_string($con, $_POST['l_name']);
$address = mysqli_real_escape_string($con, $_POST['add']);

$sql="INSERT INTO mark (first_name, last_name, address)
VALUES ('$firstname', '$lastname', '$address')";

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con);
?> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...