我在使用AJAX将数组发布到PHP页面时遇到问题。 我一直在用这个问题作为指导,但无论出于何种原因,我仍然无法让它发挥作用。 通过使用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警报显示["routeID:testRoute", "custID:testCustID", "stopnumber:teststopnumber", "customer:testCustomer", "latitude:10", "longitude:20", "timestamp:00:00:00"]

有谁看到我做错了什么?

===============>>#1 票数:20 已采纳

注:您的代码输出的主要原因 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",
             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

准备好的陈述上有用的链接

===============>>#2 票数:0

你应该使用序列化。 然后......

<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中使用post获取数据

<?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'));
?>

  ask by EzAnalyst translate from so

未解决问题?本站智能推荐:

5回复

将数组发布到php文档中

我希望能够发布包含...的数组 到另一个页面,但似乎无法正常工作。 我究竟做错了什么?
2回复

在数组内创建带有数组的帖子URL

我有一个API: 我在使用以下sql发送“ 1”的list_id时遇到问题。 电子邮件正在运行。 我如何处理数组中的数组
1回复

如何创建多个动态图像滑块? [仅使用PHP,MySQL和香草JS! ]

我是PHP和JS编程的新手,我的网站项目需要帮助。 在另一个问题中,我遇到了图像发布系统的问题,此问题已解决: SOS! 如何在帖子中显示相册? [仅使用PHP和MYSQL] 。 现在,我想使用动态图像滑块修改此发布系统。 (下一级^^) 最后,必须可以向下滚动通过帖子,并
1回复

从Javascript向MVC发布多个对象数组

我已经找到了许多将1个对象数组发布到MVC的答案,但是我正努力解决多个问题。 这可能是我所缺少的小东西。 这是我的JS: 这些是包含具有x和y坐标的对象的数组。 像这样: 我的MVC控制器如下所示: 我错过了一些东西,因为MVC认为List<Coordin
1回复

复选框未在PHP中发布

因此,我试图从3个复选框中获取值,该值稍后将发送到数据库,但是由于某些原因,它们在即时测试中没有发布在PHP中。 我在另一页上发布: 但我越来越 我有表单标签,所有内容都是正确的,这就是一个不同的问题,页面上的其他所有内容均正确发布,但这一点除外
1回复

如何使用html / php创建一个简单的日记发布站点

我正在尝试建立一个简单的日记网站,在其中将文本输入文本区域,然后按“提交”,它将显示在当前屏幕上。 然后,我希望能够在文本区域中输入更多文本,当我按下“提交”时,它只会在新行上显示给我。 当我提交3个字符串test,test1和test2时,我得到以下信息。 我想要这个输出
3回复

将JS(JQuery)生成的元素发布到PHP脚本

因此,我正在为团队编写此表单,并执行此“添加玩家”功能,即您在文本字段中输入玩家名称,选中一个框后,就可以了,然后单击按钮,然后将该名称附加到上方的div上,添加值到数组并清除下面的文本字段,如下所示: 将最终数组发布到php脚本的最佳方法是什么? 多谢你们!
3回复

为什么AJAX发布Wordpress不起作用?

我正在尝试通过ajax在前端发布帖子,但是我总是失败。 我做错了什么? 这是我的代码,它返回我0: HTML PHP my_js.js
1回复

Laravel-必须是数组类型,没有给出

我的laravel 5.2版本有一个奇怪的问题,我正在尝试将数据从表单发送到我的数据库,由于某种原因,提交时始终引发错误,该错误指出“参数1传递给App \\ Http \\ Controllers \\ PostsController :: postStatus()必须为数组类型,未给出任何值
2回复

表单未使用php echo提交

我有以下代码: 的index.php 这将创建一个表单,一个文本字段和一个提交按钮。 所有这些都表现得很好,除非它不会提交表格。 所以我的问题是,为什么我的表单在这里不起作用?我应该怎么做才能解决此问题而不将其从php中移出。