每次用户更改MySQL / WordPress数据库中的行时自动运行PHP脚本

时间:2017-08-31 19:11:55

标签: php mysql json ajax wordpress

我正在构建一个小型网络应用,从另一个网站(基于WordPress的网站)的一行数据库中提供一个网站。

基本上我有三个文件:一个名为outputjson.php,它将生成一个名为results.json的JSON文件(存在于我的WordPress网站中),而在另一个网站中,我将为该文件发出一个AJAX请求为了显示广播电台的播音员部分(播放者的照片,社交,时间)。

我的问题是我必须手动启动该过程,但我想自动执行此操作,每次有人更新我的数据库时,我希望我的文件将监听事件并运行PHP脚本。

到目前为止,我的代码是:

outputjson.php

<?php
global $wpdb;
if(!isset($wpdb))
{
    require_once('wp-config.php');
    require_once('wp-includes/wp-db.php');
}
$result = $wpdb->get_results ( "SELECT * FROM " . $table_prefix . "radio_announcer_on_air" );

$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($result, JSON_UNESCAPED_SLASHES));
fclose($fp);
?>

这将生成如下文件:

results.json

    [  
       {  
          "announcer_id":"19",
          "announcer_time_start":"07:00:00",
          "announcer_time_end":"08:59:59",
          "announcer_photo":"image.jpg",
          "announcer_name":"Name",
          "announcer_facebook":"",
          "announcer_twitter":"",
          "announcer_rss":"",
          "announcer_mail":"",
          "announcer_weekday":"7"
       }
]

我的上一个文件将存在于另一台服务器上并且会产生魔力:

announcers.js

$(function(){
    $.ajax({
      url: "http://otherwebsite.com/results.json",
      type: "GET",
      dataType: "JSON",
      cache: false,
      success: function(markers) {
//Do something
}

有什么建议吗?我甚至可以考虑每天运行这个脚本,例如,每次有人要更改我的数据库行(事件)时运行它听起来非常复杂,至少我知道我到目前为止。

1 个答案:

答案 0 :(得分:1)

在浏览器中使用JSON端点的好处在于它不必来自静态文件。

考虑您的results.json示例。如果这是一个静态文件,那么您的Web服务器(通常是Apache)将检测json扩展名并发送相应的HTML 5 standards以向浏览器标识其类型。对于JSON,即:

application/json

因此,只要我们在PHP中执行相同操作,JavaScript中的AJAX调用就不会注意到差异。在outputjson.php中,只需在开头添加:

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

这是必要的,因为Web服务器将看到文件扩展名为php,并且不知道对应的MIME类型(因为PHP脚本可以生成任何类型的文件)。因此,我们必须手动完成。

要将其连接到JavaScript,只需将url参数指向PHP脚本:

url: "http://otherwebsite.com/outputjson.php",

我在评论中提到可以将文件称为something.json.php。为了澄清,这种命名方式只是一种约定,实际上并没有使Web服务器自动设置任何标题 - 您仍然必须在PHP脚本中执行此操作。但是,命名使开发人员和站点用户可以非常轻松地查看(在URL栏或文件浏览器中)文件生成的内容类型。

新脚本

因此,您更新的脚本将是这样的:

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

global $wpdb;
require_once 'wp-config.php';
require_once 'wp-includes/wp-db.php';

$result = $wpdb->get_results(
    "SELECT * FROM {$table_prefix}radio_announcer_on_air"
);

echo json_encode($result);
?>

请注意,它不再需要写入文件 - 它应该只将数据输出到浏览器。我删除了JSON_UNESCAPED_SLASHES,因为我不明白它的目的 - 如果你确定需要它,请把它放回去,但PHP的默认值通常很好。

我也删除了if语句,因为在加载WP库之前无法设置全局数据库变量。

附录

值得考虑的是AJAX消耗此端点的频率,以及它对数据库的负载程度。如果它包含超过几百行,您可能需要考虑分页,因为处理大量数据的AJAX操作会降低浏览器的速度。

然而,首先让它工作是明智的,然后如果证明有必要,你可以从那里进行优化。