PDA

View Full Version : سوال: پرسشهای تکراری



MMSHFE
شنبه 28 مرداد 1391, 00:30 صبح
این تاپیک محل جمع آوری پرسشهایی هست که بارها مطرح شده و به جواب نهایی هم رسیده اما باز هم برای خیلیها (بخصوص تازه کارها) بروز میکنه. بنابراین، از همه کاربران محترم صمیمانه تقاضا میکنم قبل از هرگونه طرح سؤال و ایجاد تاپیک، این تاپیک رو بطور کامل مطالعه کنند. ضمناً برای اینکه تاپیک شلوغ و انباشته از نقل قولها و پاسخها و بحثهای بیهوده نشه، تاپیک قفل میشه و توسط مدیریت بروز رسانی خواهد شد. بنابراین، اگه سؤال خاصی مدنظرتون هست که به نظرتون لازمه اینجا باشه، با (یا بدون) پاسخ اون برام بصورت پیام مستقیم بفرستید تا بعد از بررسی و ایجاد ساختار مناسب و منظم برای اون، با اسم خودتون توی این تاپیک قرار بگیره.
برای راحتی بیشتر، به پیشنهاد یکی از دوستان (http://barnamenevis.org/member.php?62454-farhadfery) فهرست مطالب این تاپیک توی همین پاسخ شماره 1 قرار خواهد گرفت تا به راحتی بتونید با کلیک روی هر موضوع، مستقیماً به سراغش برین.
رفع مشکل نمایش پیغام Cannot modify header information – headers already sent (http://barnamenevis.org/showthread.php?356992-%D9%BE%D8%B1%D8%B3%D8%B4%D9%87%D8%A7%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C&p=1576420&viewfull=1#post1576420)
رفع مشکل نمایش/ذخیره بهم ریخته حروف فارسی در Database (http://barnamenevis.org/showthread.php?356992-%D9%BE%D8%B1%D8%B3%D8%B4%D9%87%D8%A7%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C&p=1576424&viewfull=1#post1576424)
رفع مشکل «آیکن ومپ من نارنجیه / Apache شروع به کار نمیکنه» (http://barnamenevis.org/showthread.php?356992-%D9%BE%D8%B1%D8%B3%D8%B4%D9%87%D8%A7%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C&p=1718061&viewfull=1#post1718061)
موفق باشید.

MMSHFE
سه شنبه 31 مرداد 1391, 21:59 عصر
رفع مشکل نمایش پیغام Cannot modify header information – headers already sent
همونطور که احتمالاً میدونید، هر چیزی توی شبکه (اعم از فایل و هرگونه داده دیگه) بصورت بسته های اطلاعات مبادله میشه و هر بسته دو قسمت header و data داره که قسمت header اطلاعاتی درباره data ارائه میده (مثل اندازه و نوع کدگذاری و...) بنابراین گیرنده باید قبل از دریافت data اطلاعات header رو دریافت کنه. به عبارت دیگه، اگه data دریافت بشه، دیگه نمیشه header رو تغییر داد و هرگونه تغییر روی header باید قبل از ارسال data انجام بشه و اگه کوچکترین اطلاعاتی از بخش data دریافت شده باشه، دیگه نمیشه header رو تغییر داد. تا اینجا رو گفتم که بدونید header اصلاً چی هست.
برخی از توابع PHP مثل setcookie و header و... مستقیماً اطلاعات header رو تنظیم میکنن. مثلاً کوکیها ازطریق بخش header ارسال میشن تا وقتی که data دریافت شد، اطلاعات کوکی قبلش در اختیار سرور قرار گرفته باشه و بتونیم توی اسکریپت ازش استفاده کنیم. فایلهای متنی که اسکریپتها رو توشون مینویسیم، با کدگذاریهای مختلفی قابل ذخیره سازی هستن (مثل ANSI و UTF-8 و...) و نوع کدگذاری هم خیلی اهمیت داره چون اگه کدگذاری درست رو رعایت نکنیم، کارکترها (بخصوص حروف فارسی که Unicode هستن) به درستی به نمایش در نمیان. کدگذاری استاندارد برای حروف فارسی UTF-8 هست اما این کدگذاری یک مشکل داره و اون هم اینه که سه بایت در اول فایلهایی که با کدگذاری UTF-8 ذخیره میشن اضافه میشه که بهشون میگیم Byte Order Mark یا به اختصار BOM
حالا این BOM کارش چیه؟ خیلی ساده: تند تند قبل از data اصلی خودش رو به گیرنده میرسونه و میگه: حواست باشه، اطلاعاتی که داره میاد، Unicode هست و کارکترهاش دوبایتی هستن نه یک بایتی. مشکلی که این روش داره اینه که درسته BOM قبل از data اصلی هست اما درهرحال جزو بخش data بسته اطلاعاتی محسوب میشه نه header و درنتیجه چون BOM دریافت شده، دیگه نمیشه header رو تغییر داد. برای رفع این مشکل، یک نوع کدگذاری جدیدتر به نام UTF-8 without BOM اختراع شده که BOM رو حذف کرده و درعوض گیرنده ها کمی پیشرفت کردن و الگوی کدگذاری رو از ابتدای قسمت data میخونن (هدر خود فایل که توی بخش data قرار داره نه header بسته اطلاعاتی). بنابراین، با استفاده از این روش، عملاً دیگه نیازی به BOM نخواهیم داشت.
خوب همه اینها رو گفتیم که چی بشه؟ خب معلومه دیگه، اگه میخواین با پیغام خطای فوق مواجه نشین، فایلهاتون رو با یک ادیتور خوب و با کدگذاری UTF-8 without BOM ذخیره کنید. ادیتورهایی مثل phpDesigner و ++Notepad و RapidPHP و DreamWeaver مناسب هستن. ادیتورهای دیگه هم هستن ولی اینهایی که گفتم کاربرد بیشتری دارن. به هیچ عنوان از Notepad ویندوز بعنوان ادیتور اسکریپتهاتون استفاده نکنید چون شعورش در حدی نیست که UTF-8 without BOM رو بشناسه. حتی اگه فایلی داشته باشین که UTF-8 without BOM باشه و با Notepad بازش کنید و بعد از انجام تغییرات دلخواه (یا حتی بدون اعمال کوچکترین تغییری) فایل رو توی Notepad دوباره Save کنید، کدگذاری فایل به UTF-8 معمولی برمیگرده و دوباره روز از نو روزی از نو. پس حواستون باشه اگه زمانی فایلتون رو با Notepad ویرایش کردین و به این مشکل برخوردین، نترسین، کافیه دوباره با ++Notepad یا یکی دیگه از ادیتورهایی که گفتم، فایل رو با کدگذاری UTF-8 without BOM ذخیره کنید.

MMSHFE
سه شنبه 31 مرداد 1391, 22:16 عصر
رفع مشکل نمایش/ذخیره بهم ریخته حروف فارسی در Database
علت اصلی این مشکل اینه که کدگذاری صفحه ای که اطلاعات رو از دیتابیس میخونه یا توی دیتابیس ذخیره میکنه، با کدگذاری خود دیتابیس سازگار نیست. البته عوامل دیگری هم اینجا نقش دارن. مثلاً ممکنه نوع کدگذاری مناسب برای ذخیره حروف فارسی توی دیتابیس انتخاب نشده باشه. اما راه حل قطعی و نهایی رفع این مشکل چیه؟ مراحل زیر رو انجام بدین تا به مشکل بر نخورین:

1- موقع ساخت جداول توی دیتابیس، نوع Collation رو روی utf8_bin یا utf8_persian_ci ذخیره کنید. اولی برای وقتی خوبه که بخواین بتونین علاوه بر حروف فارسی، تمام حروف Unicode رو توی دیتابیس ذخیره کنید (مثل حروف چینی و هندی و...) و دومی مخصوص زبان فارسی هست و بقیه کارکترهای Unicode رو پشتیبانی نمیکنه. تفاوت دیگه این دو مورد اینه که اولی Case Sensitive هست و دومی نه! یعنی چی؟ یعنی اینکه utf8_bin به بزرگی و کوچکی حروف حساسه و مثلاً موقع جستجو توی دیتابیس، ALI با ali فرق میکنه اما دومی اینطور نیست و از نظر اون، ALI و ali و aLi و... همه با هم یکی هستن. به عبارت دیگه، utf8_persian_ci همونطور که پسوند آخرش میگه، Case Insensitive هست (یعنی غیر حساس به بزرگی و کوچکی حروف). ازطرفی utf8_persian_ci تنها کدگذاری هست که حروف فارسی رو درست مرتب میکنه و برای مثال، پ بعد از ی نمیاد (با تشکر از دوستم rezakho (http://barnamenevis.org/member.php?174696-rezakho) بابت یادآوری این مطلب)

2- توی صفحه وبتون یکی از این دو کد رو بگذارین:
اگه از HTML4 استفاده میکنید:

<meta http-equiv="content-type" content="text/html; charset=utf-8"/>و اگه از HTML5 استفاده میکنید:

<meta charset="utf-8"/>3- صفحه رو با یک ادیتور خوب مثل ++Notepad و... با کدگذاری UTF-8 without BOM ذخیره کنید.

4- بعد از اتصال به دیتابیس (یعنی بعد از دستورات mysql_connect و mysql_select_db) این دستور رو بنویسید:

mysql_query('SET NAMES \'utf8\'');
این دستور به موتور MySQL میگه که اطلاعات مبادله شده بین موتور MySQL و مفسر PHP از کدگذاری Unicode استفاده میکنن. اگه این دستور رو نگذارین، شاهد کارکترهای عجیب و غریب بجای حروف فارسی خواهید بود و اگه خیلی شانس بیارین، یکسری مربع یا علامت سؤال ? بجای حروف فارسی میبینید.

5- این مورد در اصل برای رفع مشکل نمایش درست حروف فارسی نیست و با رعایت همون 4 مورد بالا، مشکل فوق رفع میشه. این مورد پنجم برای مواقعی هست که بخواین با کمک توابعی مثل mysql_real_escape_string جلوی حمله های SQL Injection رو به سایتتون بگیرین. در اینگونه موارد باید دقت کنید که دستور 'SET NAMES 'utf8 توی MySQL که توی مرحله قبلی با کمک تابع mysql_query اجراش میکنید، فقط نوع کدگذاری اطلاعات مبادله شده بین موتور MySQL و مفسر PHP رو مشخص میکنه و کدگذاری عملیاتی MySQL رو تغییر نمیده. برای مثال، تابعی مثل mysql_real_escape_string که عمل خنثی کردن کدهای خطرناک (Escapeکردن) رو انجام میده، کماکان از کدگذاری استاندارد یعنی iso-8859-1 استفاده میکنه. درنتیجه، چون حروف فارسی Unicode توی این کدگذاری مشخص نشده، اونها رو بعنوان کد مخرب میشناسه و از توی رشته ای که بعنوان پارامتر برای تابع مذکور فرستادیم، حذف میکنه. برای رفع این مشکل، همونطور که احتمالاً حدس زدین، باید کدگذاری عملیاتی MySQL رو عوض کنیم که این کار به راحتی با دستور زیر انجام میشه (کافیه این دستور رو بعد از دستور مرحله 4 بنویسین) :

mysql_set_charset('utf8');

MMSHFE
جمعه 18 اسفند 1391, 12:00 عصر
رفع مشکل «آیکن ومپ من نارنجیه / Apache شروع به کار نمیکنه»
دیدم چند وقتیه گزارش اینجور مشکلات زیاد شده. برای حل مشکل راه حل قطعی زیر رو اجرا کنید:
1- همیشه آخرین نسخه نرم افزار رو نصب کنید. برای مثال، برحسب نوع سیستم عاملتون، یکی از نسخه های 32 بیتی یا 64 بیتی WAMP Server رو از لینک زیر دانلود کنید:
Wamp Server 2.4e 32 Bits
(http://www.ncis.ir/articles/12/WS2.4%20x86) Wamp Server 2.4e 64 Bits
(http://www.ncis.ir/articles/13/WS2.4%20x64) 2- بعد از نصب، اگه دیدین آیکن برنامه نارنجیه، از منوی Wamp گزینه Apache و بعد Service و بعد Test Port 80 رو اجرا کنید. اگه پیغام خطایی دیدین که توش نوشته Microsoft HTTPAPI/2.0 پورت 80 رو گرفته، از Control Panel ویندوز، گزینه Administrative Tools و بعد Services رو انتخاب کنید. حالا اگه ویندوز شما XP هست، دنبال IIS Admin و اگه ویندوز شما 7 هست، دنبال Internet Information Services بگردین و روش دوبار کلیک کنید و Stop رو بزنید و بعد، از قسمت Startup Type هم گزینه Disabled رو انتخاب کنید تا با Restartشدن سیستم، دوباره سروکله این مزاحما پیدا نشه. ضمناً توی هر دو نسخه ویندوز هم دنبال Web Deployment Service و World Wide Web Publishing بگردین و اگه پیداش کردین، همون بلایی که سر IIS آوردین، سر اونها هم بیارین.
3- WAMP (یا هر برنامه مشابه دیگه مثل XAMPP و...) که نصب کردین رو حذف کنید و پوشه اون رو هم (مثلاً C:\wamp) بصورت دستی و کامل پاک کنید و بعد دوباره نصب کنید.
4- اگه موقع نصب، پیغام خطا برای فایل msvcr100.dll مشاهده کردین، فایل ضمیمه رو دریافت کنید و از حالت فشرده خارج کنید و فایل dll رو توی پوشه System32 (برای ویندوزهای 32بیتی) ی SysWOW64 (برای ویندوزهای 64بیتی) در داخل پوشه ویندوز خودتون کپی کنید و دوباره برنامه رو نصب کنید. اگه باز هم خطا داد، مطابق فایل readme.txt همراه فایل dll عمل کنید تا فایل dll رو به سیستم به کمک دستور regsvr32 بشناسونید!
5- اگه با انجام تمام مراحل بالا باز هم مشکل رفع نشد، به احتمال زیاد یک برنامه سمج دارین که پورت 80 رو گرفته. خیلی برنامه ها از این پورت خوششون میاد. مثلاً Skype و TeamViewer هم از این پورت برای انتقال استفاده میکنن. باید تنظیمات اونها رو عوض کنید:
TeamViewer مسیر (Extras -> Options -> Advanced -> Show advanced options -> Advanced network settings -> Don't use incoming port (80
Skype مسیر (Tools -> Connection options -> Use Port 80 and 443 as alternatives for incoming connections (enabled
بقیه برنامه ها هم هرکدوم تنظیمات خودشون رو دارن.
6- اگه باز هم جواب نداد یا کلاً نخواستین تنظیمات بقیه برنامه ها رو عوض کنید، میتونید از Apache بخواین از یک پورت دیگه استفاده کنه. برای این کار، روی آیکن Wamp کلیک کنید و از منوی Apache گزینه httpd.conf رو انتخاب کنید و دنبال خطوط زیر بگردین:
Listen 80
ServerName localhost:80
و بجای عدد 80 توی هر دو خط، عدد دیگری (مثلاً 8080) بگذارین و فایل رو Save کنید و دوباره Wamp رو نصب کنید یا از منوی Wamp گزینه Restart All Services رو انتخاب کنید.
فقط یادتون باشه که چون پورت پیشفرض توی پروتکل HTTP پورت 80 هست و Apache الآن دیگه از پورت پیشفرض استفاده نمیکنه، باید بعد از اسم localhost حتماً عددی که برای پورت توی httpd.conf گذاشتین رو بهمراه : بنویسید. مثلاً بنویسید localhost:8080 یا مثلاً localhost:8080/mysite/index.php
7- راه نهایی که پیشنهاد میکنم همون اول سراغش برین، نصب VirtualBOX (https://www.virtualbox.org/wiki/Downloads) و بعد، ساخت یک سیستم مجازی و نصب Linux (http://www.ubuntu.com/download/desktop) رو اون و نصب راحت و بی دردسر پکیج AMP هست که در کنار خود لینوکس، به ترکیب فوق العاده LAMP دسترسی پیدا خواهید کرد و اینهمه مشکلات ویندوز رو نمیخواد تجربه کنید.