如何从ajax调用的php文件中回显sql select语句?

plupiseo  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(296)

每个文件中都有很多代码,太多了,无法发布,所以我给您一个关于每个文件中发生了什么的总体概念。
index.php[html下拉菜单代码等]
scripts.js[ajax从dropdown中检测用户选择,抓取fetch.php,该数据库将生成html代码,用于二次下拉选择并放入index.php]
fetch.php[根据用户选择和数据库查询生成二级下拉代码]
我需要查看要调试的具体查询内容,因此我要回显sql select语句:

$query = "SELECT * FROM databasename WHERE.."

那是在 fetch.php 当用户从 index.php -我该怎么做?

t1qtbnec

t1qtbnec1#

回显内容并执行die()或exit;之后。。。然后在浏览器的network选项卡中,开始录制,运行ajax请求(它将失败),但检查资源/名称,然后查看响应,它将显示脚本中的内容
摘自:chrome中的请求监控
chrome目前有一个内置的解决方案。
使用ctrl+shift+i(或导航到当前页控件>开发人员>开发人员工具)。
在较新版本的chrome中,单击扳手图标>工具>开发人员工具。)以启用开发人员工具。
在“开发人员工具”中,单击“网络”按钮。如果尚未启用,请为会话启用它或始终启用它。
单击“xhr”子按钮。
启动ajax调用。
您将看到项目开始显示在左侧列的“资源”下。
单击资源,有两个选项卡显示标题和返回内容。
其他浏览器也有一个network选项卡,但是您需要使用我的注解来获取查询的字符串值。
上面的解决方案是令人愉快的。

xu3bshqb

xu3bshqb2#

当我处理ajax时,返回json,我使用的一个技巧是利用输出缓冲。你不能只回显或输出你想要的任何东西,因为它会弄乱json数据,例如,

ob_start(); //turn on buffering at beginning of script.

.... other code ...

print_r($somevar);

.... other code ...

$debug = ob_get_clean();  //put output in a var
$data['debug'] = $debug;

header('Content-Type: application/json');
echo json_encode($data); //echo JSON data.

这样做的目的是将脚本的任何输出打包到json数据中,这样就不会弄乱格式。
然后在javascript端可以使用console.log

$.post(url, input, function(data){
   if(data.debug) console.log(data.debug);
});

如果您不习惯调试 console.log() ,你通常可以 F12 并在大多数浏览器中打开调试器。然后在那里输出将被发送到“控制台”。ie9有点问题 console.log() 如果我记得,但我不想走得太远。
注意:当你把它移到生产环境中时,一定不要把这些东西留在代码中,注解掉这一行非常简单,

//$data['debug'] = $debug;

这样您的调试信息就不会在生产中公开。有其他方法可以自动执行此操作,但这取决于是否执行本地开发,然后发布到服务器。例如,您可以打开 $_SERVER['SERVER_ADDR']; 那将会是 ::1 或者 127.0.0.1 当它是本地的时候。这有一些缺点,主要是命令行界面(cli)无法提供服务器地址。所以通常我会把它绑定到一个全局常量中,这个常量表示站点处于什么“模式”(包含在公共入口点中,通常是index.php)。

if(!defined('ENV_DEVELOPMENT')) define('ENV_DEVELOPMENT','DEVELOPMENT');

if(!defined('ENV_PRODUCTION')) define('ENV_PRODUCTION','PRODUCTION');

if(!defined('ENVIRONMENT')) define('ENVIRONMENT',ENV_DEVELOPMENT);
//site is in Development mode, uncomment for production
//if(!defined('ENVIRONMENT')) define('ENVIRONMENT',ENV_DEVELOPMENT);

那么检查一下就简单了:

if(ENVIRONMENT == ENV_PRODUCTION ) $data['debug'] = $debug;

如果您知道如何使用错误报告,您甚至可以使用

if(ini_get('display_errors') == 1) $data['debug'] = $debug;

仅当“显示错误”处于启用状态时才显示调试。
希望有帮助。
更新
因为我在评论中提到了它,下面是一个 Package 在类中的示例(这是一个简化版本,所以我没有测试这个)

