با سلام
فرض کنیم سمت سرور سه تا کوئری میزنیم تا اطلاعات را بدست آوریم حالا می خواهیم به روش json این اطلاعات که شامل هر کوئری یک آرایه هست را دریافت و نمایش بدهیم
ابتدا اطلاعات را به json-encodeتبدیل می کنیم
بعد از این کار
{"id":"13","codeProduct":"114","name":"parche","image":"assets\/img\/sho.jpeg","purchasePrice":"0","sellPrice":"0","primaryQty":"110","existQty":"47","sellQty":"0","userId":null,"created_at":"2021-01-08 15:10:00","update_at":null, }[{"name":"green"},{"name":"yellow"}][{"name":"12"},{"name":"33"}]اطلاعات این طوری در کنار هم قرار می گیرند
این شکل خروجی نه بصورت objectهست
نه بصورت آرایه
چه باید بکنیم؟
با سلام خدمت شما همراه عزیز
json decode کنید تبدیل به ابجکت میشه و ارایه ایی
یعنی سمت سرور خروجیشو بجای
Encode
بايد decode كنم؟
Decode مگر برای زمانی نیست که اطلاعات از سمت کلاینت میاد برای خواندن در php
Decode ميكنيم
خب شما مگه نمیخوایید ساختار json رو به ابجکت و ارایه تبدیل کنید؟
بله من می خواهم بصورت ابجکت یا آرایه شود
ولی همان طور که از شما یاد گرفتم و در آموزش های مختلف خوندم
json_decode زمانی استفاده می شود که اطلاعات از سمت کلاینت برای php فرستاده می شود
برای آنکه بتوان json موردنظر را خواند باید decode کرد
الان من می خواهم اطلاعات را به سمت کلاینت بفرستم
پس باید encode کنم
اساسا ایراده این به
نوع این داده هست
[{"name":"12"},{"name":"33"}]
حتی من به روش اطلاعات را به این صورت در آوردم
'{"id":"13","codeProduct":"114","name":"parche","image":"assets\/img\/sho.jpeg","purchasePrice":"0","sellPrice":"0","primaryQty":"110","existQty":"47","sellQty":"0","userId":null,"created_at":"2021-01-08 15:10:00","update_at":null,"0":{"name":"green"},"1":{"name":"yellow"}}'دقیقا این خروجی برای تابع JSON.parce مناسبه ولی باز خطا میده
Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at XMLHttpRequest.http.onreadystatechange
شما اطلاعات رو اگر میخوایید به کلاینت بدید پس چرا همچین تایپی داره؟
شما اطلاعات ارایه ای میگیرید از سرور
و بعد json میکنید میدید به کلاینت
واقعا منم در تعجبم
بررسی کنید شاید جایی رو اشتباه کردید
در pdo دو حالت داره هم میتونید ابجکت بگیرید هم ارایه
سلام
شاید بهتر باشه سوالم را جور دیگر مطرح کنم
کدهای سمت کلاینت من برای درخواست اطلاعات از دیتابیس برای یک card مشخص و نمایش در یک مدال
function select(elem) {
return document.querySelector(elem);
}
function selectAll(elem) {
return document.querySelectorAll(elem);
}
// get id of card for per request
selectAll('.card').forEach(function(card) {
card.addEventListener('click', function() {
let id = this.dataset.id;
var http = new XMLHttpRequest();
var baseAddress = location.href;
var url = baseAddress + '/show'
var params = 'id=' + id;
http.open('POST', url, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
var result = '';
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200) {
result = JSON.parse(http.responseText);
//response data of server
select('.product-modal-img').src = result.image;
select('.product-modal-name').innerHTML = result.name;
select('.product-modal-code').innerHTML = result.codeProduct;
}
}
http.send(params);
// display data in modal page
select('.project-modal').style.cssText = 'transform: scale(1);opacity: 1;'
});
});
select('.pm-close img').addEventListener('click', function() {
//close modal page
select('.project-modal').style.cssText = 'transform: scale(0);opacity: 0;'
});کدهای سمت php برای دریافت اطلاعات از دیتابیس و فرستادن به کلاینت
public function show()
{
$id = $_POST['id'];
$db=new DataBase();
//get data product from database
$product=$db->select("SELECT * FROM `products`WHERE `id`=?;" , [$id])->fetch();
//get data colors from database
$colors=$db->select("SELECT `colors`.`name` FROM `colors` WHERE `colors`.`id` IN (SELECT `colorSize`.`colorId` FROM `colorSize` WHERE `colorSize`.`productId`=?);", [$id])->fetchAll();
//get data sizes from database
$sizes=$db->select("SELECT `sizes`.`name` FROM `sizes` WHERE `sizes`.`id` IN (SELECT `colorSize`.`sizeId` FROM `colorSize` WHERE `colorSize`.`productId`=?);", [$id])->fetchAll();
// json_encoding data
$jsonProduct = json_encode($product);
$jsonColors = json_encode($colors);
$jsonSizes = json_encode($sizes);
}
آیا طریقه json_encode من اشتباه است؟
باید بصورت دیگه ای انجام شود؟
این روش برای متغیر product به تنهایی درست است ولی وقتی متغیرهای دیگر اضافه می شوند در سمت کلاینت مشکل دارم
بنظرم دلیلش تو در تو بودن متغیر colors و sizes است
نحوه دریافتم ایراد دارد
احتمالا نیاز به foreachهست؟
داخل stack overflow پرسیدم و جوابشون این بود
you have to make an array and set all result to that array and after that encode it to json
#example
json_encode(array("product"=>$product,"colors"=>$colors,"sizes"=>$sizes));
after this you will got perfect json object
اول یک ارایه اش کنم بعدا بفرستم سمت کلاینت
شما اطلاعات ارایه ای میگیرید از سرور
و بعد json میکنید میدید به کلاینت
همون پاسخی که بنده گفتم خدمتتون
در نهایت شما json دارید و باید با اون بازی کنید
ولی همون خطا رو دارم
آیا برای دریافتش تغییر خاصی باید بدهم؟
اول مطمن بشید که ارایه میگیرید بعد تبدیل کنید
وقتی بصورت یک آرایه در می آورم
$res=array($product,$colors,$sizes);
تبدیل میشه به یک آرایه تو در تو
وقتی foreach میزنم
foreach ($res as $key ) {
foreach ($key as $value ) {
echo $value;
}
}خروجی بصورت زیر است
13114parcheassets/img/sho.jpeg001104702021-01-08 15:10:00ArrayArrayArrayArrayاینم مطلوب نیست و عمل json_encode را بروی آن نمیشه انجام داد
خب شما دارید یک ارایه رو به ارایه تبدیل میکنید
وقتی خودش ارایه هست چرا دوباره ارایه میکنید
این ها هرکدام ارایه های جداگانه بودند
مرتبه اول اومدم هر آرایه را جداگانه json_encode کردم فرستادم سمت کلاینت
json.parse براش قابل قبول نبود
مرتبه بعدی merge کردم بازم قبول نکرد
مرتبه آخر هم یه آرایه کلی کردم
بعد json_encode کردم باز json.parse خطا داد
هر کدوم از ارایه ها بخوان تبدیل به جی سان بشن نباید ارور بگیرید حتما جایی رو اشتباه میکنید
سلام
آرایه اول من که مشکلی نداره به این صورته
array (size=12)
'id' => string '13' (length=2)
'codeProduct' => string '114' (length=3)
'name' => string 'parche' (length=6)
'image' => string 'assets/img/sho.jpeg' (length=19)
'purchasePrice' => string '0' (length=1)
'sellPrice' => string '0' (length=1)
'primaryQty' => string '110' (length=3)
'existQty' => string '47' (length=2)
'sellQty' => string '0' (length=1)
'userId' => null
'created_at' => string '2021-01-08 15:10:00' (length=19)
'update_at' => nullوقتی به jsonتبدیل میشه
به این صورته
{"id":"13","codeProduct":"114","name":"parche","image":"assets\/img\/sho.jpeg","purchasePrice":"0","sellPrice":"0","primaryQty":"110","existQty":"47","sellQty":"0","userId":null,"created_at":"2021-01-08 15:10:00","update_at":null}آرایه دوم و سوم من تو در تو هستن
به این صورت
array (size=2)
0 =>
array (size=1)
'name' => string 'green' (length=5)
1 =>
array (size=1)
'name' => string 'yellow' (length=6)وقتی به json تبدیل می شوند
[{"name":"green"},{"name":"yellow"}]این فرمت برای json.parseقابل قبول نیست
من کار غیر معمولی انجام ندادم تنها فرق آرایه ها
دوبعدی و تک بعدی بودن هست
https://stackoverflow.com/questions/10084234/how-to-parse-multi-dimensional-json-data-through-javascript