#php #ajax #forms
#php #ajax #формы
Вопрос:
Я впервые использую ajax с php. У меня есть форма регистрации, в которой я проверяю, существует ли введенное имя пользователя уже в базе данных mongodb. Если это произойдет, я покажу ошибку на своей странице, иначе я хочу перенаправить на свою index.php и начните сеанс .
РЕДАКТИРОВАТЬ: я полностью изменил свой скрипт, теперь я успешно перенаправляю. Предупреждение AngularJS исчезло!
register.php куда я отправляю свои данные для проверки, ОБНОВЛЯЕТСЯ!
$("#registerForm").submit((e)=>{
e.preventDefault();
var uname = $("#username").val();
var fname = $("#firstname").val();
var lname = $("#lastname").val();
var addr = $("#address").val();
var pw = $("#password").val();
var sub = $("#submitRegister").val();
var errorSubmit = $("#checkSubmitError").val();
$.ajax({
type:'POST',
data:{username:uname,firstname:fname,
lastname:lname,address:addr, password:pw ,
submitRegister:sub , checkSubmitError: errorSubmit },
url:'insertUser.php',
success:(data)=>{
if(data == 'success'){
window.location.href = '../php/index.php';
}else if(data =='failed'){
$("#username").val(""); //empty username field
var submitErr = $("#checkSubmitError");
var isHidden =submitErr.hasClass("hide");
if(isHidden){
submitErr.removeClass("hide");
submitErr.addClass("show");
}else{
submitErr.removeClass("hide");
submitErr.addClass("show");
}
}
},
error: (xhr)=>{
alert("error");
},
});
});
<body>
<form action = "insertUser.php" method= "POST" id ="registerForm" name= "regForm">
...my inputs with ids
<!-- button that submits form -->
<button type="submit" class="btn btn-success" id = "submitRegister" name="submit"
>Submit
</button>
<!--hidden error I display if username exists -->
<span id ="checkSubmitError" class= "hide text-danger"> </span>
</form>
</body>
Затем в моем insertUser.php где я проверяю, существует ли имя пользователя в моей обновленной базе данных!
<?php
require '../vendor/autoload.php';
if(isset($_POST['submitRegister'])){
$m = new MongoDBClient("mongodb://127.0.0.1/");
$db = $m ->ECommerce;
$collection = $db->users;
//check if username already exists
$alreadyExists = false;
$check = $collection->find(array('userName'=>$_POST['username']));
$count=0;
if(is_array($check) || is_object($check)){
foreach($check as $i){
$count= $count 1;
}
}
if($count==0){
$document = array(
"firstName" => $_POST['firstname'],
"lastName" => $_POST['lastname'],
"address" => $_POST['address'],
"userName" => $_POST['username'],
"password" => password_hash($_POST['password'] ,PASSWORD_DEFAULT)
);
$collection->insertOne($document); //inserts succesfully
$response = "success";
echo $response;
exit();
}else{
$alreadyExists = true;
$response = "failed";
echo $response;
exit();
}
}
?>
Комментарии:
1. После a
header('Location:...
у вас всегда должен бытьexit;
asheader()
, который отправляет заголовок в браузер, он не завершает выполнение скрипта. Не уверен, что именно это вызывает вашу проблему в этом случае, но она все равно должна быть там2. @RiggsFolly не сработал, все еще пытался загрузить AngluarJS более одного раза, и я остаюсь на странице регистрации
3. Насколько я знаю,
.load()
— выполняет запрос GET, а не POST-запрос. Это должен быть запрос POST, поэтому вы можете переосмыслить метод и$.ajax()
$.post()
вместо этого использовать or .4. @vasilis есть ли еще вопрос после вашего редактирования? Если нет, пожалуйста, отправьте ответ на решение и примите его как хорошее решение, пожалуйста.
5. @PedroFerreira Я могу через 2 дня
Ответ №1:
Код, который я отредактировал в моем примере, теперь работает отлично. Все кончено . Что я узнал :
$ajax
лучше, чем $load
метод перенаправления. Чтобы вернуть данные success()
, которые будут работать с вами echo $data
в php-скрипте exit()
.
Это были ключевые точки здесь .