#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, чтобы не допускать дубликатов, возможно, это все равно остановит это.