PDA

View Full Version : سوال: مشکلات ذخیره داده های json با محتوای فارسی در پایگاه داده و نمایش آن



armsoftpc
جمعه 26 اسفند 1390, 11:20 صبح
به نام خدا
با سلام
وقتی آرایه ای که حاوی محتوای فارسی(حروف انگلیسی ، هیچ مشکلی را بوجود نمی آورند) را با json ، اینکد می کنم و به صورت دستی در پایگاه داده ذخیره می کنم، داده های که به uxxxx\ ذخیره می شوند و بعد دیکد می کنم ، داده های فارسی بدون مشکل نمایش پیدا می کنند ، اما وقتی با php این کار را می کنم ، یعنی php با دستورات sql خود (تابع mysqli_query) آن را ذخیره می کند. به صورت uxxxx بدون اسش ذخیره می شوند و همین کار باعث می شود که در هنگام نمایش ، عبارات به فارسی تبدیل نشوند و همین گونه نمایش پیدا کنند که بسیار آزار دهنده است.
راه حل چیست؟
1. داده های فارسی توسط json_encode ، همانند تابع serialize همان صورت بیایند و تبدیل نشوند.
2. داده ها با اسلش در پایگاه داده ذخیره شوند.( که البته تعداد این اسلش ها به تعداد کاراکتر ها بیستگی دارد.) ، من فکر می کنم که در هنگام اجرای کوئری php اسلش ها را که جزو کاراکتر های استتثنا است را حذف می کند.:چشمک:

این هم نمونه داده:

g_name":"\u0633\u0639\u06cc\u062f \u0631\u062d\u0645\u0627\u0646\u06cc","g_savad":"\u062f\u06a9\u062a\u0631\u06cc","g_job":"\u0645\u0647\u0646\u062f\u0633 \u0647\u0648\u0627 \u0641\u0636\u0627","g_birth":"1977-07-15 09:11:06","g_mob":"09355118660","g_nesbat":"\u0639\u0645\u0648","g_know_school":"\u0632\u06cc\u0627\u062f"}

دوستان نظرشون رو اعلام کنند یا یک راحلی رو پیشنهاد بدهند.:متفکر:
موفق باشید.

MMSHFE
جمعه 26 اسفند 1390, 11:24 صبح
خوب بعد از خوندن از دیتابیس با preg_replace هرچی uxxxx بود رو با uxxxx\ جایگزین کرده و بعد پردازش کنید.

armsoftpc
جمعه 26 اسفند 1390, 11:38 صبح
به نام خدا
با سلام
روش کار با این تابع رو نمی دونم ، اما به نظرم این روش به درد نخواهد خورد.
آیا راهی است که بتوان uxxxx با اسلش اش در دیتابیس ذخیره کرد.
که دیگر این همه دردسر نکشیم، من نزدیک به 40 و حتی بیشتر فیلد رو چگونه با این روش انجام دهم ، کاری وقت گیر و سخت است.
به نظر شما روش پیشنهادی ، الان من و 2 روش قبلی که گفتم کدام بهتر است.

armsoftpc
جمعه 26 اسفند 1390, 11:52 صبح
لطفا دوستان دیگر هم یه همکاری بکنند.

Reza1607
جمعه 26 اسفند 1390, 13:33 عصر
يكبار قبل از درج در جدول با استفاده از تابع mysql_real_escape_string ورودي رو اسكيپ بكنش شايد درست بشه

alismith
جمعه 26 اسفند 1390, 13:42 عصر
سلام
دوست عزیز اگر مشکل شما این هستش که به اول هر u یک \ اضافه کنید، روش جناب شهرکی درست بود

این مثال رو ببینید :


$arr=array(
"g_name"=>"u0633u0639u06ccu062f u0631u062du0645u0627u0646u06cc",
"g_savad"=>"u062fu06a9u062au0631u06cc",
"g_job"=>"u0645u0647u0646u062fu0633u0647u0648u0627u0641u0636 u0627",
"g_birth"=>"1977-07-15 09:11:06",
"g_mob"=>"09355118660",
"g_nesbat"=>"u0639u0645u0648",
"g_know_school"=>"u0632u06ccu0627u062f"
);

$obj=json_encode($arr);
$obj=json_decode($obj);


