Хорошо, я новичок в использовании heroku и postgres, но у меня возникли проблемы, и я не могу понять, как это исправить.
Так что на моей странице указателей есть возможность для пользователей подписаться на рассылку. Когда они введут свою электронную почту, сайт проверит, что введенная информация действительна, и, если электронная почта уже подписана, если все в порядке, электронная почта будет добавлена в таблицу в базе данных.
html и Сценарий для него выглядит следующим образом:
<div id="subscribe">
<h2>Want to keep up-to-date with what is going on?</h2>
<p>Subscribe to our newsletter!</p>
<input id="email" name="email" type="email" placeholder="Enter email here..."><br /><br />
<button type="submit" id="submit">Submit</button>
<div id="result" style="margin-top: 50px;"></div>
</div>
<script src="https://code.jquery.com/jquery-1.11.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#email');
$('#email').keypress(function(event) {
var email = $('#email').val();
var keyCode = event.keyCode;
if (keyCode == 13) {
$.ajax({
type: 'POST',
url: 'subscribe.php',
data: {email: email},
success: function(data) {
$('#result').hide();
$('#result').html(data);
$('#result').fadeIn();
}
});
};
});
$('#submit').click(function () {
var email = $('#email').val();
$.ajax({
type: 'POST',
url: 'subscribe.php',
data: {email: email},
success: function(data) {
$('#result').hide();
$('#result').html(data);
$('#result').fadeIn();
}
});
});
});
</script>
Мой подписчик. php Файл:
<?php
require_once('includes/configure.php');
$message = "<html><body>";
$message .= "<table width='100%' bgcolor='#e0e0e0' cellpadding='0' cellspacing='0' border='0'>";
$message .= "<tr><td>";
$message .= "<table align='center' width='100%' border='0' cellpadding='0' cellspacing='0' style='max-width:650px; background-color:#fff; font-family:Verdana, Geneva, sans-serif;'>";
$message .= "<thead>
<tr height='80'>
<th colspan='4' style='background-color:#f5f5f5; border-bottom:solid 1px #bdbdbd; font-family:Verdana, Geneva, sans-serif; color:#000000; font-size: 27px;' >Thank you for subscribing to our newsletter. Make sure to check your junk box in case we unfortunately end up there </th>
</tr>
</thead>";
$message .= "<tbody>
</label>
</td>
</tr>
<tr height='20'>
<td colspan='4' align='center' style='background-color:#f5f5f5;'>
</td>
</tr>
</tbody>";
$message .= "</table>";
$message .= "</td></tr>";
$message .= "</table>";
$message .= "</body></html>";
$email = $_POST['email'];
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'mail/Exception.php';
require 'mail/PHPMailer.php';
require 'mail/SMTP.php';
$mail = new PHPMailer(TRUE);
if (isset($_POST['email'])) {
$emails = $_POST['email'];
if (filter_var($emails, FILTER_VALIDATE_EMAIL)) {
$query = $dbconn->prepare("SELECT `email` FROM `subscribe` WHERE `email` = ?" );
$query->bindValue( 1, $email );
$query->execute();
if( $query->rowCount() > 0 ) { # If rows are found for query
echo "You have already subscribed";
}
else {
try {
//insert into database
$stmt = $dbconn->prepare('INSERT INTO subscribe (email) VALUES (:email)') ;
$stmt->execute(array(
':email' => $email
));
} catch(PDOException $e) {
echo $e->getMessage();
}
echo "Thank you for subscribing";
try {
$mail->setFrom('*******', 'Newsletter');
$mail->addAddress('*******', '***');
$mail->Subject = 'Newsletter';
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = 'tls';
$mail->Username = '*******';
$mail->Password = '******';
$mail->Port = 587;
if ($mail->addReplyTo($_POST['email'])) {
$mail->Subject = 'Subscription';
//keeps it simple
$mail->isHTML(true);
// a simple message body
$mail->Body = $_POST['email']. " has subscribed to the newsletter";
//Send the message, check for errors
if (!$mail->send()) {
//The reason for failing to send will be in $mail->ErrorInfo
$msg = 'Sorry, something went wrong. Please try again later.';
} else {
$msg = 'Thanks for subscribing!.';
//header("Refresh:3; url=index.html#contact");
// echo "Your message was successfully sent";
}
} else {
$msg = 'Invalid email address, message ignored.';
}
$mail->ClearAddresses();
$mail->AddAddress($email);
$mail->Body = $message;
$mail->send();
/* Enable SMTP debug output. */
$mail->SMTPDebug = 4;
// $mail->send();
}
catch (Exception $e)
{
echo $e->errorMessage();
}
}
} else {
echo "Please enter a valid email...";
}
}
//}
?>
Так что, когда я ввожу что-то, как "Льюис" в поле электронной почты, это дает правильный вывод «Пожалуйста, введите действительный адрес электронной почты», но как только я ввожу фактический адрес электронной почты, я получаю эту ошибку в консоли:
jquery-1.11.3.min.js:5 POST https://sheltered-reef-10750.herokuapp.com/subscribe.php 500 (Internal Server Error)
send @ jquery-1.11.3.min.js:5
ajax @ jquery-1.11.3.min.js:5
(anonymous) @ (index):147
dispatch @ jquery-1.11.3.min.js:4
r.handle @ jquery-1.11.3.min.js:4
Когда я просматриваю логи heroku, я получаю:
PHP Fatal error: Uncaught PDOException: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "`
2020-05-03T14:22:03.664784+00:00 app[web.1]: LINE 1: SELECT `email` FROM `subscribe` WHERE `email` = $1
2020-05-03T14:22:03.664898+00:00 app[web.1]: ^ in /app/subscribe.php:74
2020-05-03T14:22:03.664959+00:00 app[web.1]: Stack trace:
2020-05-03T14:22:03.665054+00:00 app[web.1]: #0 /app/subscribe.php(74): PDOStatement->execute()
2020-05-03T14:22:03.665085+00:00 app[web.1]: #1 {main}
2020-05-03T14:22:03.665185+00:00 app[web.1]: thrown in /app/subscribe.php on line 74
2020-05-03T14:22:03.665730+00:00 app[web.1]: 10.37.232.57 - - [03/May/2020:14:22:03 +0000] "POST /subscribe.php HTTP/1.1" 500 373
Итак, мой вопрос: почему я получаю эту ошибку консоли? Есть ли что-то, что нужно добавить в composer. json файл для heroku?
И что не так с этим битом кода:
$query = $dbconn->prepare("SELECT `email` FROM `subscribe` WHERE `email` = ?" );
$query->bindValue( 1, $email );
$query->execute();
Я использовал это в другом месте и не было никаких проблем