Проводка массива на PHP с использованием ajax

У меня возникли проблемы с отправкой 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 неоценима, когда дело доходит до получения данных …
  • быстрый учебник 1
  • Учебник Q & A в стиле 2
  • На всякий случай: учебник 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')); ?>