извикване на ajax разделител на низове

Така един PHP файл връща низ (към ajax повикване) като този:

$output = $sessID."###".$sessEmail."###".$sessFirstName."###".$sessLanguage."###".$sessRememberMe;

и в javascript правя:

    if (reply.indexOf("###") >= 0) {
    arrayReply = reply.split("###");
    user.ID = arrayReply[0];
    user.Email = arrayReply[1];
    user.FirstName = arrayReply[2];
    user.Language = arrayReply[3];
    user.RememberMe = arrayReply[4];
    }

може да възникне проблем, когато части от отговора съдържат използвания от мен разделител "###". Какво мога да направя в такава ситуация? Направата на разделителя по-сложен/рядък не е решение според мен.

PS: Опитах JSON, но е МНОГО ПО-БАВНО от страна на сървъра.

КРАЙНА РЕДАКЦИЯ:

JSON от страна на сървъра е по-бавен и същото за страната на клиента, но няма да бъде пречка (430ms за 100 000 обаждания) и освен това няма нужда, както Джулс каза по-долу, да изобретяваме отново колелото. Имаше още едно решение: bin2hex() в php [което намали времето от 430ms на 240] и след това върна низа в javascript с функция hex2string, но не си струва усилието. JSON е. Благодаря на всички ви!


person MirrorMirror    schedule 04.05.2012    source източник
comment
защо просто не изпратите тези стойности от php във формат json или xml   -  person Dhiraj    schedule 04.05.2012
comment
JSON има много повече смисъл в тази ситуация. Въпреки това, ако настоявате за тип CSV, е доста обичайно да използвате допълнителни разделители на полета, като '' и да се уверите (т.е. да замените), че те не се появяват в полетата за стойност.   -  person Jules    schedule 04.05.2012


Отговори (4)


Можете да използвате json.

http://php.net/manual/en/function.json-encode.php

Как да декодираме JSON елементи от масив в JavaScript?

person Nauphal    schedule 04.05.2012
comment
Опитах JSON, но открих, че е МНОГО ПО-БАВНО, отколкото чрез просто свързване на низове и разделяне на масиви: страна на сървъра: 6 пъти по-бавно, страна на клиента (не толкова важно) 5-9 пъти по-бавно - person MirrorMirror; 04.05.2012
comment
Това звучи трудно за вярване. Очевидно целият процес ще бъде малко по-бавен, но 6 пъти звучи като много. Освен това не виждам как това би могло да е проблем в реалния свят. Ако имате толкова строги изисквания за производителност, защо използвате PHP на първо място? :С - person Jules; 04.05.2012
comment
Направих бенчмаркове със 100 000 обаждания. json беше 435ms и простото сливане беше 72ms, това е 6 пъти сървърната страна. - person MirrorMirror; 04.05.2012
comment
Защо точно това е проблем? Така или иначе ще попаднете в тази зона, след като започнете да дезинфекцирате струните си. Не се опитвайте да изобретявате отново колелото, сблъсквате се с една от проблемните области, за които са измислени подходящи формати за сериализиране (като XML или JSON). - person Jules; 04.05.2012
comment
Мисля, че сте прав, ще трябва да внедря отново JSON и 435 ms за 100 000 обаждания не е проблем, съмнявам се, че ще имам 100 000 едновременни потребители. P.S. казахте, че PHP обикновено е бавен, какво бихте предложили като по-бърза алтернатива? - person MirrorMirror; 04.05.2012
comment
Е, първо, съмнявам се, че вашият http сървър ще се справи много добре със 100 000 едновременни AJAX заявки. Не бих посмял да предложа алтернатива, тъй като нямам представа за какво става въпрос или какви са общите изисквания. Това, което имах предвид, беше, че ако няколко цикъла на процесора са проблем, вероятно ще погледнете някое силно оптимизирано CGI решение, а не интерпретиран PHP код. Както и да е, предполагам, че PHP е добра производителност за 98% от уеб проектите, за които се използва. - person Jules; 04.05.2012

Ако, както казвате, кодирането като JSON е по-бавно, можете да опитате следното,

