繁体   English   中英

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

[英]Change PHP variable using javascript or AJAX on the same page

我知道这个问题已经问过很多次了,但是我认为我正在处理不同的事情,或者更好的说法是,我需要不同的东西。

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

因此,我想到的是使用下拉列表选择时间,然后基于该选择,在服务下拉菜单上仅显示基于时间的相应时间。 该站点看起来像这样: 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>

我只在平台上使用单个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进行响应,正如我在上面的代码中通常所说明的那样。 因为我只编写自己的代码,而不与其他人的代码一起使用,所以这比尝试针对您正在使用的任何软件定位的响应更多。 无论您是否启用错误报告并在使用哪种浏览器的情况下注意开发人员工具,都将达到目标。 祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM