在同一页面上使用 javascript 或 AJAX 更改 PHP 变量

Change PHP variable using javascript or AJAX on the same page

提问人:Jan 提问时间:6/12/2018 最后编辑:JohnJan 更新时间:6/16/2018 访问量:34

问:

我知道这个问题已经被问过很多次了,但我认为就我而言,我正在处理一些不同的东西,或者更好地说,我需要一些不同的东西。

我正在使用一个开源的约会预订,但不幸的是,客户可以选择服务而不是它的持续时间。我可以通过手动添加具有不同分钟长度的更多次来重新创建相同的服务,但这样,在下拉菜单中会出现很多选项,这不是我正在寻找的解决方法。

所以,我想到的是,使用下拉菜单来选择时间,并根据该选择,在服务下拉菜单上,将仅显示基于时间的相应服务。 网站如下所示:site

我正在寻找的是,每当我选择小时数时......我只得到那个小时的服务,而不是全部。 我可以使用一个按钮来刷新页面,但我无法创建另一个文件,然后重定向到这里。

这是代码中感兴趣的部分:

<select id="select-service" class="col-xs-12 col-sm-4 form-control">

<?php
    // Group services by category, only if there is at least one service with a parent category.
    $has_category = FALSE;
    foreach($available_services as $service) {
        if ($service['category_id'] != NULL) {
            $has_category = TRUE;
            break;
        }
    }

    if ($has_category) {
        $grouped_services = array();

        foreach($available_services as $service) {
            if ($service['category_name'] == '2 HOURS' || $service['category_name'] == '1 HOUR' || $service['category_name'] == '3 HOURS') {
                if (!isset($grouped_services[$service['category_name']])) {
                    $grouped_services[$service['category_name']] = array();
                }

                $grouped_services[$service['category_name']][] = $service;
            }

        }

        // We need the uncategorized services at the end of the list so
        // we will use another iteration only for the uncategorized services.
        $grouped_services['uncategorized'] = array();
        foreach($available_services as $service) {
            if ($service['category_id'] == NULL) {
                $grouped_services['uncategorized'][] = $service;
            }
        }

        foreach($grouped_services as $key => $group) {
            $group_label = ($key != 'uncategorized')
                    ? $group[0]['category_name'] : 'Uncategorized';

            if (count($group) > 0) {
                echo '<optgroup label="' . $group_label . '">';
                foreach($group as $service) {
                    echo '<option value="' . $service['id'] . '">'
                        . $service['name'] . '</option>';
                }
                echo '</optgroup>';
            }
        }
    }  else {
        foreach($available_services as $service) {
            echo '<option value="' . $service['id'] . '">' . $service['name'] . '</option>';
        }
    }
?>
                            </select>
JavaScript PHP HTML AJAX XHTML

评论


答:

0赞 John 6/16/2018 #1

我只为我的平台使用一个 AJAX 函数。下面是一个最小的例子:

function ajax(method,url,param_id_container_pos,id_container)
{
 var xhr = new XMLHttpRequest();
 xhr.open(method,url,true);

 xhr.onreadystatechange = function()
 {
  if (xhr.readyState=='4')
  {
   var type = xhr.getResponseHeader('content-type').split('/')[1];
   if (method=='post')
   {
    if (type=='json')
    {
     var j = JSON.parse(xhr.responseText);
     console.log(j);//Check your browser's developer network panel.
     eval(j.javascript);//eval is frowned upon though just use to call a sequel JS function.
    }
   }
  }
 }
}

//Example uses:
ajax('get','admin/?ajax=account','inside','id_target');

var fd = new FormData();
fd.append('ajax','admin_post_account_approval');
fd.append('parameter1',object1);
fd.append('parameter2',object2);
ajax('post',path+'admin/',fd);

您的目标是尽可能使代码最小化且高度可重用。

关于服务器和PHP,你需要记住:永远不要相信用户。这意味着您需要验证所有内容:

<?php
if (isset($_POST['ajax']) && $_POST['ajax']=='admin_post_account_approval')
{
 if (!isset($_POST['parameter1'])) {/*error_handling*/}
 else if (!isset($_POST['parameter1'])) {/*error_handling*/}
 else if (![condition not met]) {}
 else
 {
  if ([all conditions met])
  {
   header('Content-Type: application/json');
   $array = array('javascript'=>'alert(\'Just a JavaScript alert triggered by PHP.\');');
   die(json_encode($array));
  }
 }
}
?>

服务器端代码,PHP应该像现实生活一样考虑:总是首先失败,并测试长度,表单参数中的正确字符或不正确字符等条件。

此外,我强烈建议服务器使用 JSON 进行响应,正如我在上面的代码中通常说明的那样。因为我只编写自己的代码,而不使用其他人的代码,所以这更像是一种通用的响应,而不是试图针对您正在使用的任何软件。无论您是否启用错误报告并注意开发人员工具,无论您使用哪种浏览器,您都可以到达那里。祝你好运。