Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.12.2016, 22:31
Аватар для kupidon
Аспирант
Отправить личное сообщение для kupidon Посмотреть профиль Найти все сообщения от kupidon
 
Регистрация: 18.03.2016
Сообщений: 69

Как отправить переменные не просто в файл php, а в его php-функцию
Доброго времени суток.
Подскажите: можно ли и как передать переменные с помощью AJAX в функцию php.
Сейчас делаю так:
$.ajax({
    type: "POST",
    url: "edit_catalogpost.php",
    data: ("table="+cat_table+"&field="+cat_field+"&value="+hidden+"&id="+cat_id), 
    dataType: "html",
    cashe: false,
    success: (function() { 
    }),
    error: (function() { alert("Ошибка выполнения"); }),
 });

то есть передаю переменные в файл edit_catalogpost.php, в котором просто принимаю и делаю sql запрос к бд.
if ($_POST){
  
    $table = $_POST['table'];   //таблица (получаем из #table)
    $field = $_POST['field'];   //имя поля (получаем при разборе класса td)
    $value = $_POST['value'];   //новое значение (получаем при разборе класса td)
    $id = $_POST['id'];         //id ячейки которую будем обновлять (получаем при разборе класса td)
......SQL=""...
}

Возникла необходимость делать несколько разных sql запросов. Чтобы не делать много таких php-файлов-обработчиков.: Можно ли как-то в одном php-файле создать несколько php-функций-обработчиков?
Чтобы с помощью ajax отправлять данные не просто в файл, а В НУЖНУЮ ФУНКЦИЮ этого файла?

Может есть какое-то другое решение. Просто делать один php файл для одного sql запроса не очень нравится мне.
Ответить с цитированием
  #2 (permalink)  
Старый 11.12.2016, 10:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Можно, но только не непосредственно в функцию, а в вызов функции как ее аргументы. Для этого и существуют параметры запроса, но:

1) оперировать непосредственно именами таблиц и ее полей не стоит, это небезопасно, пусть параметры, это имена, а в базе эти имена имеют префикс, который сервер подставит;

2) обязательно проверять действительность имен;

3) ну конечно обязательно экранировать значения параметров.

Чтобы таким образом выполнить кардинально разные задачи требующие отдельных функций, можно использовать тот же switch, а можно и массив функций, в последнем случае примерно так:

а) запрос клиента содержит два первичных ключа - первый требуемая функция, второй, это массив параметров передаваемых в нее:

//скобки совсем не нужны
data: "job=fun_1&arg[table]="+cat_table+"&arg[field]="+cat_field+"&arg[value]="+hidden+"&arg[id]="+cat_id,


на сервере:

$job = [
    'fun_1' => function(array $arg) {
         //проверяем действительность передаваемых имен и добавляем им префиксы
         //запрос и возврат
     },
     'fun_2' => function(array $arg) {
         //....
     }
];

if(isset($_POST['job']) && array_key_exists($_POST['job'], $job)) $result = $job[$_POST['job']]($_POST['arg']);


б) у сервера нет никаких td и подобного, это ваша задача отождествлять поля sql-таблицы с колонками html-таблицы, и если разные таблицы и запросы, но схожие при этом задачи (пусть отображения), то может и не потребуется на сервере для каждой своя функция, все можно решать и в одной, что и откуда как раз и будут задавать параметры запроса клиента.

Последний раз редактировалось laimas, 11.12.2016 в 16:53.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в php не обновлять страницу, а изменить стиль? drkrol Серверные языки и технологии 1 17.09.2015 19:05
в getElement удаётся получить тэг через getElemetsByTagName Терехов Станислав Общие вопросы Javascript 19 19.06.2014 06:35
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как отправить данные в .php файл на другой сервер ? lamer AJAX и COMET 2 04.04.2012 23:55
Как считать файл с винта и вставить его в mht-файл ? potkin Общие вопросы Javascript 4 26.08.2008 14:17