class LibAjax{
    public static function respond($callback, $options=0, $depth=32){
        $result = ['userdata' => [
              'debug' => false,
              'error' => false
        ]];

        ob_start();

         try{

             if(!is_callable($callback)){
                //I have better exception in mine, this is just more portable
                throw new Exception('Callback is not callable');
             }

             $callback($result);
         }catch(\Exception $e){
              //example 'Exception[code:401]'
             $result['userdata']['error'] = get_class($e).'[code:'.$e->getCode().']';
            //if(ENVIRONMENT == ENV_DEVELOPMENT){
            //prevents leaking data in production
                $result['userdata']['error'] .= ' '.$e->getMessage();
                $result['userdata']['error'] .= PHP_EOL.$e->getTraceAsString();
            //}
         }

         $debug = '';
         for($i=0; $i < ob_get_level(); $i++){
             //clear any nested output buffers
             $debug .= ob_get_clean();
         }
         //if(ENVIRONMENT == ENV_DEVELPMENT){
             //prevents leaking data in production
              $result['userdata']['debug'] = $debug;
        //}
         header('Content-Type: application/json');
         echo self::jsonEncode($result, $options, $depth);
   }

   public static function jsonEncode($result, $options=0, $depth=32){
       $json = json_encode($result, $options, $depth);
       if(JSON_ERROR_NONE !== json_last_error()){
           //debug is not passed in this case, because you cannot be sure that, that was not what caused the error.  Such as non-valid UTF-8 in the debug string, depth limit, etc...
           $json = json_encode(['userdata' => [
              'debug' => false,
              'error' => json_last_error_msg()
           ]],$options);
       }
       return $json;
   }

}

然后,当您做出ajax响应时,您只需这样 Package 它(注意,$result是通过引用传递的,这样我们就不必返回,在出现异常的情况下,我们会“实时”更新$result,而不是在完成时更新)

LibAjax::respond( function(&$result){
     $result['data'] = 'foo';
});

如果需要将其他数据传递到闭包中,请不要忘记可以使用 use 声明,像这样。

$otherdata = 'bar';

LibAjax::respond( function(&$result) use($otherdata){
     $result['data'][] = 'foo';
     $result['data'][] = $otherdata;
});

沙箱
如果环境是正确的(注解掉),这将处理捕获任何输出并将其放入调试。请务必实施某种保护措施,以便在生产过程中不将输出发送给客户,这一点我再强调也不为过。它还捕获任何异常并将其放入错误中。它还处理头和编码。
这样做的一大好处是json的结构一致,您将知道(在客户端)如果 if(data.userdata.error) 那么后端就有一个例外。它给你一个地方来调整你的头,json编码等。。。
在php7中需要注意的一点是,您必须或者应该添加throwable接口(而不是exception)。如果要捕获错误和异常类,或者执行两个catch块。
假设我做了很多ajax并且厌倦了一直重写这个,我的实际类比这个更广泛,但这就是它的要点。
干杯。
更新1
我要做的一件事是在console.log()之前解析数据变量
这通常是因为您没有将正确的标头传递回浏览器。如果发送(就在调用json\u encode之前)

header('Content-Type: application/json');

这只是让浏览器知道它正在返回什么类型的数据。大多数人忘记的一件事是,在网络上,所有的回复都是以文本形式完成的。甚至图像或文件下载和网页。都是文字,让文字变得特别的是 Content-Type 浏览器认为是这样的。
有一件事需要注意 header 在发送头之前不能输出任何内容。不过,这与我发布的代码配合得很好,因为该代码将捕获所有输出并在发送头之后发送。
我更新了原来的代码,使之有了标题,我把它放在了后来发布的更复杂的类中。但是,如果您将其添加进来,就不需要手动解析json了。
我应该提到的最后一件事是检查我是否得到了json或文本,如果在输出缓冲区启动之前发生了错误,您仍然可以得到文本。
有两种方法可以做到这一点。
如果数据是需要解析的字符串

$.post(url, {}, function(data){
    if( typeof data == 'string'){
        try{
            data = $.parseJSON(data);
        }catch(err){
            data = {userdata : {error : data}};
        }
    }
    if(data.userdata){
          if( data.userdata.error){
               //...etc.
          }
    }
    //....
}

或者如果你有头文件,而且总是json,那么就简单一点

$.post(url, {}, function(data){
    if( typeof data == 'string'){
        data = {userdata : {error : data}};
    }
    if(data.userdata){
          if( data.userdata.error){
               //...etc.
          }
    }
    //....
}

希望有帮助!
更新2
因为这个主题经常出现,我把上面代码的一个修改版本放在我的github上,你可以在这里找到它。
https://github.com/artisticphoenix/misc/blob/master/ajaxwrapper/ajaxwrapper.php

相关问题