JSON PHP
Обычно JSON используется для получения данных с сервера и вывода их на веб-странице.
В этой главе мы рассмотрим как обмениваться данными JSON между клиентом и сервером на PHP.
PHP файл
В PHP есть несколько встроенных функций для работы с данными JSON.
Объекты в PHP могут конвертироваться в JSON при помощи PHP функции json_encode():
name = "John"; $myObj->age = 30; $myObj->city = "New York"; $myJSON = json_encode($myObj); echo $myJSON; ?>
Клиентский JavaScript
К PHP файлу из предыдущего примера можно обратиться по AJAX запросу, используя на стороне клиента следующий JavaScript код. Функция JSON.parse() конвертирует полученные данные в JavaScript объект:
var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < var myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj.name; >>; xmlhttp.open("GET", "demo_file.php", true); xmlhttp.send();
PHP массив
Массивы в PHP также конвертируются в JSON при помощи PHP функции json_encode():
Клиентский JavaScript
К PHP массиву из предыдущего примера также можно обратиться по AJAX запросу, используя на стороне клиента следующий JavaScript код. Функция JSON.parse() конвертирует полученные данные в JavaScript массив:
var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < var myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj[2]; >>; xmlhttp.open("GET", "demo_file_array.php", true); xmlhttp.send();
PHP база данных
PHP — это серверный язык программирования и используется для операций, выполняемых только на стороне сервера, например, для доступа к базе данных.
Представьте, что у вас на сервере есть база данных, в которой содержится информация о товарах, покупателях и поставщиках. И вы хотите получить 10 первых записей в таблице покупателей («customers»).
Используем функцию JSON.stringify(), чтобы конвертировать JavaScript объект в JSON:
obj = < "table":"customers", "limit":10 >; dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < document.getElementById("demo").innerHTML = this.responseText; >>; xmlhttp.open("GET", "json_demo_db.php?x language-php"> query("SELECT name FROM ".$obj->table." LIMIT ".$obj->limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($outp); ?>
- Конвертируем данные запроса в объект при помощи PHP функции json_decode().
- Обращаемся к базе данных и заполняем массив запрошенными данными.
- Добавляем массив к объекту и возвращаем объект в виде строки JSON, используя функцию json_encode().
Обход полученных данных
Теперь конвертируем данные, полученные от PHP файла, в JavaScript объект или в данном случае в JavaScript массив. Для этого используем функцию JSON.parse():
. xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < myObj = JSON.parse(this.responseText); for (x in myObj) < txt += myObj[x].name + "
"; > document.getElementById("demo").innerHTML = txt; > >; .
PHP метод POST
При отправке данных на сервер лучше всего использовать метод POST.
Чтобы послать AJAX запрос, используя метод POST, следует задать нужный метод и откорректировать заголовок.
Данные, отправляемые на сервер, теперь должны быть аргументом в методе send():
obj = < "table":"customers", "limit":10 >; dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < myObj = JSON.parse(this.responseText); for (x in myObj) < txt += myObj[x].name + "
"; > document.getElementById("demo").innerHTML = txt; > >; xmlhttp.open("POST", "json_demo_db_post.php", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send("x language-php"> query("SELECT name FROM ".$obj->table." LIMIT ".$obj->limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($outp); ?>
Интерфейс Javascript < == >PHP
Хочу предложить один удобный метод для взаимодействия Javascript с PHP.
Можно в PHP добавить класс, с возможность ‘удаленного’ запуска оттуда функций с параметрами.
Передача параметров
Каким образом лучше всего передать функции на вход PHP?
Наиболее подходящий способ — с помощью массива.
Как передать массив? Самый простой и наиболее оптимальный метод (учитывая, что мы имеем дело с Javascript) — это JSON. Передача параметров на запуск будет выглядеть, например:
Преобразовать это в массив на стороне PHP можно очень просто — с помощью json_decode. Осталось только разобрать полученный массив по полочкам, а полученный результат вывести обратно в виде JSON клиенту.
User Interface
class UserInterface private $ if ;
public $result=array();
function add($groupname,$ if ) $ this -> if [$groupname][]=$ if ;
>
В этот класс мы будем добавлять новые методы (функции), а затем с помощью небольшой доработки, научим Javascript «видеть» и запускать их, получая результаты их работы.
Класс имеет следующие функции:
— $this->add(,) позволяет добавляет новый метод. Если метод существует, добавляет в него ещё одну функцию.
— $this->() идёт вызов всех добавленных функций в методе.
— $this->run() запускает последовательно на выполнение несколько методов, используя параметры из массива.
Пример:
Необходимо создать интерфейс работы с БД с получением информации.
Для начала инициализируем интерфейс, которым будем пользоваться:
class db static function save($num) //Функция для записи в БД
//$num->.
>
static function load($num) //Функция для загрузки из БД
//$db return array («DBresult»=>$db);
>
>
$UImethod->add( ‘savedb’ , ‘db::save’ );
$UImethod->add( ‘loaddb’ , ‘db::load’ );
При этом, если вдруг нам потребуется добавить модуль создания логов, то обработку можно легко добавить в эту же группу:
$UImethod->add( ‘savedb’ , ‘log::add_savelog’ );
Теперь будет происходить последовательный запуск обеих функций, при запуске группы ‘savedb’.
Работа Javascript c классом UserInterface
Сначала хочу немного остановиться на методе run. Это нам поможет в заимодействии.
Метод run позволяет запускать несколько групп с разными переметрами последовательно. Принимает названия групп он в виде массива:
Тогда, запустив $UImethod->run($a); можно сохранить в базу данных — 200, затем её считать с помощью ‘loaddb’.
Вы наверное заметили, что db::load возвращает результаты в виде массива. Эти результаты инкапсулируются(добавляются) или простыми словами попадают в общий массив $this->result. В результате, мы будем использовать этот массив, как ответ JavaScript’у на запрос.
Тоесть, например, запустив loaddb(200) и loaddb(300) — мы получим на выходе массив, имеющий заполненные поля: ‘DBresult’=>(‘200’=>… и ‘300’=>. ).
Ну а теперь самое главное — это реализвация декодирования (на вход) и кодирования (на выход) JSON массивов в PHP, с запуском вызываеммых с помощью Javascript методов:
if (!isset($_REQUEST[ ‘method’ ]))
die();
$functions=json_decode($_REQUEST[ ‘method’ ],TRUE);
$UImethod->run($functions);
echo json_encode($UImethod->result);
Запуск методов из JavaScript
//Функция, реализующая AJAX запрос на сервер
//Параметры URL, JS-функция, дополнительные параметры, [следующий URL, JS-func. ]
function ajax_load(url,parcer,par,next) var req, ab, done=0;
this .request= function () if (window.XMLHttpRequest)
ajaxRequest = new XMLHttpRequest();
else if (window.ActiveXObject) ajaxRequest = new ActiveXObject( «Msxml2.XMLHTTP» );
if (!ajaxRequest)
ajaxRequest = new ActiveXObject( «Microsoft.XMLHTTP» );
>
return ajaxRequest;
>
this .ReqStatus= function () if (req.readyState == 4) clearTimeout(ab);
if (req.status == 200) parcer(req,par);
if (next)
ajax_load(next[0],next[1],next[2],next[3]);
> else
alert( «AJAX Error: \n» + req.statusText + «\n» + url);
>
>
req= this .request();
req.onreadystatechange = this .ReqStatus;
req.open( «GET» , url, true );
req.send( null );
ab = window.setTimeout( function (), 10000);
return req;
>
//Функция, которая кодирует запрос в JSON формат (func(param) -> «func»:[param]) и отсылает его на сервер (делая запрос «JSON.php?method=. »)
function server_eval(mod,ret) mod=mod.replace(/\s*([\w\d_]+)\s*\(([\w\d_. \\,\[\] «]*)\)\s*;?/gi,'» $1 «:[$2],’).replace(» ‘»,’ «‘);
mod=»;
ajax_load(» JSON.php?method #0000ff»>null );
>
//Обработчик запроса
function time_result(res) db=eval( ‘(‘ + res.responseText + ‘)’ );
document .write(db[ ‘DBresult’ ]);
>
//Запрос на сервер с обработчиком ответа time_result
server_eval( ‘savedb(200);loaddb(200);loaddb(300);’ ,time_result);