foreach($obj as $k => $v){

echo str_replace("u","\u",$v)."\n<br/>";


}




موفق باشید

armsoftpc
جمعه 26 اسفند 1390, 15:29 عصر
به نام خدا
با سلام

يكبار قبل از درج در جدول با استفاده از تابع mysql_real_escape_string ورودي رو اسكيپ بكنش شايد درست بشه


ساختار سایت من با mysqli است نه mysql.:متفکر:

دوست عزیز اگر مشکل شما این هستش که به اول هر u یک \ اضافه کنید، روش جناب شهرکی درست بود
دوست عزیز این کار برای سایت من ، به دلیل گسترگی اطلاعات و آرایه بودن تمام اطلاعات و نمایش هر داده ای در جایی این روش جواب نمی ده!
دوستان به یکی از 2 سوال زیر پاسخ دهند؟
1.آیا روشی است که تابع json_encode داده های فارسی رو به حروف utf8 تبدیل نکنه؟!
2.اگر روشی نیست یا روش بالا بدرد نمی خورد ، چه کار کنیم وقتی که php دارد ، داده ها را ذخیره می کند ، اسلش های آن را حذف نکند.
با تشکر

Reza1607
جمعه 26 اسفند 1390, 15:31 عصر
خوب با mysqli_real_escape_string اين كار رو بكنيد

armsoftpc
جمعه 26 اسفند 1390, 15:33 عصر
ارور میده و جواب نمیده!
اگر ممکن است، یک بار خودتون تست کنید.
موفق باشید.

amin1softco
جمعه 26 اسفند 1390, 17:10 عصر
من زیاد الان تو بحرش نیستم ولی به نظرم راه حل دوستان درسته می تونید از تابع addcslashes هم استفاده کنید و چرا mysqli_real_escape_string کار نداده/؟ عجیبه...

masoud_tamizy
جمعه 26 اسفند 1390, 19:37 عصر
ارور میده و جواب نمیده!
اگر ممکن است، یک بار خودتون تست کنید.
موفق باشید.
از چه نسخه ای از mysql استفاده می کنید یا روی سرور چه نسخه ای نصبه ؟ باید کانکشن رو به تابع mysql_real_escape_string پاس بدی . مطمئن باش که جواب می ده . اگرجواب نگرفتی از mysql_escape_string استفاده کن .

Reza1607
یک شنبه 28 اسفند 1390, 22:53 عصر
ارور میده و جواب نمیده!
اگر ممکن است، یک بار خودتون تست کنید.
موفق باشید.

راستش من mysqli نصب ندارم تا بتونم تست كنم ولي توي سايت php.net يك بنده خدايي يك راه حل داده بود راه حلش اين بود كه قبل از اين كه بخواي به صورت رشته json در بياري اون رو به utf8 انكود كنيد بعد تبديل به جي سان كنيد و انتقالش بدين بعد زماني كه خواستيد اونو ديكد كنيد بعد از اين كه ديكد كردين يكبار هم اون رو با utf8 ديكود كنيد

Reza1607
یک شنبه 28 اسفند 1390, 22:54 عصر
در ضمن دوست عزيز اگه به نتيجه اي رسيديد به من هم پ خ بدين چون فكر كنم تو پروژه پايان دوره بهش شديدا نياز پيدا كنم

armsoftpc
دوشنبه 29 اسفند 1390, 13:56 عصر
به نام خدا
با سلام
مشکل حل شد.
ببخشید این رو می گم ، اما تقریبا همه ی راه هایی که دوستان پیشنهاد دادند ، غلطه!!!
فقط کافی از تابع addslashes استقاده کنید ، مشکل کاملا حل میشه.:لبخند:اسلش ها اضافه شده در هنگام ذخیره ، توسط php حذف شده و در دیتابیس ذخیره نمی شوند.
هیچ ربطی هم به mysql نداره!!!
در جواب دوست عزیزمون جناب amin1softco ، که گفته بودند ، از تابع addcslashes استفاده کنم ، نمی دونم کاربرد این تابع چیه، اما خیلی شبیه به تابعی است که خودم گفتم، اگر امکان داره فرقش رو بگید.
ممنون از همه دوستان.

armsoftpc
یک شنبه 06 فروردین 1391, 20:13 عصر
هنوز منتظر جوابیم.