У меня возникли проблемы с отправкой Array на PHP-страницу с использованием AJAX. Я использовал этот вопрос в качестве руководства, но по какой-то причине я все еще не могу заставить его работать. Из того, что я могу сказать, используя print_r($_POST)
, я отправляю пустой массив, но на странице HTML / Javascript я использую предупреждение, чтобы увидеть, что массив заполнен. Сообщение работает, потому что оно вводит пустые значения в базу данных MySQL на пост, но я не могу понять, почему он передает пустой массив. Код выглядит следующим образом:
Javascript:
<script type="text/javascript"> var routeID = "testRoute"; var custID = "testCustID"; var stopnumber = "teststopnumber"; var customer = "testCustomer"; var lat = 10; var lng = 20; var timeStamp = "00:00:00"; var dataArray = new Array(7); dataArray[0]= "routeID:" + routeID; dataArray[1]= "custID:" + custID; dataArray[2]= "stopnumber:" + stopnumber; dataArray[3]= "customer:" + customer; dataArray[4]= "latitude:" + lat; dataArray[5]= "longitude:" + lng; dataArray[6]= "timestamp:" + timeStamp; var jsonString = JSON.stringify(dataArray); function postData(){ $.ajax({ type: "POST", url: "AddtoDatabase.php", //includes full webserver url data: {data : jsonString}, cache: false, success: function(){ alert("OK"); } }); window.location = "AddtoDatabase.php"; //includes full webserver url } alert(JSON.stringify(dataArray)) </script>
PHP:
<?php print_r($_POST); $routeID = $_POST['routeID']; $custID = $_POST['custID']; $stopnumber = $_POST['stopnumber']; $customer = $_POST['customer']; $latitude = $_POST['latitude']; $longitude = $_POST['longitude']; $timestamp = $_POST['timestamp']; $mysqli= new mysqli("fdb5.biz.nf","username","password","database"); mysqli_select_db($mysqli,"database"); $sql = "INSERT INTO Locations (routeID, custID, stopnumber, customer, latitude, longitude, timestamp) VALUES " . "('$routeID','$custID','$stopnumber','$customer','$latitude','$longitude','$timestamp')"; mysqli_query($mysqli, $sql); $error = mysqli_error($mysqli); echo $error; ?>
print_r($_POST)
отображает только Array () на странице php, в то время как предупреждение jsonString на странице javascript показывает ["routeID:testRoute", "custID:testCustID", "stopnumber:teststopnumber", "customer:testCustomer", "latitude:10", "longitude:20", "timestamp:00:00:00"]
Кто-нибудь видит, что я делаю неправильно?
Примечание . Основная причина, по которой ваш код выводит array()
– это тот факт, что вы перенаправляете клиента до того, как асинхронный (AJAX) запрос был отправлен / обработан
В основном перемещение window.location = "AddtoDatabase.php";
к обратному результату успеха, как упоминалось ниже.
Первая проблема: вместо использования массива вы должны использовать литерал объекта (~ = array array в php).
Для этого измените этот бит:
var dataArray = new Array(7);//<== NEVER do this again, btw dataArray[0]= "routeID:" + routeID; dataArray[1]= "custID:" + custID; dataArray[2]= "stopnumber:" + stopnumber; dataArray[3]= "customer:" + customer; dataArray[4]= "latitude:" + lat; dataArray[5]= "longitude:" + lng; dataArray[6]= "timestamp:" + timeStamp;
И напишите это, вместо этого:
var dataObject = { routeID: routeID, custID: custID, stopnumber: stopnumber customer: customer, latitude: lat, longitute: lng, timestamp: timeStamp};
Больше ничего. Чтобы закончить, просто отправьте данные так:
function postData() { $.ajax({ type: "POST", url: "AddtoDatabase.php", data: dataObject,//no need to call JSON.stringify etc... jQ does this for you cache: false, success: function(resopnse) {//check response: it's always good to check server output when developing... console.log(response); alert('You will redirect in 10 seconds'); setTimeout(function() {//just added timeout to give you some time to check console window.location = 'AddtoDatabase.php'; },10000); } });
Во-вторых, ваша функция postData
перенаправляет клиента до отправки запроса AJAX! После вызова $.ajax
вас есть window.location = "AddtoDatabase.php";
в вашем коде. Если вы хотите, чтобы клиент был перенаправлен после вызова ajax, вам придется переместить это выражение в функцию обратного вызова success
(тот, где я регистрирую response
) во втором фрагменте ^^.
Когда вы изменили все это, ваша переменная $_POST
должна выглядеть правильно. Если нет, распечатайте объект $_REQUEST
и посмотрите, каким будет ответ на вызов ajax.
Наконец, имейте в виду, что использование api, которое поддерживает подготовленные операторы (и, таким образом, защищает вас от большинства инъекций), это не означает, что строение непроверенных данных POST / GET в запрос является более безопасным, чем это было раньше …
Итог: когда вы используете API, который поддерживает критические функции безопасности, такие как подготовленные операторы, используют эти функции .
Чтобы быть абсолютно ясным и полным, вот немного переработанная версия PHP-кода:
$routeID = $_POST['routeID']; $custID = $_POST['custID']; $stopnumber = $_POST['stopnumber']; $customer = $_POST['customer']; $latitude = $_POST['latitude']; $longitude = $_POST['longitude']; $timestamp = $_POST['timestamp']; //you're connecting OO-style, why do you switch to procedural next? //choose one, don't mix them, that makes for fugly code: $mysqli = mysqli_connect('fdb5.biz.nf', 'username', 'password', 'database');//procedural //or, more in tune with the times: $mysqli= new mysqli("fdb5.biz.nf","username","password","database");//OO mysqli_select_db($mysqli,"database"); //or $mysqli->select_db('database');
Проверьте документы, чтобы увидеть процедурный экземпляр всех методов, которые я буду использовать отсюда, если хотите. Я предпочитаю OOP-API
//making a prepared statement: $query = 'INSERT INTO Locations (routeID, custID, stopnumber, customer, latitude, longitude, timestamp) VALUES (?,?,?,?,?,?,?)'; if (!($stmt = $mysqli->prepare($query))) { echo $query.' failed to prepare'; exit(); } $stmt->bind_param('s', $routeID); $stmt->bind_param('s',$custID); //and so on $stmt->bind_param('d', $latitude);//will probably be a double $stmt->execute();//query DB
Полезные ссылки на подготовленные заявления:
mysqli::prepare
doc страницу mysqli_stmt::bind_result
doc неоценима, когда дело доходит до получения данных … PDO
вы должны использовать сериализацию. тогда……
<script> jQuery(document).ready(function($){ /* attach a submit handler to the form */ $("#submit").click( function(event) { /* stop form from submitting normally */ event.preventDefault(); /*clear result div*/ $("#loginresponse").html(''); /* use serialize take everthing into array */ var frmdata = $("#formname").serialize(); $.ajax({ url: "/file.php", type: "post", dataType: "json", data: frmdata, success: function(data, textStatus){ if(data.redirect == 'true'){ $('#formresponse').html(data.message); return true; }else{ $('#formresponse').html(data.message); return false; } }, error:function(){ $("#formresponse").html('error'); } }); }); }); </script>
чем в php брать данные с сообщением
<?php $routeID = $_POST['routeID']; $custID = $_POST['custID']; $stopnumber = $_POST['stopnumber']; $customer = $_POST['customer']; $latitude = $_POST['latitude']; $longitude = $_POST['longitude']; $timestamp = $_POST['timestamp']; ?>
и отображение с кодировкой json. таким образом вы можете отображать ошибки
<?php if(true) echo json_encode(array('redirect'=>'true', 'message'=>'form submitted')); else echo json_encode(array('redirect'=>'false', 'message'=>'form not submited')); ?>