Не может отправить данные в файл php с помощью ajax

У меня есть этот файл php graph.php

$host = $_POST['hostname'];
echo $type=$_POST['type_char'];
include('rrdtools.inc.php');
include('graphs/'.$type.'.inc.php');

и я пытаюсь отправить данные в этот файл, используя этот код ajax

var type_char='fortigate_cpu';//$('#graph').val();
var hostname='10.10.0.144';//$(this).attr('id');
//$('#device_host').val(id);

$.ajax({
    type: 'POST',
    url: 'SNMP/graph.php',
    data: { hostname:hostname,type_char:type_char },
    success: function(data) {
        alert(data);
        // show the response
        $("#grph").attr("src", 'SNMP/graph.php');
        console.log(data);
    }
});

результат, когда я отправляю данные в этот файл,

fortigate_cpu как значение переменной type_char когда я открыл файл error.log в журналах apache У меня есть это сообщение

include(): Failed opening 'graphs/.inc.php' for inclusion (include_path='.:/usr/share/php')

поскольку вы видите, что значение fortigate не включено в функцию включения, даже если переменная char_type отправляется ajax и печатается на странице включаемый файл должен быть таким

include( 'graphs/fortigate_cpu.inc.php')  

почему тип не включен в сеанс включения, даже если переменная получена от ajax

1. как уволить этот ajax? 2. Направлен ли он на правильный URL-адрес SNMP/graph.php? 3. Вы проверили консоль браузера, что нет такой ошибки, как URL NOT FOUND? 4. попытаться сначала распечатать данные POST на странице php, чтобы увидеть приходящие данные или нет?

Anant Kumar Singh 10.09.2018 10:01

URL-адрес правильный, и, как вы видите, я могу распечатать результат переменной ajax $ type, но когда я пытаюсь включить файл ('graphs /'.$ type.'inc.php'), результат в файле журнала не может найти файл (graphs / inc.php) даже если результат типа echo $; это 'fortigate _cpu', т.е. значение может быть получено php из ajaax

Muhammad 10.09.2018 10:06

так что, возможно, в include ('rrdtools.inc.php'); переменная установлена ​​в ноль?

FatFreddy 10.09.2018 10:07

@Muhammad попробуй вот так: - if(!empty($_POST['hostname']) && !empty($_POST['type_char'])){ $host = $_POST['hostname']; $type = $_POST['type_char']; include('rrdtools.inc.php'); include("graphs/$type.inc.php"); }

Anant Kumar Singh 10.09.2018 10:13

делать что-то подобное - плохая идея с точки зрения безопасности. Вы потенциально позволяете злоумышленнику выполнить произвольный код. Безусловно, вы можете использовать входные переменные, чтобы решить, какой код будет выполняться, но я бы не позволил ему напрямую указывать имя используемого файла. Это напрашивается на проблемы ИМО

ADyson 10.09.2018 10:13

Что касается проблемы, ваш код выглядит так, как будто он должен работать. Поэтому я бы сказал, что либо а) обратная передача на самом деле не вызвана ajax (например, может быть, отправка формы в один и тот же сценарий происходит в одно и то же время - мы не знаем, как вы запускаете свой ajax), или б) $ Переменная типа конфликтует с другой глобальной переменной с тем же именем в rrdtools.inc.php и снова устанавливается в пустое значение в этом сценарии. Опять мы этого не видим. Но глядя на код, я могу думать только о двух вещах, которые выглядят так, как будто это могло вызвать это.

ADyson 10.09.2018 10:16

Код должен работать. Я только что закончил его тестировать, и он на 100% работает в моей системе. @ADyson делает несколько хороших замечаний. Кроме того, не включайте такие пути (используя параметр сообщения). Это огромная дыра в безопасности.

Menelaos 10.09.2018 10:28

Попробуйте заменить $type на что-нибудь другое (например, $type12345).

Menelaos 10.09.2018 10:34
0
8
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже упоминалось другими пользователями в комментариях, возможно, ваша проблема в том, что вы устанавливаете для типа другое значение после включения rrdtools.inc.php.

Попробуйте рандомизировать (изменить имя) переменной типа:

$host = $_POST['hostname'];
echo $type123456=$_POST['type_char'];
include('rrdtools.inc.php');
include('graphs/'.$type123456.'.inc.php');

Это единственное, о чем я могу думать, поскольку и я (и другие) протестировали ваш код. (как фронтенд, так и бэкэнд).

PS: Использовать параметр post - плохая практика.

Другие вопросы по теме