04.01.2016, 16:27
|
Аспирант
|
|
Регистрация: 10.12.2015
Сообщений: 47
|
|
Помогите с json
Здравствуйте, помогите разобраться!
Формирую json и отправляю в php:
function send() {
var textfield1 = '';
var textfield2 = '';
var textfield3 = '';
var textfield4 = '';
var textfield5 = '';
var ARTKL01 = '';
var ARTKL02 = '';
var ARTKL03 = '';
var ARTKL04 = '';
var ARTKL05 = '';
var kolichestvo01 = '';
var kolichestvo02 = '';
var kolichestvo03 = '';
var kolichestvo04 = '';
var kolichestvo05 = '';
var data = {
"pole1": textfield1,
"pole2": textfield2,
"pole3": textfield3,
"pole4": textfield4,
"pole5": textfield5,
"zakaz": [
{ "artikul":ARTKL01, "kolichestvo":kolichestvo01, },
{ "artikul":ARTKL02, "kolichestvo":kolichestvo02, },
{ "artikul":ARTKL03, "kolichestvo":kolichestvo03, },
{ "artikul":ARTKL04, "kolichestvo":kolichestvo04, },
{ "artikul":ARTKL05, "kolichestvo":kolichestvo05 }
]
}
var obj = {};
Object.keys(data).forEach(function (key) {
if(key == 'zakaz'){
var arr = data[key].filter(function(el) {
return el.artikul && el.kolichestvo
});
if(arr.length) obj[key] = arr
}
else {
data[key] && (obj[key] = data[key])
}
});
// отправляю json в php
var send = JSON.stringify(obj);
$.ajax({
type: "POST",
url: "send_json.php",
data: ( {"send_json" : send})});
}
Принимаю json в php:
if (isset($_POST['send_json'])) {$jsonString = $_POST['send_json'];}
$zakaz_json = json_decode($jsonString);
$textfield1 = $zakaz_json->pole1;
$textfield2 = $zakaz_json->pole2;
$textfield3 = $zakaz_json->pole3;
$textfield4 = $zakaz_json->pole4;
$textfield5 = $zakaz_json->pole5;
$artikul01 = $zakaz_json->zakaz[1]->artikul;
$artikul02 = $zakaz_json->zakaz[2]->artikul;
$artikul03 = $zakaz_json->zakaz[3]->artikul;
$artikul04 = $zakaz_json->zakaz[4]->artikul;
$artikul05 = $zakaz_json->zakaz[5]->artikul;
$kolichestvo01 = $zakaz_json->zakaz[1]->kolichestvo;
$kolichestvo02 = $zakaz_json->zakaz[2]->kolichestvo;
$kolichestvo03 = $zakaz_json->zakaz[3]->kolichestvo;
$kolichestvo04 = $zakaz_json->zakaz[4]->kolichestvo;
$kolichestvo05 = $zakaz_json->zakaz[5]->kolichestvo;
Вот тут начинается ступор.
Дело в том, что не известно какие именно артикулы придут в переменные $artikul01,$artikul02,$artikul03,$artikul04,$artik ul05.
В зависимости от того какой артикул пришел нужно назначить переменные.
Например:
Если в $artikul01 пришел артикул P6001, то нужно присвоить $Prodname01='Бананы', $Ves01='1000г', $Price01 = '190' и взять количество из $kolichestvo01;
Начал делать так:
if ($artikul01 == "P6001") {$Prodname01='Бананы' ; $Ves01='1000г' ; $Price01 = '190' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P3001") {$Prodname01='Бананы' ; $Ves01='500г' ; $Price01 = '110' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P6002") {$Prodname01='Клубника' ; $Ves01='1000г' ; $Price01 = '190' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P3002") {$Prodname01='Клубника' ; $Ves01='500г' ; $Price01 = '110' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P6003") {$Prodname01='Яблоки' ; $Ves01='1000г' ; $Price01 = '190' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P3003") {$Prodname01='Яблоки' ; $Ves01='500г' ; $Price01 = '110' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P6004") {$Prodname01='Груши' ; $Ves01='1000г' ; $Price01 = '190' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P3004") {$Prodname01='Груши' ; $Ves01='500г' ; $Price01 = '110' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P6005") {$Prodname01='Апельсины' ; $Ves01='1000г' ; $Price01 = '190' ; $kolvo01 = $kolichestvo01};
if ($artikul01 == "P3005") {$Prodname01='Апельсины' ; $Ves01='500г' ; $Price01 = '110' ; $kolvo01 = $kolichestvo01};
Потом также по второму артикулу:
if ($artikul02 == "P6001") {$Prodname02='Бананы' ; $Ves02='1000г' ; $Price02 = '190' ; $kolvo02 = $kolichestvo02};
if ($artikul01 == "P3001") {$Prodname02='Бананы' ; $Ves02='500г' ; $Price02 = '110' ; $kolvo02 = $kolichestvo02};
if ($artikul02 == "P6002") {$Prodname02='Клубника' ; $Ves02='1000г' ; $Price02 = '190' ; $kolvo02 = $kolichestvo02};
if ($artikul02 == "P3002") {$Prodname02='Клубника' ; $Ves02='500г' ; $Price02 = '110' ; $kolvo02 = $kolichestvo02};
// и т.д.
И так по каждому артикулу.
Понял, что это полный бред. Ведь артикулов может быть бесконечное кол-во.
Начал думать, что может есть вариант правильнее с меньшим кодом, но моих знаний и навыков хватило только на это.
Помогите, пожалуйста, разобраться!
А может есть возможность отправлять в БД артикул и количество, а БД будет возвращать название товара, стоимость и т.д.?
Я нуб! Извините!
Последний раз редактировалось K_PECT, 04.01.2016 в 16:39.
|
|
04.01.2016, 19:44
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сразу же вопрос - нахрена значения массива имеющего ключ присваивать переменной? Какую роль они у вас играют? Ну ведь никакой, и пользы от них никакой нет, зачем же это делается?
|
|
05.01.2016, 13:59
|
Аспирант
|
|
Регистрация: 10.12.2015
Сообщений: 47
|
|
Я нуб. Что вы имеете ввиду?
|
|
05.01.2016, 14:53
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
А то, что и на клиенте имена параметров с потолка, и на сервере с ними же каша.
Сообщение от K_PECT
|
А может есть возможность отправлять в БД артикул и количество, а БД будет возвращать название товара, стоимость и т.д.?
|
Есть, а также база данных может формировать уникальный идентификатор, который более удобен, чем артикул являющийся строкой, хотя можно и полю артикула определить уникальный индекс, но если бы только выборка нужна была, а ведь потребуется гораздо большего.
Для сервера нужен уникальный идентификатор и количество товара, все остальное он получит из базы. Вот только на клиенте никчемные имена полей: "pole1",..., причем не понятно с какого перепуга нужно формировать на нем json, если для передачи данных на сервер уже давно есть готовое и удобное - форма. Потом на сервер с именованием и определением тоже каша.
Желательно не афишировать структуру таблиц базы данных, но можно использовать в качестве имен полей формы имена соответствующих полей таблицы базы, но без префикса. В этом случае легко связать полученные данные с конечным адресатом. Можно поступить и иным путем когда имена знает только сервер, а имена полей формы это ключи этих полей, по которым их можно получить.
Это относительно именования. В случае же получения товара с клиента, вообще ничего не требуется, достаточно одного имени для всех полей формы как ключа массива, индексами которого будут идентификаторы товаров. Сервер получить массив в котором ключ это ID товара, а значение, это выбранное его количество. Что-то сложного с полями тут и определять не надо, имя поля одно, и оно известно, это имя и будет фигурировать для WHERE, остается подставить ключ из массива, и по указанному ID будет получена информация о товаре.
Нужно начинать изучать серьезно и базы данных, и серверный язык, и т.д., ибо рассказать все да еще простыми словами не возможно. Но и так писать код как приведено нельзя, в нем практически все не нужное, как на клиентской стороне, так и на серверной.
|
|
05.01.2016, 20:44
|
Аспирант
|
|
Регистрация: 10.12.2015
Сообщений: 47
|
|
Спасибо огромное за подробные разъяснения! Буду пробовать доставать информацию о товаре из БД
|
|
06.01.2016, 01:00
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Конечно надо пробовать, и если я угадал, что речь идет о выбранных товарах, то:
1) выбор товаров, а тем более и его количества, это форма, которая в отличии от js + json имеет преимущество - при отключенном js на клиенте сервер все равно получит данные.
2) именование полей формы, это - name="id[222]", name="id[333]", где id, к примеру, часть имени поля таблицы базы определяющей идентификатор товара. Хотя, как уже говорилось, в данном случае это не так важно, ибо речь идет о добавлении товаров, или их выборе, то сценарий определен под данную задачу, а товары в одной таблице, а значит и известно имя одного поля.
3) товары на сервере в этом случае, это массив $_POST['id], после обработки пустых и возможной шелухи:
$product = array_diff(array_map('intval', $_POST['id]), [0]);
222 => 1,
333 => 5,
....
ID товаров (ключи этого массива) подставляются в запрос, поэтому их также обязательно привести к типу int (если только не работа с подготовленными запросами например PDO):
if($id = array_diff(array_map('intval', array_keys($product)), [0])) {
$sql = 'SELECT * FROM table WHERE product_id IN(' . implode(',', $id) . ')';
}
и будет получено все по запрашиваемым товарам
4) абстракции pole1, $textfield1, $artikul01, $kolichestvo01 ... выбросить.
|
|
|
|