При отправке формы он вводит несколько строк в mysql

#php #html #mysqli

#php #HTML #mysqli

Вопрос:

Приведенный ниже тестовый код, который уже был предложен полезным участником, вызывает некоторые неожиданные проблемы. Во-первых, когда я отправляю кнопку «cust_submit», она по какой-то причине вводит несколько записей в базу данных, а не только одну строку ввода.

Во-вторых, я хотел включить идентификатор автоматического увеличения раздела «inf_submit», но он выдает ошибку «Только переменные могут быть переданы по ссылке в»

 
<?php
ob_start(); //Turns on output buffering
session_start(); //This starts a session variable where it store the input so the user doesnt have to start over if they get an error
$con = mysqli_connect("localhost","root","","test-sql"); //connection variables
  
$timezone = date_default_timezone_set("Europe/London");
  
if(mysqli_connect_errno()){
    echo "failed to connect:" . mysqli_connect_errno();
}

if ($con->connect_error){
    die("Connection failed: ". $con->connect_error);
    } echo "connected successfully";
?>

<html>
<head>
<!-- here we add the links and the jquery-->
<title>Register Project</title>
</head>
<body>
        
<div id="first">
    <form action="fromstackoverview.php" method="POST">
    <input type="text" name="Inf_fname" placeholder="First Name" required>
    <br>
    <input type="text" name="Inf_lname" placeholder="Last Name" required>
    <br>
    <input type="submit" name="inf_submit" value="Register">
        
    </form>
</div>

<div id="second">
                
    <form action="fromstackoverview.php" method="POST">                 
    <br>
    <input type="text" name="Cust_fname" placeholder="First Name" required>
    <br>                                             
    <input type="text" name="Cust_lname" placeholder="Last Name" required>
    <br>
    <input type="text" name="cust_email" placeholder="Email" required>
    <br>
    <input type="submit" name="cust_submit" value="Register">
                        
    </form>
</div>
</body>

</html>

 <?php

 $inf_fname = "";
 $cust_fname = "";
 $inf_lname = "";
 $cust_lname = "";
 $cust_em = "";


 if(isset($_POST['inf_submit'])) {

     $inf_fname = strip_tags($_POST['Inf_fname']);
     $inf_fname = str_replace(' ', '', $inf_fname);
     $_SESSION['Inf_fname'] = $inf_fname;
     $inf_lname = strip_tags($_POST['Inf_lname']);
     $inf_lname = str_replace(' ', '', $inf_lname);
     $_SESSION['Inf_lname'] = $inf_lname;

     $stmt = mysqli_prepare($con, "INSERT INTO inf VALUES (?, ?, ?)");
     mysqli_stmt_bind_param($stmt, "sss", '', $inf_fname, $inf_lname);
     mysqli_stmt_execute($stmt);
 } else if (isset($_POST['cust_submit'])) {

     $cust_fname = strip_tags($_POST['Cust_fname']);
     $cust_fname = str_replace(' ', '', $cust_fname);
     $_SESSION['Cust_fname'] = $cust_fname;
     $cust_lname = strip_tags($_POST['Cust_lname']);
     $cust_lname = str_replace(' ', '', $cust_lname);
     $_SESSION['Cust_lname'] = $cust_lname;
     $cust_em = strip_tags($_POST['cust_email']); //removes html tags
     $cust_em = str_replace(' ', '', $cust_em); //remove spaces in name
     $cust_em = ucfirst(strtolower($cust_em)); //This will keep the first letter upper case and lower case everything else
    $_SESSION['cust_email'] = $cust_em; //Stores input into session variable

     $stmt = mysqli_prepare($con, "INSERT INTO customer VALUES (?, ?, ?)");
     mysqli_stmt_bind_param($stmt, "sss", $cust_fname, $cust_lname, $cust_em);
     mysqli_stmt_execute($stmt);
 }
 ?>
  

Комментарии:

1. «я хотел включить идентификатор автоматического увеличения » … если столбец является столбцом с автоматическим увеличением, то вы не можете включить его в свой запрос INSERT. В конце концов, это не логично, какое значение вы собираетесь ему передать? База данных сгенерирует значение для вас — в этом весь смысл. если вы попытаетесь включить это в свой запрос и передать любое значение (даже null или пустую строку), вы получите ошибку SQL. (Ваша фактическая ошибка заключается в том, что вы пытались передать строку литерала в bind_param, но это позволяет вам передавать только переменные — поскольку нет смысла привязывать литерал, он не подвержен манипуляциям

2. В любом случае, показанный вами код не способен вставлять несколько строк одновременно. Происходит что-то еще (например, люди, возможно, дважды щелкают по кнопке отправки или повторно публикуют форму, пытаясь обновить браузер), или одновременные пользователи создают записи, или что-то в этом роде. Это не является прямой ошибкой этого кода, он не содержит циклов или других механизмов для повторения вставки. Должно быть, PHP-скрипт каким-то образом вызывается более одного раза.

3. @ADyson Понятно, спасибо. Я раскомментировал это. Я не знаю, почему OP прокомментировал этот код.

4. Называется ли этот скрипт «fromstackoverflow.php «? Также, можете ли вы подтвердить, поступает ли отправленная информация из формы 1 или из формы 2? Потому что, похоже, здесь нет никакого кода, который запускал бы запрос дважды. Итак, если вы введете информацию в форму 1 и нажмете отправить и то же самое с формой 2, какая из них даст двойную вставку?

5. Привет всем, итак, раздел был закомментирован для inf_submit, потому что он просто выдает ошибку в своем текущем формате. Понял, спасибо, АДисон, теперь я добавил пустую переменную, которая теперь больше не выдает ошибку для «cust_submit» и вводит данные, как ожидалось. Что касается множественной отправки, это странно, потому что я просто использовал этот фрагмент для тестирования добавления в sql, поэтому никто, кроме меня, не использует, но когда я добавлю немного php, чтобы не допускать дубликатов, возможно, это все равно остановит это.