$output = '"' . some_kind_of_escape_function($sessID).'","'.some_kind_of_escape_function($sessEmail).'","'.some_kind_of_escape_function($sessFirstName).'","'.some_kind_of_escape_function($sessLanguage).'","'.$sessRememberMe.'"';

и разбира се заменете some_kind_of_escape_function с подходящата php функция (напр. addslashes или mysql_real_escape_string) мина известно време, откакто съм правил PHP разработка, така че изберете тази, която най-добре отговаря на вашите нужди

Тогава това е прост случай на разделяне със запетаята и премахване на кавичките

person kzhen    schedule 04.05.2012

Една от възможностите е вместо това да използвате JSON обект.

За PHP (с помощта на json_encode):

$output = json_encode(array(
    "sessid" => $sessID,
    "sessEmail" => $sessEmail,
    "sessFirstName" => $sessFirstName,
    "sessLanguage" => $sessLanguage,
    "sessRememberMe" => $sessRememberMe
));

За JS (с използване на jQuery метод):

$.getJSON("/path/to/script.php", function(reply) {
    user.ID = reply.sessid;
    user.Email = reply.sessEmail;
    user.FirstName = reply.sessFirstName;
    user.Language = reply.sessLanguage;
    user.RememberMe = reply.sessRememberMe;
});

В противен случай можете да използвате всеки друг разделител, който вероятно няма да бъде намерен в полетата (или можете да го замените в полетата). Един от примерите е да използвате символ за нов ред (\n).

person VisioN    schedule 04.05.2012
comment
Благодаря ви за отговора, но JSON е много бавен както от страната на сървъра, така и от страната на клиента. в сървърната страна е 6 пъти по-бавно и това е важно според мен - person MirrorMirror; 04.05.2012
comment
@user1032650 Какво ще кажете за използването на \n като разделител? - person VisioN; 04.05.2012
comment
това би било добро решение, но се страхувам, че какъвто и разделител да използвам, злонамерен потребител от javascript също може да го вмъкне. - person MirrorMirror; 04.05.2012
comment
@user1032650 Премахнете го с str_replace до интервали :) - person VisioN; 04.05.2012
comment
@VisioN \n само измества проблема, тъй като можете да имате \n и като съдържание на низ, нали? Или може би искате да запазите знака \n за по-късна употреба. - person worenga; 04.05.2012
comment
@mightyuhu В ID на сесията, имейл, един ред първо име, език и bool помниш ли ме? Съмнявам се. - person VisioN; 04.05.2012
comment
в тези полета, да, няма да имам \n, но в други общи съобщения като текст може да има всякакви знаци - person MirrorMirror; 04.05.2012
comment
@user1032650 Хм, тогава бих предпочел JSON като най-безопасния метод. Освен това не мисля, че за мощен сървър има проблем да се направи JSON низ. 6 пъти по-бавно от 1 многократно свързване ще компенсира, когато започнете да замествате и избягвате. В случай на JSON клиентската страна получава валиден JavaScript обект, който не трябва да се анализира. Така че вероятно в уеб технологиите JSON ще бъде дори по-бърз от други безопасни методи за сериализация/несериализация. - person VisioN; 04.05.2012

Защо да развивате свой собствен формат, ако вече има такъв? използвайте Json:

$output = json_encode(array('sessionID'=>$sessID,'sessionEmail'=>sessEmail,'sessionFirstName'=>$sessFirstName,'sessLanguage'=>$sessLanguage,'sessRememberMe'=>$sessRememberMe));

А за страната на Javsascript вижте http://www.javascriptkit.com/dhtmltutors/ajaxgetpost4.shtml или ако използвате JQuery и т.н. вашата рамка е много вероятно да има някаква вградена функционалност като http://api.jquery.com/jQuery.getJSON/

Въпреки това, ако искате да използвате вашия ###-разделител, бих ви предложил да го намалите само до "#" в името на простотата и пространството. След това въведете това, което се нарича екраниращ символ като "\" Така че в препас ще анализирате входа си и ще замените всички срещания на # с #, обратното в изхода. След това можете да разделите своя низ с помощта на специален Regex, който се разделя само с #, а не с "#"

person worenga    schedule 04.05.2012