I'm working in a new plugin and I want the users use a form to send his/her email. This email would be saved in a custom table in the database.
This is the html form:
<form class="form-inline singup subscribe-database" action="#" method="post" data-url="<?php echo verde_product_info('extend_url') ?>">
<input type="hidden" name="language" value="<?php echo verde_top('language'); ?>">
<input type="hidden" name="database" value="<?php echo $wpdb->prefix; ?>">
<input type="email" name="email" placeholder="Email" required>
<button type="submit" class="btn">Send</button>
</form>
When it is sending, the js code is the next:
var urlplugin = jQuery('.subscribe-database').attr('data-url');
jQuery('.subscribe form').submit(function() {
var postdata = jQuery('.subscribe form').serialize();
jQuery.ajax({
type: 'POST',
url: urlplugin + '/themes/php/sendmail.php',
data: postdata,
dataType: 'json',
success: function(json) {
console.log(json);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
}
});
return false;
});
And the file sendmail.php when the error happens is the next one:
global $wpdb;
if(!isset($wpdb))
{
require_once('../../../../../wp-includes/wp-db.php');
}
switch ($_POST['language']) {
case 'english':
$success1 = 'Thanks for your subscription!';
$error1 = 'Insert a valid email address';
break;
case 'spanish':
$success1 = '¡Gracias por tu suscripción!';
$error1 = 'Escribe un email válido';
break;
case 'french':
$success1 = 'Merci pour votre abonnement!';
$error1 = 'Insérez une adresse e-mail valide';
break;
case 'german':
$success1 = 'Vielen Dank für Ihr Abonnement!';
$error1 = 'Legen Sie eine gültige E-Mail-Adresse';
break;
case 'italian':
$success1 = 'Grazie per il vostro abbonamento!';
$error1 = 'Inserire un indirizzo email valido';
break;
case 'portuguese':
$success1 = 'Obrigado pela sua inscrição!';
$error1 = 'Insira um email válido';
break;
}
function isEmail($email) {
return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i", $email));
}
if($_POST['email']) {
$table = $_POST['database'] . 'verde_emails';
$subscriber_email = ($_POST['email']);
if(!isEmail($subscriber_email)) {
$array = array();
$array['valid'] = 0;
$array['message'] = $error1;
echo json_encode($array);
}
else {
$array = array();
$array['valid'] = 1;
$array['message'] = $success1;
echo json_encode($array);
$wpdb->insert(
$table,
array(
'option_email' => $subscriber_email,
)
)
}
}
When I use the form I get the next error in the browser console:
200
scripts-new.js:43 SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at parseJSON (jquery-1.9.1.min.js:2:4322)
at Fn (jquery-1.9.1.min.js:4:15175)
at k (jquery-1.9.1.min.js:4:13895)
at XMLHttpRequest.r (jquery-1.9.1.min.js:4:18226)
But it works fine if I comment the next code in the file sendmail.php:
$wpdb->insert(
$table,
array(
'option_email' => $subscriber_email,
)
)
but obviously, the email can't be saved in the database.
I'm lost with this error and I will be very grateful if someone can help me.
Sorry for my English and thank you very much.