PDA

View Full Version : سوال: ارتباط PHP با SQL Server یا Access و مشکل در متن‌های فارسی



Mohammad S
دوشنبه 05 تیر 1391, 02:33 صبح
با سلام خدمت همگی دوستان عزیز

من برای یک موسسه برنامه‌ای به زبان دلفی XE و پایگاه داده SQL Server 2008 نوشتم که Collation دیتابیس روی Arabic_CI_AS تنظیم شده است. تا اینجا همه چیز بدون مشکل اجرا میشود.
پس از مدتی موسسه مورد نظر از من درخواست کرد که وب‌سایتی برایشان ایجاد کنم که بتوانند داده هایی که به صورت لوکال ثبت می شوند (تعدادی فیش، امتیاز و رتبه)، را هر شخص پس از لاگین به وب سایت، مشاهده کند.
با توجه به آشنایی نسبی خودم با PHP شروع به طراحی وب‌سایتی کردم که هر شخص با لاگین به وب سایت بتواند اطلاعات فیش های واریزی خود را ببینید. در ابتدا با استفاده از ODBC و DSN، سعی کردم به MSSQL متصل شوم که اتصال با موفقیت انجام می شد اما هنگام بازیابی داده‌ها، آن ها را به صورت علامت سوال نمایش می داد. انکدینگ صفحات طراحی شده utf-8 بود و در هدر فایل ها هم از تگ متا برای تنظیم انکدینگ به utf-8 استفاده کرده بود.
پس از شکست در این روش، با استفاده از کامپوننتی در دلفی، پایگاه داده MSSQL را به Access تبدیل کردم و این بار سایتم را با Access و PHP طراحی کردم. در ابتدا که از انکدینگ utf-8 استفاده می کردم، ظاهر وب سایت را درست نمایش می داد اما داده هایی که بازیابی می شد، فارسی نبود (مربع های مشکی رنگ که احتمالا دوستان با آن آشنا هستند). به پیشنهاد یکی از دوستان، انکدینگ صفحات و همچنین انکدینگ ذخیره آن را به windows-1256 تغییر دادم و تمامی متن های فارسی که در ظاهر سایت استفاده شده بود را نیز تغییر دادم. تا اینجا هم ظاهر وب سایت درست بود هم متنی که بازیابی می شد و من در یک تگ Select نمایش می دهم فارسی بود.
اما زمانی که صفحات طراحی شده و نیز پایگاه داده اکسس خود را به روی هاست منتقل کردم، ظاهر صفحات همچنان فارسی است اما متنی که بازیابی می شود به صورت علامت سوال است.
به نظرتان مشکل از کجاست؟

آیا برای مساله فوق راهکار دیگری پیشنهاد می کنید؟ روش‌هایی که به ذهن خودم رسیده (البته به شرط رفع مشکل فارسی):

1) استفاده از پایگاه داده MSSQL و Sync پایگاه داده لوکال و سرور در صورت نیاز (کد T-SQL مرتبط با آن را یافته ام) سپس طراحی سایت توسط زبان PHP و استفاده از پایگاه داده MSSQL
2) استفاده از پایگاه داده اکسس که از روی پایگاه داده لوکال ایجاد شده و سپس آپلود پایگاه داده تغییر یافته توسط اپراتور به روی سرور. سپس طراحی سایت توسط زبان PHP و استفاده از پایگاه داده اکسس (لطفاً برای استفاده از این روش، نکات امنیتی را گوشزد کنید چون این اولین تجربه من در این کار است - جایی خواندم که یکی از دوستان گفتند باید به روشی از دانلود فایل دیتابیس جلوگیری شود)
3) استفاده از کد SQL که از روی پایگاه داده لوکال ایجاد شده سپس طراحی سایتی برای اجرای کد SQL بر روی پایگاه داده MySQL ایجاد شده بر روی سرور و همچنین طراحی سایتی برای اتصال به MySQL و بازیابی داده ها.

