【问题标题】:Ajax does not pass POSTAjax 不通过 POST
【发布时间】:2020-04-21 10:01:24
【问题描述】:

我有一个表单,我需要将数据发布到一个 compute.php 文件。 我必须传递名为 select_1 和 select_2 的两个选择字段的内容。 我的点火按钮有一个 onclick='go()' 调用。

我的脚本代码如下:

function go() {
var sel_1 = document.getElementById('select_1').value;
var sel_2 = document.getElementById('select_2').value;
$.ajax({
    type: "POST",
    url: "compute.php",
    data: "select_1=" + sel_1 + "&select_2=" + sel_2,
    dataType: "text",
    success: function(data,status)
      /* ------------ for debug I have an alert with a response ---- */
      {
        alert("passed data are: " + data + "\nStatus: " + status);
      },
    error: function(data,status)
      {
        alert("passed data are: " + data + "\nStatus: " + status);
      }
    });
}

在 php 端,我的 compute.php 文件的代码如下:

$selection_1 = $_POST["select_1"];
$selection_2 = $_POST["select_2"];

$sqladd = "INSERT INTO table SET column_1 = '$selection_1', column_2 = '$selection_2';";
if (mysqli_query($conn, $sqladd)) {
   $resultadd= mysqli_query($conn, $sqladd);
   // ------- then for debug purpose
   echo "inserted row with col_1 --->" . $selection_1 . "<--- and col_2 --->" . $selection_2;
} else {
   // ------- either, still for debug purpose
   echo "not inserted. ";
   echo "Error: " . mysqli_error($conn);
}

现在警告框显示 js 已经正确获取了两个选择字段的值,我也返回了成功状态,但是 compute.php 的调试回显显示 selection_1 和 selection_2 的值为空,并且表格行已插入,但在插入的行中表格列为空。 Apache 日志显示两个通知:PHP 通知:未定义索引:compute.php 中的 select_1PHP 通知:未定义索引:compute.php 中的 select_2。所以 PHP 不接收这两个 POST 值。我究竟做错了什么?我在 .htaccess 中有以下规则和条件:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]
RewriteCond %{REQUEST_FILENAME}.php [NC]
RewriteRule ^ %{REQUEST_URI}.php [L]

他们可以阻止 POST 吗?如果是,如何在不阻止 POST 的情况下获得相同的结果?我需要在外部将 /dir/foo.php 重定向到 /dir/foo 并在内部将 /dir/foo 重定向到 /dir/foo.php。

【问题讨论】:

  • 我建议不要将参数嵌入到 SQL 中,而是使用准备好的语句使用 ?并让mysql为你插入参数,见w3schools.com/php/php_mysql_prepared_statements.asp
  • 这是稍后要做的精炼事情之一,但问题仍然是php没有从ajax接收那些post数据。
  • 您是否尝试过使用 post 方法在页面中创建 HTML 表单元素并尝试以这种方式提交?
  • 现在根据您的要求在 HTML 中试用。嗯......,同样的结果,数据没有通过。但也用js检查,表单有效,源页面中的变量已填充。糟糕的谜题:(
  • 在你的 PHP 中添加一些 echo,这样你就可以验证它是否到达了服务器?

标签: javascript php ajax post


【解决方案1】:

尝试将你的 go 函数修改成这样:

function go() {
var sel_1 = document.getElementById('select_1').value;
var sel_2 = document.getElementById('select_2').value;
$.ajax({
    method: "post",
    url: "compute.php", 
    data: {"select_1":sel_1 , "select_2":sel_2},
    success: function(data,status)
      /* ------------ for debug I have an alert with a response ---- */
      {
        alert("passed data are: " + data + "\nStatus: " + status);
      },
    error: function(data,status)
      {
        alert("passed data are: " + data + "\nStatus: " + status);
      }
    });
}

【讨论】:

  • 你检查过你是否收到了 POST 吗?
  • 现在用代码检查: if (isset($_POST['select_1'])) { echo "received select_1."; } else { echo "没有收到 select_1 "; } 并没有 :(
  • 你是否在使用重定向方法?
  • 您是否尝试过实际提交 html 表单?
  • 刚才是的,同样的否定结果。我可以在哪里调查?
【解决方案2】:
function go() {
var sel_1 = $('#select_1').val();
var sel_2 = $('#select_2').val();
$.post("compute.php", {
    select_1 : sel_1,
    select_2 : sel_2
    }, function (answ) {
    console.log(answ);
  });
}

【讨论】:

  • 刚刚尝试了您的建议。结果相同,没有 POST 值到达 compute.php :(
  • 可能与数据类型有关?还是什么?
  • 请在您的答案中添加一些解释,以便其他人可以从中学习
【解决方案3】:

在 go 函数的 ajax 中修改你的数据对象 数据:{“select_1”:sel_1,“select_2”:sel_2}

【讨论】:

    【解决方案4】:

    你的选择框必须这样锁定

    <select id="select_1">
    <option></option></select>
    </select>
    

    我认为您选择的框命名为 select_1 和 select_2,但您必须设置 id 而不是名称。

    p.s 如果您使用 id,请粘贴您的 html 代码。

    【讨论】:

    • echo "&lt;select id='select_1' name='select_1' color='white'&gt;"; 为了跨版本兼容性,我总是设置 id 和 name。
    • 我检查了你的代码,似乎没问题。你能尝试提交一个简单的表单(只有html和php)并转储结果吗?
    • 现在根据您的要求在 HTML 中试用。同样的结果,数据没有通过。但也用js检查,表单是有效的,源页面中的变量被填充。
    • 正如已经检查过的,来自 phi.ini: ;enable_post_data_reading = Off ,正如你所看到的,这一行被注释掉了,所以很明显 $_POST 是可能的。还有post_max_size = 8M
    • 还尝试在 compute.php 顶部添加:if(empty($_SERVER['CONTENT_TYPE'])) { $_SERVER['CONTENT_TYPE'] = "application/x-www-form-urlencoded";。但什么都没有改变
    【解决方案5】:

    POST 被上面的 .htaccess 指令阻止。已更改,现在 POST 正在从 html 工作,但在使 js/ajax/jquery 工作以将我的数据发布到 compute.php 时仍然存在问题

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 2016-06-03
      • 2019-10-28
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2012-09-04
      • 2014-09-19
      相关资源
      最近更新 更多