Я новичок в PHP, но обычно могу решить большинство проблем, но эта проблема у меня есть.
Я пытаюсь создать подписку на новостную рассылку (одно поле) с помощью одной кнопки отправки. У меня это работает нормально, отправив электронное письмо и вставив данные формы в мою таблицу. Однако я хочу добавить функциональность, чтобы письмо с подтверждением отправлялось тому, кто подписывается. Я провел обширные исследования и знаю метод, лежащий в основе этого, но мой код просто не вводит данные в мою 2-ю таблицу, используемую для хранения информации подтверждения.
У меня есть 2 таблицы:
В таблице 1 названы столбцы «новостной рассылки»:
idmail,emailaddress,datetime,state
idmail
установлен в AUTO_INCREMENT
Таблица 2 с именем столбца подтверждения:
idconfirm,emailaddress,confirmkey
Вот мой код (я пропустил часть электронной почты, которая идет после этого, так как все работает нормально):
//connect to database
include('admin/connection.php');
$email = mysqli_real_escape_string($dbc, $_POST['email']);
//check if value exists in table
$result = mysqli_query($dbc, "SELECT emailaddress FROM newsletter WHERE emailaddress = '$email'");
if (mysqli_num_rows($result)==0) {
//Insert value into database
$query1 = mysqli_query($dbc, "INSERT INTO newsletter(emailaddress, datetime, state) VALUES('$email','$now','0')");
mysqli_query($dbc, $query1);
// Get ID of last record
$id = mysqli_insert_id($dbc);
//Create a random key
$hash = $email.date('mY');
$hash = md5($hash);
//Insert value into database
$query2 = mysqli_query($dbc, "INSERT INTO confrim(idconfirm, emailaddress, confirmkey) VALUES('$id','$email','$hash')");
mysqli_query($dbc, $query2);
Когда я отправляю адрес электронной почты, первая таблица заполняется правильно.
Цель здесь — получить автоматический идентификатор, созданный в первом запросе INSERT INTO, в переменную, а затем добавить его в столбец 2-й таблицы с именем ‘idconfim’.
Я старался:
echo $id;
echo $email;
echo $hash;
и все переменные содержат правильную информацию.
У кого-нибудь есть какие-либо идеи?
Я пытался многое перечислить здесь, но я исследовал это, и я просто не знаю, где я иду не так.
Заранее спасибо.
Я публикую свой комментарий в качестве ответа здесь:
Проблема здесь заключается в следующем $query2 = mysqli_query($dbc,... '$hash')"); mysqli_query($dbc, $query2);
и ты должен был получить ошибку об этом. Это помимо возможной опечатки для имени таблицы confrim
,
Вы должны удалить mysqli_query($dbc, $query2);
здесь и замените его на:
if($query2){ echo "Success"; }
else{ echo "Error: " . mysqli_error($dbc);
(Другое редактирование): Вы сделали ту же ошибку здесь:
$query1 = mysqli_query($dbc, "INSERT INTO newsletter ... '$now','0')");
mysqli_query($dbc, $query1);
и должен быть изменен на:
if($query1){ echo "Success"; }
else{ echo "Error: " . mysqli_error($dbc);
Как указано в комментариях RiggsFolly; не используйте MD5 для хэширования паролей, это больше не безопасно. За 30 лет под мостом течет много воды.
использование password_hash()
http://php.net/manual/en/function.password-hash.php и подготовленное заявление.
Редактировать: Теперь мне кажется, что после повторного просмотра вашего кода вы пытаетесь сохранить пароль, а не ключ подтверждения. Если это так, то вы можете игнорировать пароли. Однако, если вы решите использовать MD5 для хранения паролей в будущем, нет.
Одна из проблем заключается в том, что вы не видите ошибку MySQL, если она есть. Таким образом, вам нужно либо проверить журналы сервера на наличие ошибок в PHP, вы можете принудительно распечатать ошибку в журнале ошибок или сделать что-то еще:
например:
mysqli_query($dbc, $query2) or error_log(mysqli_error($dbc));
mysqli_query($dbc, $query2) or custome_error_handler(mysqli_error($dbc));
Также php должен возвращать HTTP-ошибку клиенту. Вы должны поймать эту ошибку.
Как только вы увидите ошибку SQL, вам будет легко понять, что вы сделали неправильно.
РЕДАКТИРОВАТЬ Фред II поймал настоящую ошибку, но я думаю, что ошибка была бы сгенерирована, когда ошибка будет совершена в первый раз:
mysqli_query($dbc, $query1);
$query1
не строка И если вы заметили, что уже выполнили запрос в строке выше. Чтение журналов ошибок PHP покажет вам, где именно находится ошибка.
Извините за потраченное время.
Спасибо jeffery_the_wind за указание на логи. Я буду использовать их в будущем.
Проблема заключалась в ДВУХ орфографических ошибках: одна в имени столбца в php и одна в базе данных mysql. не сказать ни слова! Я слегка лексиклик!
Спасибо за ваши быстрые ответы.