به نظر می رسد روش سوم کمی زمانگیر باشد. ترجیجا در رابطه با روش اول یا دوم دوستان همکاری کنند. علاوه بر اینکه راهکار مشکل فارسی را هم عنوان کنید.

با تشکر و معذرت خواهی بابت طولانی شدن مطلب

Unique
دوشنبه 05 تیر 1391, 04:26 صبح
خوب ، نمیشه در بحث دلفی کار ها شرکت نکرد ! ;)
راستش از این تیپ برنامه ها زیاد نوشتم ! راستش را بخوای بهترین روش این بود که برنامه کلا در وب انجام میشد !! آره تعجب نکن چون در اینجا شما با یک پایگاه در ارتباطی و اطلاعات در یکجا تغییر و به کاربرانی که از روی وب هستند نمایش داده میشه ! خیلی ها ایراد میگیرند اینترنت مشکل داره و سرعتش پایینه و از این حرفا ولی من خودم تجربه اجرای پروژه هایی با انتقال های مالی میلیارد تومانی و ثبت اطلاعات چند صد هزار نفری روی وب داشتم و کارفرما و پرسنلشون هم در ابتدا کمی گلگی میکردند ولی با دیدن مزیت ها و کلا پیشرفت و گسترش اینترنت و ADSL چند سالی هست گلایه ای نداریم ! ;)

اما در مورد کار شما که Desktop انجام شده باید بگم ! اولا شما باید مطمئن باشی که اطلاعات را داری در فرمت مناسب یعنی utf-8 توی دیتابس ذخیره میکنی ! اگه دلفی XE هستش که نباید ANSI باشه ! اما گفتم شاید تنظیمات ویندوزشون را فارسی نکردی و اصلا داری ansi یا به قول خودت windows-1256 کار میکنی !

حالا باید ببینیم این کارفرمای شما میخواد چیکار کنه ! اگه میخواد فقط اطلاعات فیش را شخص ببینه و خدمات دیگه ای وجود نداره ، بهترین کار همون ایده سوم شماست اتفاقا هم از دو روش اول آسون تره ! چون شما لازمه از آخرین اطلاعات ثبت شده یک فایل sql تهیه کنی که شامل آخرین رکورد هاست ! یا حتی میتونه xml یا xls هم باشه که sql روی سرور تولید بشه ! اما اگه sql باشه با mysqli میتونی multi query بگیری و کلی راحت میشی ! اینطوری مهم هم نیست روی وب از چه پایگاهی استفاده میکنی ! mssql یا mysql یا access که البته mysql برای php کاملا توصیه میشه !

در مورد مشکل فارسی شما هم اگه مطمئنی آنچه در پایگاه وب خواهی داشت utf-8 هست ! با ذخیره فایل php در فرمت utf-8 و البته بدون BOM و قرار دادن meta tag مربوط به charset صفحه php در فرمت utf-8 و اگه داری به mysql وصل میشی ! استفاده از تابع mysql_set_charset قطعا نباید مشکلی با نمایش فارسی داشته باشی ! فکر کنم این قسمت مشکل شما به خاطر تجربه کمتر در php باشه ! البته اول از همه چک کن شما واقعا داری Utf-8 توی پایگاه دادت میریزی یا کلا encoding شما چیز دیگه ای هستش !

Mohammad S
دوشنبه 05 تیر 1391, 11:21 صبح
سلام
ممنون از پاسختون.
بله همانطور که فرمودید اگر از ابتدا همه چیز مشخص بود و تحت وب انجام می شد چه بسا بهتر بود اما ...

اگه دلفی XE هستش که نباید ANSI باشه ! اما گفتم شاید تنظیمات ویندوزشون را فارسی نکردی و اصلا داری ansi یا به قول خودت windows-1256 کار میکنی !
تنظیمات ویندوز که فارسی شده و به نظر میرسه از utf-8 استفاده میشه. ولی با این حال به چه روشی میشه بررسی کرد که آیا حتما از utf-8 استفاده شده و Ansi نیست؟


