使用ajax将数组发布到PHP
我在使用AJAX将数组发布到PHP页面时遇到问题.我一直在使用
this question作为指导,但无论出于何种原因,我仍然无法让它工作.通过使用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)仅显示php页面上的Array(),而javascript页面上的jsonString警告显示 有谁看到我做错了什么?
注意:您的代码输出array()的主要原因是您在发送/处理异步(AJAX)请求之前重定向客户端
基本上移动window.location =“AddtoDatabase.php”;成功回调,如下所述. 第一个问题:您应该使用对象文字(在php中为?= assoc数组),而不是使用数组. 为此,请更改此位: 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",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调用之后重定向客户端,则必须将该表达式移动到第二个代码段^^中的成功回调函数(我记录响应的函数). 当你改变了所有这些后,你的$_POST变量看起来应该是正确的.如果没有,打印出$_REQUEST对象,然后查看ajax调用的响应. 最后,请注意使用支持预处理语句的api(从而保护您免受大多数注入攻击),这并不意味着将未经检查的POST / GET数据串入查询比以前更安全…… 只是为了绝对清楚,完整,这里也是一个稍微改进的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","database");//OO mysqli_select_db($mysqli,"database"); //or $mysqli->select_db('database'); 如果你愿意的话,检查文档以查看我将在这里使用的所有方法的程序对应物.我更喜欢OOP-API //making a prepared statement: $query = 'INSERT INTO Locations (routeID,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 准备好的陈述上有用的链接 > (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |