【问题标题】:how to debug php during jquery ajax call如何在 jquery ajax 调用期间调试 php
【发布时间】:2018-09-01 19:22:43
【问题描述】:

我有一个提交给 php 服务器的 html 表单。如果我使用提交按钮和 action="screen_custom.php" 以标准方式提交表单,那么它可以正常工作。我看到一个充满有效 JSON 数据的页面。

但如果我使用 jquery ajax 调用提交表单,则会返回一个空的 json 数组。我相信 php 由于某种未知原因无法找到表单值。无论如何,如何在 ajax 调用期间调试 php?响应必须只包含填充 jquery DataTable 所需的数据。如果我回显调试输出,则数据表将无法填充。

下面是一些成功提交表单到php并返回好的json数据的代码。

    <form id="criteriaForm" method="post" action="screen_custom.php"> 
    <table>
    <tr>
        <th>Filter By</th><th>Criteria</th><th title="Show this column">Show</th>
    </tr>
    <tr>
        <td><label title="Percentage increase">Appreciation Potential (%)</label></td>
        <td>
            <select name="upside">
                <option value="any">Any</option>
                <option value="gt0">> 0%</option>
                <option value="gt10">> 10%</option>
            </select>
        </td>
        <td><input type="checkbox" id="showUpside" name="showUpside" value="true">
    </tr>

    </table>
    <input type="submit" value="Run">
    </form>

这是一些无法返回相同 json 数据的代码:

<form id="criteriaForm" method="post" action=""> 
<table>
<tr>
    <th>Filter By</th><th>Criteria</th><th title="Show this column">Show</th>
</tr>
<tr>
    <td><label title="Percentage increase">Appreciation Potential (%)</label></td>
    <td>
        <select name="upside">
            <option value="any">Any</option>
            <option value="gt0">> 0%</option>
            <option value="gt10">> 10%</option>
        </select>
    </td>
    <td><input type="checkbox" id="showUpside" name="showUpside" value="true">
</tr>

</table>
<button type="button" onclick="runCustomScreen()">Run</button>
</form>

还有 javascript:

function runCustomScreen() {
    $('#customTable').DataTable({
        "ajax": {
            type: 'POST',
            url: "screen_custom.php",
            data: $('#criteriaForm').serialize(),
            complete: function(jqXHR, textStatus) {
                console.log("Run was successful, textStatus="+textStatus);
            },
            error: function(e, textStatus, errorThrown) {
                alert("textStatus="+textStatus +", errorThrown="+errorThrown);
            }
        }    
    }); 
    return false;   //needed if called by onclick event
}

这是处理表单数据并返回 json 的 php 部分:

$upside = $_POST["upside"];
$sql = "SELECT * FROM stocks " .$where;
//echo '<script>'
//echo 'sql=' .$sql .'<br>';
//echo 'console.log(' .$sql .')';
//echo '</script>';

$rs = mysql_query($sql);

//store result in an array
$results = array();
while($row = mysql_fetch_object($rs))
{
    $results[] = $row;
}
$data = json_encode($results);
echo '{"data":' .$data .'}';

//close the db connection
mysql_close($connection);

请注意,如果我取消注释除最后一个回显之外的任何内容,则不会填充数据表。那么我该如何调试呢?

【问题讨论】:

  • 可能是分开的,但echo '{"data":' .$data .'}'; 只是...为什么?
  • 您需要在返回时指定数据类型,因为您是在 json 中编码。在成功函数之前添加ajax调用:dataType:“json”,从php端你只需要返回$data,如:echo $data;

标签: javascript php jquery ajax datatables


【解决方案1】:

我想出了如何调试它。在 chrome 调试器中,选择 Network 选项卡,然后从列表中选择“screen_custom.php”,然后选择 Response 选项卡。它显示了 php.ini 的输出。我取消了 echo sql 语句的注释,可以看到实际上表单参数没有被读取,正如我所怀疑的那样。

然后我google了一下这个问题,发现解决方法是修改数据参数js如下图:

        data: function(d) {
            var form_data = $('#criteriaForm').serializeArray();
            $.each(form_data, function(key,val) {
                d[val.name] = val.value;
            });
        },

我不知道为什么第一种方法不起作用,因为我可以看到在标头中发送了正确的参数。但这行得通。

【讨论】:

  • 好提示,我已将这些行添加到 PHP 脚本 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 然后提示检查“网络”选项卡,我终于收到了 PHP 错误消息
【解决方案2】:

您是否尝试在您的 php 脚本中使用 isset($_POST['value']) 方法?其中 value 是您将分配给提交按钮的名称。

【讨论】:

  • 我想出了如何调试它。在 chrome 调试器中,选择 Network 选项卡,然后从列表中选择“screen_custom.php”,然后选择 Response 选项卡。它显示了 php.ini 的输出。我取消了 echo sql 语句的注释,可以看到实际上表单参数没有被读取,正如我所怀疑的那样。但为什么呢?
  • @user3217883 尝试为选择框中的选项值设置名称
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多