حالا باید ببینیم این کارفرمای شما میخواد چیکار کنه ! اگه میخواد فقط اطلاعات فیش را شخص ببینه و خدمات دیگه ای وجود نداره
کارفرما فقط اطلاعات را می بیند (در واقع اعضا اطلاعات فیش های خود را که پرداخت کرده اند برای اطمینان می بینند. این فیش ها توسط فقط یک اپراتور به صورت لوکال ثبت می شود) و نیازی به تغییر نیست.


بهترین کار همون ایده سوم شماست اتفاقا هم از دو روش اول آسون تره ! چون شما لازمه از آخرین اطلاعات ثبت شده یک فایل sql تهیه کنی که شامل آخرین رکورد هاست !
آخرین رکوردها را چطور میشه مشخص کرد؟ در واقع روش sync میان لوکال (کلاینت) و سرور چیه؟ ترجیحا نیازی به تغییر ساختار دیتابیس لوکال نباشه و روش ساده و سبکی باشه. چیزی که الان به ذهنم میرسه اینه که ID رکوردهایی (از تمام جداول) که روی سرور قرار دارند و در واقع به سرور ارسال شده اند را در سمت کلاینت ذخیره کنم و هر گاه اپراتور خواست تغییرات جدید را به سرور منتقل کند، ID همه رکوردها را با IDهای ذخیره شده در جدول لوکال مقایسه کنم تا آخرین تغییرات مشخص شود. مسلما روش زمانبری است و شاید بهتر باشد از ابتدا همه رکوردهای سرور حذف شود (کل دیتابیس Drop شود و مجددا دیتابیس از ابتدا ایجاد شود). روش دوم مشکل از کار افتادن موقتی سایت را دارد (هر چند سایت مورد نظر ما احتمالاً بازدیدکننده زیادی در طول روز نداشته باشد چون تعداد اعضا حدود 500 نفر است که قطعاً همه آنها با هم وارد سایت ما نخواهند شد).


که البته mysql برای php کاملا توصیه میشه !
خودمم دارم به همین نتیجه میرسم!


