#jquery #mysql #json
#jquery #mysql #json
Вопрос:
Я создаю мобильное приложение jquery, которое позволяет пользователям публиковать и просматривать темы через json. серверная сторона использует инъекции php и mysql для сбора данных json. Серверная сторона видит переданное значение и успешно вводит его в sql. Проблема в том, что он не запускает результат успешного обратного вызова.
Этот журнал ошибок отображается на консоли Chrome: "XMLHttpRequest cannot load http://xxxxxxx/newpost.php. Origin null is not allowed by Access-Control-Allow-Origin."
И если я добавлю dataType: "jsonp"
в параметры, ошибка изменится на "Uncaught ReferenceError: SUCCESS is not defined."
Вот мой html:
<div data-role="content">
<div data-role="content">
<form id="newPostForm">
<div data-role="fieldcontain">
<label for="postTitle"><strong>Post Title:</strong></label>
<input type="text" name="postTitle" id="postTitle" value="" />
<label for="postContent"><strong>Post Content:</strong></label>
<textarea name="postContent" id="postContent"></textarea>
<fieldset class="ui-grid-a">
<div class="ui-block-a"><a href="#indexPage" id="cancel" data-role="button">Cancel</a></div>
<div class="ui-block-b"><button data-theme="b" id="submit" type="submit">Submit</button></div>
</fieldset>
<h3 id="notification"></h3>
</div>
</form>
</div>
</div>
сценарий:
function resetTextFields()
{
$("#postTitle").val("");
$("#postContent").val("");
}
function onSuccess(data, status)
{
resetTextFields();
// Notify the user the new post was saved
$("#notification").fadeIn(2000);
data = $.trim(data);
if(data == "SUCCESS")
{
$("#notification").css("background-color", "#ffff00");
$("#notification").text("The post was saved");
}
else
{
$("#notification").css("background-color", "#ff0000");
$("#notification").text(data);
}
$("#notification").fadeOut(5000);
}
$(document).ready(function() {
$("#submit").click(function(){
var formData = $("#newPostForm").serialize();
$.ajax({
type: "POST",
url: "http://xxxxxxxx/newpost.php",
cache: false,
data: formData,
success: onSuccess
});
return false;
});
$("#cancel").click(function(){
resetTextFields();
});
$("#refresh").click(function(){
location.reload();
});
});
и вот php-код:
header('Content-type: application/json');
try
{
$connection = mysql_connect("localhost","user","pass");
mysql_select_db("dbtable", $connection);
$postTitle = mysql_real_escape_string($_POST[postTitle]);
$postContent = mysql_real_escape_string($_POST[postContent]);
mysql_query("INSERT INTO weblogins (postTitle, postContent) VALUES ('$postTitle', '$postContent')");
mysql_close($connection);
echo "SUCCESS";
}
catch(Exception $e)
{
echo $e->getMessage();
}
При нажатии кнопки на стороне клиента ничего не происходит, никаких уведомлений, но он вводит отправленную форму в sql.
Что я пропустил? Спасибо.
Комментарии:
1. вы тестируете Chrome или его аналогичное поведение в любом другом браузере? попробуйте добавить
www
в свой URL-адрес или попробуйте безhttp
, т.е./xxxxxxx/newpost.php
2. Я сделал это, но результат тот же
Ответ №1:
Вы не можете отправлять / получать с помощью AJAX в домен, который не является текущим ….
Он вызывает ту же политику происхождения -> http://en.wikipedia.org/wiki/Same_origin_policy
и когда вы добавили следующую строку
dataType: "jsonp",
вы добавили запятую в конце … ?
Комментарии:
1. если это нарушение той же политики происхождения, почему внедрение прошло успешно? это дает мне идею, но я действительно в замешательстве.
2. @SaintShann произошла ли инъекция, когда у вас была настройка JSONP? это имело бы смысл — ошибка была при обратном вызове … т.е. он был обработан, но не смог успешно выполнить
3. @SaintShann и я думаю, вам нужно добавить jsonpCallback -> api.jquery.com/jQuery.ajax