I need some help with this error:Uncaught SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at Object.success
However, on my webiste on every page I have the some contact form where on every page data need be sent to different email address, so all email addresses I save and get from database. Without jQuery code form is sent successfully, all data inserted into db, and in place of jQuery AJAX response I get valid JSON like:
[{"response":"success","content":"Thanks John Doe! Your message is successfully sent to owner of property Hotel Paris! You will get an answer soon!"}]
or if I try to use JSON_FORCE_OBJECT
in this case I get valid JSON too, with content
{"0":{"response":"success","content":"Thanks John Doe! Your message is successfully sent to owner of property Hotel Paris! You will get an answer soon!"}}
but with jQuery and AJAX instead a displey a user successfull message I get in network response
just empty [] or empty {} with JSON_FORCE_OBJECT. I was spent allready one month, reading complete google how to use json_encode in this case and somewhere for the some case like my case I was find that $jsonData=[];
need be declared before first if statement, so I think too that my PHP code is ok if sent email correctly on every page,insert data into db and in place of jQuery return valid JSON. So bellow it's my form:
<?php
include_once 'inc/form_process.php';
?>
<form spellcheck="false" autocomplete="off" autocorrect="off" id='contact' class='form' name='contact' action='' method='POST'>
<h4 id="response" class="success"><!-- This will hold response from the server --></h4>
<fieldset>
<legend>Your data</legend>
<div class="form-control halb InputIconBg"><input minlength="6" type="text" class="input username" name="fname" placeholder="Your name..." value="<?php echo Input::get('fname'); ?>"><i class="fas fa-user" aria-hidden="true"></i><span class="error"><?=$fname_error; ?></span></div><!-- end .form-control -->
<div class="form-control halb InputIconBg"><input minlength="9" type="text" class="input phone" name="tel" placeholder="Your phone..." value="<?php echo Input::get('tel'); ?>"><i class="fas fa-phone-alt" aria-hidden="true"></i><span class="error"><?=$tel_error; ?></span></div><!-- end .form-control -->
</fieldset>
<input type="submit" class="btn_submit" id="submit" name="submit" value="SEND"/>
</form>
<script src="/JS/validOwner.js"></script>
and this is php code
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// define variables and set to empty values
$fname = $tel = $email_address_id = "";
$fname_error = $tel_error = "";
$error = false;
//Load the config file
$dbHost = "localhost";
$dbUser = "secret";
$dbPassword = "secret";
$dbName = "booking";
$dbCharset = "utf8";
try{
$dsn = "mysql:host=" . $dbHost . ";dbName=" . $dbName . ";charset=" . $dbCharset;
$pdo = new PDO($dsn, $dbUser, $dbPassword);
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}catch(PDOException $e){
echo "Error: " . $e->getMessage();
}
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';
require 'PHPMailer/Exception.php';
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if(isset($_POST['submit'])){
//print_r($_POST);
$fname = $_POST['fname'];
$tel = $_POST['tel'];
if(empty($_POST['fname'])){
$error=true;
$fname_error = "Name can not be empty!";
}else{
$fname = $_POST['fname'];
if(!preg_match("/^[a-zšđčćžA-ZŠĐČĆŽ\s]*$/", $fname)){
$fname_error = "Name can contain just letters and white space!";
}
}
if(empty($_POST['tel'])) {
$tel_error = "Phone can not be empty!";
}else{
$tel = $_POST['tel'];
if(!preg_match('/^[\+]?[0-9]{9,15}$/', $tel)) {
$tel_error = "Phone can contain from 9 to 15 numbers!";
}
}
if($fname_error == '' && $tel_error == ''){
// Instantiate a NEW email
$mail = new PHPMailer(true);
$mail->CharSet = "UTF-8";
$mail->isSMTP();
$mail->Host = 'secret.com';
$mailOwner->SMTPAuth = true;
//$mailOwner->SMTPDebug = 2;
$mailOwner->Username = 'booking@secret.com';
$mailOwner->Password = 'secret';
$mailOwner->Port = 465; // 587
$mailOwner->SMTPSecure = 'ssl'; // tls
$mailOwner->WordWrap = 50;
$mailOwner->isHTML(true);
$mailOwner->setFrom('booking@secret.com');
$mailOwner->clearAddresses();
$mailOwner->Subject = "New message from secret.com";
$query_m = "SELECT owners_email.email_address_id, email_address, owner_name, owner_property, owner_sex, owner_type FROM booking.owners_email INNER JOIN booking.pages ON (pages.email_address_id = owners_email.email_address_id) WHERE `owner_sex`='M' AND `owner_type`='other' AND `pages_id` = ?";
$dbstmt = $pdo->prepare($query_m);
$dbstmt->bindParam(1,$pages_id);
$dbstmt->execute();
//var_dump($dbstmt);
//get emails from db via pdo
$emails = $dbstmt->fetchAll(PDO::FETCH_ASSOC);
$jsonData=[];
if(is_array($emails) && count($emails) > 0){
foreach ($emails as $email){
//var_dump($email['email_address']);
$mail->addAddress($email['email_address']);
$body = "<p>Dear {$email['owner_name']}, <br>" . "You just received a message from <a href='https://www.secret-booking.com'>secret-booking.com</a><br>The details of your message are below:</p><p><strong>From: </strong>" . ucwords($fname) . "<br><strong>Phone: </strong>" . $tel . "</p>";
$mail->Body = $body;
if($mail->send()){
$mail = "INSERT INTO booking.contact_owner (fname, tel, email_address_id) VALUES (:fname, :tel, :email_address_id)";
$stmt = $pdo->prepare($mail);
$stmt->execute(['fname' => $fname, 'tel' => $tel, 'email_address_id' => $email['email_address_id']]);
if($error==false){
$data['response']="success";
$data['content']="Thanks ".ucwords($fname)."! Your message is successfully sent to owner of property {$email['owner_property']}!";
$jsonData[] = $data;
}
}//end if mail send
else{
$data['response'] = "error";
$data['content'] = "Something went wrong! Try again..." . $mail->ErrorInfo;
$jsonData[] = $data;
}
}//end foreach for email addresses
}//end if for array of emails
//echo str_replace("[]", "{}", json_encode($jsonData));
//echo json_encode($jsonData, JSON_FORCE_OBJECT, true);
//exit;
//print_r($jsonData);
echo json_encode($jsonData);
}//end if validation
}//end submit
}//end REQUEST METHOD = POST
And this is my jQuery code
"use strict";
jQuery(document).ready(function () {
jQuery.validator.addMethod('validFname', function (value, element) {
if (/^[a-zšđčćžA-ZŠĐČĆŽ ]+$/gi.test(value)) {
return true;
} else {
return false;
}
});
jQuery.validator.addMethod('validTel', function (value, element) {
if (/^[\+]?[0-9]{9,15}$/gm.test(value)) {
return true;
} else {
return false;
}
});
jQuery("#contact").submit(function (event) {
event.preventDefault();
}).validate({
rules: {
fname: {
required: true,
validFname: true,
minlength: 6
},
tel: {
required: true,
validTel: true,
minlength: 9
}
},
messages: {
fname: {
required: 'Name can not be empty!',
validFname: 'Name can contain just letters!',
minlength: 'Name must have minimum 6 letters'
},
tel: {
required: 'Phone can not be empty!',
validTel: 'Phone can contain max 15 numbers!',
minlength: 'Phone must contain min 9 numbers!'
}
},
submitHandler: function (form) {
var formData = jQuery("#contact").serialize();
console.log(formData);
jQuery.ajax({
url: '/inc/form_process.php',
type: 'post',
data: formData,
dataType: 'json',
cache: false,
success: function (data) {
var decodedArray = JSON.parse(data);
jQuery("#response").text(decodedArray[0]['content']);
console.log(decodedArray[0].content);
// debbuger;
},
error: function (jqXHR, textStatus, errorThrown){
console.log(JSON.stringify(jqXHR));
console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
}
}); //Code for AJAX Ends
// Clear all data after submit
var resetForm = document.getElementById('contact').reset();
return false;
} //submitHandler
});
}); //document ready
Thanks in advance for any kind of your help and any help will be highly appreciated!
source https://stackoverflow.com/questions/67756431/how-to-fix-uncaught-syntaxerror-unexpected-end-of-json-input-at-json-parse-an
Comments
Post a Comment