البته اول از همه چک کن شما واقعا داری Utf-8 توی پایگاه دادت میریزی یا کلا encoding شما چیز دیگه ای هستش
همانطور که گفتم Collation دیتابیس را روی Arabic_CI_AS یا Persian_100_CI_AI تنظیم کردم اما باز هم همان آش و همان کاسه.
با این تفاسیر، انکودینگ utf-8 در پایگاه داده‌ MSSQL 2008 چیه؟! چنین نوعی نداریم. البته برای ذخیره و کلا نمایش داده ها من از Stored Procedure استفاده کردم اما مثل اینکه خود مایکروسافت عنوان کرده حتماً باید از پیشوند N در جرای پروسیجرهای یونیکد استفاده بشه (اینو دیشب خوندم. برای این کار من از Stored Procedure به صورت پارامتریک در دلفی استفاده کردم و نوع فیلدهای فارسی را هم Widestring قرار دادم مثل این کد:

DM.ADOSP.Parameters.CreateParameter('@P3', ftWideString, pdInput, 30, Edit1.Text);
) و نوع فیلدهای یونیکد هم از نوع nchar, ntext و ... باشه (این مورد را انجام داده ام)
منبع (http://msdn.microsoft.com/en-us/library/ms191313%28v=sql.100%29)
از طرفی مایکروسافت در آدرس دیگری، انکدینگی که MSSQL از آن پشتیبانی می کند را UCS-2 معرفی کرده است که با utf-8 متفاوت است و مثل اینکه باید تبدیل میان آنها صورت گیرد (اگر خود زبان برنامه‌نویسی از آن پشتیبانی نمی کند)
منبع (http://msdn.microsoft.com/en-us/library/ms179342%28v=sql.100%29)

Unique
دوشنبه 05 تیر 1391, 20:09 عصر
در مورد دیتابیس mssql شما همون arabic یا persian را استفاده کنید ! ویندوزی که اپراتور داره باهاش کار میکنه را حتما برای Language for non unicode programs روی فارسی یا persian توی ویندوز 7 باشه ! format را هم که مجبوری روی farsi بگذاری را label ها و عناصر فرم راست به چپ باشند !

در مورد اجرای دستورات sql توی mssql برای فارسی هم بله اگه دارین خطی مینویسین باید قبل از هر quote مربوط به فیلد های فارسی از کاراکتر N استفاده کنید ! اما اگه Parameterized query مینویسین نیازی به این کار نیست !

در مورد sql کردن اطلاعات هم کافیه یک جدول درست کنی و رکورد هایی که update یا insert شدن را فیلد identity اون ها را توی اون جدول قرار بدی (برای delete چون توی این تیپ پروژه ها واقعا رکورد را delete نمیکنیم و با یک flag حذف را انجام میدیم پس نیاز نیست نگران delete باشیم چون یک update خواهد بود اگه هم واقعا delete میکنی میتونی یک فایل بسازی و sql مربوط به حذفیات را توی اون بریزی) حالا زمانی که میخواد اپراتور خروجی بگیره کافیه همون رکورد هایی که تغییر کردن را به ترتیبی که توی جدولت هست براشون sql بسازی ! البته اینجور پیاده سازی ها همیسه دردسر هایی داره ولی اگه واقعا نیاز باشه چاره ای نیست.

میتونی هم برین بهشون Managemnet studio یاد بدین تا خودشون sync کنن !

Mohammad S
دوشنبه 05 تیر 1391, 20:30 عصر
سلام

در مورد دیتابیس mssql شما همون arabic یا persian را استفاده کنید ! ویندوزی که اپراتور داره باهاش کار میکنه را حتما برای Language for non unicode programs روی فارسی یا persian توی ویندوز 7 باشه ! format را هم که مجبوری روی farsi بگذاری را label ها و عناصر فرم راست به چپ باشند !
این مورد انجام شده!


در مورد اجرای دستورات sql توی mssql برای فارسی هم بله اگه دارین خطی مینویسین باید قبل از هر quote مربوط به فیلد های فارسی از کاراکتر N استفاده کنید ! اما اگه Parameterized query مینویسین نیازی به این کار نیست !
این مورد هم انجام شده (به صورت پارامتریک)


در مورد sql کردن اطلاعات هم کافیه یک جدول درست کنی و رکورد هایی که update یا insert شدن را فیلد identity اون ها را توی اون جدول قرار بدی (برای delete چون توی این تیپ پروژه ها واقعا رکورد را delete نمیکنیم و با یک flag حذف را انجام میدیم پس نیاز نیست نگران delete باشیم چون یک update خواهد بود اگه هم واقعا delete میکنی میتونی یک فایل بسازی و sql مربوط به حذفیات را توی اون بریزی) حالا زمانی که میخواد اپراتور خروجی بگیره کافیه همون رکورد هایی که تغییر کردن را به ترتیبی که توی جدولت هست براشون sql بسازی ! البته اینجور پیاده سازی ها همیسه دردسر هایی داره ولی اگه واقعا نیاز باشه چاره ای نیست.
به نظر روش خوبی میاد. امتحان می کنم.


میتونی هم برین بهشون Managemnet studio یاد بدین تا خودشون sync کنن !
با MSSQL هم مشکل علامت سوال داشتم!
در واقع مشکل اصلی من روش sync کردن نیست، بلکه مشکلم نمایش کاراکترها به صورت علامت سوال است که اول باید آن را رفع کنم!

به هر صورت ممنون از پاسختون.

Unique
سه شنبه 06 تیر 1391, 12:08 عصر
میتونی یه export از یکی از جدوالت که میگی در زمان نمایش با php به صورت علامت سوال در میاد برام بفرستی ؟ فرمتش اگه XLS یا CSV باشه خوبه ! یه 100 تا رکورد هم بفرست که بشه درست چکش کرد

Mohammad S
پنج شنبه 08 تیر 1391, 00:55 صبح
میتونی یه export از یکی از جدوالت که میگی در زمان نمایش با php به صورت علامت سوال در میاد برام بفرستی ؟ فرمتش اگه XLS یا CSV باشه خوبه ! یه 100 تا رکورد هم بفرست که بشه درست چکش کرد

ممنون از همکاریتون
براتون فرستادم. رمز فایل را هم از طریق پیام خصوصی براتون فرستادم.
این فایل حاوی 2 فایل اکسل است که یکی را از طریق MSSQL 2008 تبدیل کردم و دیگری را توسط کامپوننتی در دلفی. فایل دوم از نظر حروف درست نمایش داده شده است.
ضمنا فایل اکسسی که تولید کردم هم از طریق همین کامپوننت بود.

راستی این لینک (http://amib.ir/weblog/?p=241) را هم ببیند. به نظر می‌رسد مرتبط باشد، هر چند هنوز دقیق بررسی نکردم.
ممنون

AMIBCT
دوشنبه 12 تیر 1391, 08:36 صبح
اگر از روش انتقال داده‌ها به سرور صرف‌نظر کنیم
برای اینکه بتوانید در سمت سرور به درستی اطلاعات را بازخوانی کنید
دو پیش‌شرط وجود دارد
اول اینکه اطلاعات شما باید به درستی ذخیره شوند( نوع ستون به درستی انتخاب شود )
و دوم اینکه موقع خواندن اطلاعات، تبدیل مناسب در سمت پایگاه داده به انجام برسد

مجموعه‌ی راه‌حلی که می‌توانم به شما پیشنهاد بدهم:
ذخیره‌سازی اطلاعات در MSSQL در ستون‌هایی از نوع NVARCHAR - قرار دادن حرف N پیش از رشته‌های فارسی( یونیکد ) الزامی است
بازخوانی اطلاعات و ذخیره کردن آن‌ها در پایگاه تحت وب MySQL در ستون‌هایی از نوع varchar و فرمت utf-8

تنها بخشی که ممکن است با مشکل مواجه شوید بخشی است که اطلاعات را از MSSQL بازخوانی می‌کنید و می‌خواهید به MySQL ارسال کنید
با هر برنامه یا روشی که این کار را انجام دهید دو نکته وجود دارد
یکی از ویژگی‌های تماس‌های جدید با پایگاه داده، نوع کدگذاری اطلاعات دریافتی و ارسالی است
مثلا می‌توانید مشخص کنید که پایگاه داده اطلاعات را با فرمت utf-8 به شما برگرداند
پس از دریافت اطلاعات از پایگاه داده برای انتقال آن به پایگاه داده‌ی جدید باید نوع ارتباط را در این بخش هم مشخص کنید
اگر اطلاعات شما utf-8 است در این مرحله نیز باید نوع ارتباط را روی utf-8 قرار دهید

با توجه به اینکه روش ارتباط خود با پایگاه داده را مشخص نکرده‌اید دقیق‌تر از این نمی‌توان چیزی گفت

Mohammad S
دوشنبه 12 تیر 1391, 19:53 عصر
با تشکر از پاسخ شما.

ذخیره‌سازی اطلاعات در MSSQL در ستون‌هایی از نوع NVARCHAR - قرار دادن حرف N پیش از رشته‌های فارسی( یونیکد ) الزامی است
این کار انجام شده است. همانطور که در بالا هم گفتم، برای ذخیره، ویرایش، حذف و نمایش داده ها کلا از Stored Procedure استفاده شده است که برای فیلدهای فارسی از نوع WideString (به جای String) استفاده شده است. برای ارسال مقادیر هم از روش پارامتریک استفاده شده است (نمونه کد در چند پست قبل تر نوشته شده است).


تنها بخشی که ممکن است با مشکل مواجه شوید بخشی است که اطلاعات را از MSSQL بازخوانی می‌کنید و می‌خواهید به MySQL ارسال کنید
برای تبدیل از MSSQL به MySQL تنها روشی که به نظرم ساده تر آمد، توسط کامپوننت EMS Advanced Data Export VCL 4.7.0.5 در دلفی و گرفتن خروجی به صورت SQL بود که سپس درون PHP این دستورات Load شوند.


با توجه به اینکه روش ارتباط خود با پایگاه داده را مشخص نکرده‌اید دقیق‌تر از این نمی‌توان چیزی گفت
منظورتان از روش ارتباط در سمت کلاینت است یا سرور؟
در سمت کلاینت درون برنامه دلفی از ابزار ADO.NET استفاده شده است و در سمت سرور و زبان PHP از ODBC و تعریف یک DSN و دستوراتی مثل odbc_connect یا odbc_exec استفاده شده است.

با تشکر

AMIBCT
سه شنبه 13 تیر 1391, 00:11 صبح
با این توضیح احتمالا بخش اول رو درست انجام دادید و اطلاعات به درستی در پایگاه داده ذخیره شده‌اند

در مورد بخش دوم و سوم که انتقال اطلاعات و بازخوانی اون‌ها باشند هنوز ابهام‌هایی وجود داره
اون کامپوننت که می‌گید باید بررسی بشه که آیا اطلاعات یونیکد رو به درستی انتقال می‌ده یا خیر
محتوای ایجاد شده توسط کامپوننت هم باید یونیکد ذخیره شده باشد تا در مقصد به درستی وارد پایگاه داده شود

بعد از اینکه مطئن شدید اطلاعات درست منتقل شده‌اند، برای بازخوانی اطلاعات باید نوع ارتباط با پایگاه داده رو مشخص کنید
یعنی به پایگاه داده بگویید که اطلاعات ارسالی برای برنامه را با فرمت utf8 بفرستد
با انجام این کار خروجی پایگاه داده را مستقیما می‌توانید به مرورگر بفرستید و دیگر نیازی به تبدیل در سمت php نیست

اینکه رابط بین php و پایگاه داده‌ی موردنظر شما چگونه دستور تبدیل نوع را دریافت می‌کند باید در مستندات جستجو شود
مثلا پایگاه MySQL با دستور SET NAMES این کار را می‌کند
یا برای ارتباط با SQL Server از طریق pdo باید دستوری به شکل زیر را فراخوانی کنید

$pdo->setAttribute( PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8 );

Mohammad S
سه شنبه 13 تیر 1391, 00:55 صبح
اون کامپوننت که می‌گید باید بررسی بشه که آیا اطلاعات یونیکد رو به درستی انتقال می‌ده یا خیر
فایل sql که توسط این کامپوننت ایجاد شد را در Notepad++ باز کردم. نوع Encoding آن بر روی utf-8 بود. احتمال می دهم از این روش مشکلم حل شود اما هنوز امتحان نکرده ام.
البته ترجیح می دهم نیازی به تبدیل به MySql نباشد. ضمنا من با PDO کار نکرده ام (در PHP تازه کارم). اگر منبع مناسبی می شناسید که سریعا مرا به مقصد برساند لطفا معرفی کنید.
با تشکر

AMIBCT
سه شنبه 13 تیر 1391, 09:19 صبح
در php هم می‌توانید با SQL Server ارتباط برقرار کنید
ولی به دلایل مختلف اگر بتونید از MySQL استفاده کنید بهتره
از پشتیبانی سرورها گرفته تا سازگاری بیشتر با php

به هر حال
اگر می‌خواهید از SQL Server استفاده کنید درایور SQL Server رو روی php باید نصب کنید
بهترین درایور هم درایور خود مایکروسافت هست که از طریق رابط pdo بهش متصل بشید

راهنمای درایور مایکروسافت توضیحات و مثال‌های کافی رو داره و به راحتی می‌تونید ازش استفاده کنید
قبل از گرفتن اطلاعات هم دستوری رو که در بالا قرار دادم فراخوانی کنید تا نوع ارتباط رو استانداردسازی کنید
بقیه‌اش دیگر مطلب خاصی ندارد و کد نویسی ساده‌ی php است

برای اطلاعات بیشتر در مورد درایور مایکروسافت به این صفحه مراجعه کنید
http://www.microsoft.com/en-us/download/details.aspx?id=20098

البته برای استفاده از این درایور باید از ویندوز استفاده کنید و روی سرور لینوکس نمی‌تونید این کار رو انجام بدید

Mohammad S
چهارشنبه 14 تیر 1391, 02:11 صبح
ولی به دلایل مختلف اگر بتونید از MySQL استفاده کنید بهتره
از پشتیبانی سرورها گرفته تا سازگاری بیشتر با php
خودم هم به همین نتیجه رسیدم.
در پروژه من استفاده از import کدهای SQL روی سرور فکر می کنم خطرات امنیتی زیادی داره و کاربر ممکنه به عمد دستوراتی را روی Database من اجرا کنه. هر چند قسمت لاگین را برای کاربر ادمین در نظر خواهم گرفت.


اگر می‌خواهید از SQL Server استفاده کنید درایور SQL Server رو روی php باید نصب کنید
نصب این درایور در حد کپی کردن چند فایل است یا اینکه مدیر هاست باید این کار را انجام دهد. اگر از اختیارات من نیست، احتمال اینکه مدیر هاست این کار را انجام دهد هم کم است!

باز هم تشکر بابت پاسخگویی.
فعلا کدهای Export شده از MSSQL را از طریق PHPMyAdmin وارد MySQL کردم و روی سیستم خودم فارسی ها را درست نشان می دهد. هنوز سایت خود را به هاست منتقل نکرده ام. ضمن اینکه با روش معرفی شده در پست زیر (http://barnamenevis.org/showthread.php?337421-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-%D8%A7%DB%8C%D9%85%D9%BE%D9%88%D8%B1%D8%AA-SQL) در ابتدا موفق به import کردن دستورات نشدم اما زمانی که فایل را با فرمت UTF-8 Without BOM ذخیره کردم، مشکلم حل شد.

باز هم ممنون

Mohammad S
پنج شنبه 15 تیر 1391, 19:58 عصر
متأسفانه باز هم وقتی فایل‌ها با پایگاه داده MySQL را به روی هاست منتقل کردم، هنوز به صورت علامت سوال ظاهر می شود. جالب اینجاست که بر روی سیستم خودم هیچ مشکلی ندارد و فقط زمانی که به روی هاست منتقل می‌شود، ایجاد مشکل می‌کند.
هاستی که استفاده می‌کنم Plesk 10.4.4 است. آیا نیاز است تنظیماتی بر روی سرور انجام شود که در اختیار من باشد؟
ضمنا دستوری که با آن بتوانم نوع collation پایگاه داده‌ها بر روی سرور را تنظیم کند چیست؟ آیا تنها استفاده از دستور زیر کافی است؟

mysql_set_charset('utf8');

Unique
جمعه 16 تیر 1391, 01:21 صبح
شرمنده ! من خیلی دیر جواب شما را میدم ! اما خدایی سرم شلوغ بوده !
دوست عزیز ! من فایل هایی که برام ارسال کردین را چک کردم ! و خروجی شما مشکلی نداره ! درواقع utf-8 هست ! من دنبال یک راهی بودم که براتون یک نمونه کد بفرستم ! یاد sqlite افتادم ! در یک لحظه به فکرم رسید بهتون پیشنهاد کنم ! از فکر انتقال اطلاعات روی mysql یا mssql توی هاست بیاین بیرون ! و اون چیز هایی که میخواین بفرستین روی سایت را توی یک فایل sqlite بریزین و در زمان ارسال روی هاست با zip کردنش و یک ftp خیلی ساده ! اطلاعات جدید را روی سایت بگذارین. من این کار را برای چند صد هزار رکورد هم انجام دادم و خوب کار میکنه ! یک نمونه بازیابی اطلاعات خودتون که توی یک فایل sqlite ریخته شده attach میکنم و کلمه عبورش را براتون خصوصی میفرستم ! امیدوارم مشکلتون حل بشه ! ولی مطمئن هستم که شما در بخش استفاده php برای نمایش مشکل داری و اطلاعاتتون مشکلی نداره ! چند درضد هم ممکنه زمانی که اطلاعات را به sql تبدیل میکنید ! فایل sql را با فرمت نا مناسب ایجاد میکنید و اطلاعاتتون از utf-8 درمیاد !

کمی با حوصله اگه باهاش کار کنین قطعا راه میفته !

Mohammad S
جمعه 16 تیر 1391, 18:04 عصر
شرمنده ! من خیلی دیر جواب شما را میدم ! اما خدایی سرم شلوغ بوده !
دوست عزیز ! من فایل هایی که برام ارسال کردین را چک کردم ! و خروجی شما مشکلی نداره ! درواقع utf-8 هست ! من دنبال یک راهی بودم که براتون یک نمونه کد بفرستم ! یاد sqlite افتادم ! در یک لحظه به فکرم رسید بهتون پیشنهاد کنم ! از فکر انتقال اطلاعات روی mysql یا mssql توی هاست بیاین بیرون ! و اون چیز هایی که میخواین بفرستین روی سایت را توی یک فایل sqlite بریزین و در زمان ارسال روی هاست با zip کردنش و یک ftp خیلی ساده ! اطلاعات جدید را روی سایت بگذارین. من این کار را برای چند صد هزار رکورد هم انجام دادم و خوب کار میکنه ! یک نمونه بازیابی اطلاعات خودتون که توی یک فایل sqlite ریخته شده attach میکنم و کلمه عبورش را براتون خصوصی میفرستم ! امیدوارم مشکلتون حل بشه ! ولی مطمئن هستم که شما در بخش استفاده php برای نمایش مشکل داری و اطلاعاتتون مشکلی نداره ! چند درضد هم ممکنه زمانی که اطلاعات را به sql تبدیل میکنید ! فایل sql را با فرمت نا مناسب ایجاد میکنید و اطلاعاتتون از utf-8 درمیاد !

کمی با حوصله اگه باهاش کار کنین قطعا راه میفته !

سلام
ممنون از اینکه وقت گذاشتید.
حتما بررسی می کنم و اطلاع میدم.
اما در رابطه با نوع ارتباط دیگه نمی دونم چه کاری باید انجام بدم که ندادم. در واقع احساس می کنم مشکل از کدنویسی نیست بلکه مشکل از سمت سرور است!
به هر صورت من کدهای خود را برایتان ارسال می کنم تا بررسی کنید. شاید چیزی از دید من مخفی مانده اما شما بهتر متوجه شوید.
همانطور که گفتم روی سیستم خودم مشکلی ندارم. مشکل دقیقا از زمانی شروع می شود که داده ها را به هاست منتقل می‌کنم!!
ممنون

Mohammad S
چهارشنبه 25 مرداد 1391, 01:19 صبح
با سلام
همانطور که حدس می زدم:

اما در رابطه با نوع ارتباط دیگه نمی دونم چه کاری باید انجام بدم که ندادم. در واقع احساس می کنم مشکل از کدنویسی نیست بلکه مشکل از سمت سرور است!
مشکل از سمت هاست بود. در واقع چون هاستم از نوع پلسک بود، به صورت پیش فرض امکان تغییر Collation پایگاه داده را نمی داد و نوع Collation پایگاه داده ای که خودش می ساخت چیزی به غیر از UTF-8 بود که بالاخره با نصب PHPMyAdmin بر روی هاستم، موفق شدم نوع دیتابیس را تغییر داده و مشکلم را حل کنم.
همانطور که گفتم مشکلی از بابت کد نویسی نداشتم.
این پست را از این بابت قرار دادم که دوستان دیگری اگر مشکل مرا داشتند، مسأله Collation را هم مد نظر داشته باشند.

با تشکر از همه دوستان که برای حل مشکلم وقت گذاشتند.