article

آموزش MySQL، سیستم مدیریت پایگاه داده

mysql

ذخیره اطلاعات به صورت دسته بندی شده و دسترسی سریع به آنها ضرورتی بود که باعث ایجاد سیستم های مدیریت پایگاه داده رابطه ای (Relational Database Management System یا به اختصار RDBMS) در دنیای برنامه نویسی و به تبع برنامه نویسی وب شد، اگر یک برنامه نویس PHP باشیم و بخواهیم به طور مثال سرویس فرهنگ لغات آنلاین طراحی کنیم، قاعدتا اولین مشکلی که با آن روبرو خواهیم شد این است که لغات را در کجا ذخیره و چگونه آنها را فراخوانی کنیم، چگونه کلمه مورد نظر کاربر را از بین کلمات موجود جستجو کرده و نتیجه را پس از پردازش به صفحه مرورگر ارسال نمائیم و سوالاتی از این دست، لذا ناگزیر بحث استفاده از یک سیستم مدیریت پایگاه داده جهت ذخیره، جستجو، انتخاب، ویرایش و حذف اطلاعات مطرح می شود که در وب و بخصوص برای برنامه نویسان PHP اولین و شاید بهترین انتخاب MySQL باشد، اینکه چرا و چگونه از MySQL در کدنویسی PHP خود استفاده کنیم، مبحثی است که در سلسله آموزش های مقدماتی پیش رو به آن خواهیم پرداخت.

MySQL چیست و چه کاربردی دارد؟


قبل از هر چیز بهتر است به این سوال پاسخ دهیم که MySQL چیست و چه کاربردی دارد؟ در پاسخ می توان گفت که MySQL یکی از پرکاربردترین سیستم های متن باز (Open-source) مدیریت پایگاه داده است که توسط شرکت سوئدی MySQL AB ایجاد و اولین نسخه آن در سال 1995 معرفی شد (مالکیت شرکت MySQL AB در حال حاضر در اختیار شرکت Oracle است)، SQL در واقع زبانی است که برای استفاده در سیستم های مدیریت پایگاه داده رابطه ای (RDBMS) طراحی شده و عبارت MySQL اشاره به این زبان دارد، در واقع MySQL برای اجرای دستورات ما مانند دستور ساخت جدول، ذخیره، جستجو، انتخاب، ویرایش و حذف اطلاعات از زبان SQL استفاده می کند و لذا آشنایی قبلی با SQL می تواند فراگیری کار با MySQL را بیش از پیش ساده کند، از آنجایی که این سیستم مدیریت پایگاه داده جزئی از خانواده موسوم به LAMP (مخفف Linux, Apache, MySQL, Perl/PHP/Python) است لذا بیشترین سازگاری و کارایی را در این حیطه دارد و انتخاب اول برنامه نویسان PHP به حساب می آید، با MySQL می توانیم اطلاعات مورد نظر را در دیتابیسی که در سرور ایجاد می کنیم ذخیره کرده آنها را بر طبق اهداف برنامه به صورت حرفه ای دسته بندی و هر زمان نیاز بود در اطلاعات جستجو نموده و مقادیر دلخواه را استخراج نمائیم، این قابلیت ها برای طراحی برنامه های داینامیک وب جزء ملزومات اولیه هستند و MySQL به خوبی این نیازها را پوشش می دهد، استفاده سایت های معروفی مانند Google، Facebook، Twitter، Flicker و YouTube از این پایگاه داده نشان دهنده حرفه ای و کارآمد بودن آن است.

ساختار کلی و نحوه دسته بندی اطلاعات در پایگاه داده


همان طور که اشاره شد پایگاه داده جزء کلیدی در برنامه های کاربردی تحت وب محسوب می شود و لذا شناخت ساختار کلی و نحوه دسته بندی اطلاعات در آن اهمیت ویژه ای دارد، در MySQL هر پایگاه داده (Database) یک نام بخصوص دارد و حداقل از یک جدول (Table) اطلاعاتی تشکیل شده است، جداول نیز خود شامل زیر مجموعه هایی هستند که به آنها ستون (Column) می گویند که سطرح های اطلاعات (Rows) را در خود جای می دهند، به طور مثال دیتابیس زبان های برنامه نویسی می تواند شامل جدول برنامه نویسی دسکتاپ، برنامه نویسی موبایل و برنامه نویسی وب باشد، به همین صورت هر جدول می تواند شامل ستون (Column) و سطرها (Rows) باشد، سطرح ها در واقع همان ردیف های اطلاعات هستند که در جدول برای هر ستون ذخیره می شوند (تصویر زیر):
MySQL Database Structure
در نمونه ساختار فوق programming نام دیتابیس، desktop نام جدول و id، name و status ستون های دیتابیس هستند که سطرح های اطلاعاتی را شامل می شوند (نام دیتابیس، جدول و ستون ها در مثال فرضی و به تعداد دلخواه می باشند).

مدیریت پایگاه داده MySQL با phpMyAdmin


برنامه نویسان PHP معمولا از دو طریق می توانند به سیستم مدیریت پایگاه داده MySQL دسترسی داشته باشند، با استفاده از برنامه phpMyAdmin و همچنین با کدنویسی PHP، برنامه phpMyAdmin جهت مدیریت به اصطلاح دستی MySQL و اعمال تغییراتی مانند ساخت پایگاه داده جدید، ساخت جداول، ستون ها، تغییر ویژگی های جداول و ستون ها و مواردی از این دست کاربرد دارد و تقریبا هر کاربری با هر سطح از آشنایی با برنامه نویسی می تواند با محیط آن ارتباط برقرار کرده و نیازهای خود را مرتفع کند، phpMyAdmin در واقع برنامه ای نوشته شده به PHP با هدف مدیریت پایگاه داده با استفاده از رابط کاربری ساده و تحت مرورگر است تا هم انجام موارد اولیه، برپایی پایگاه داده و اعمال تغییرات بعدی در آن آسان و روند کار تسریع شود و هم کاربران مختلف با هر سطح از آشنایی با PHP بتوانند بدون دغدغه و احیانا نگرانی از سردرگمی، با محیط MySQL ارتباط برقرار کنند، به هر صورت برای آشنایی بیشتر می توانیم به سایت مرجع این برنامه مراجعه کنیم:
https://www.phpmyadmin.net
همچنین می توانیم با پیش نمایشی از این برنامه در آدرس زیر کار کنیم که برای شروع امکان بسیار خوبی است:
https://demo.phpmyadmin.net/master-config
یادآور می شویم که این برنامه معمولا به صورت از پیش نصب شده در سرورهای لینوکس یا برنامه های سرور مجازی (Localhost) وجود دارد و کافی است از پنل مدیریت هاست سایت یا از طریق آدرس 
localhost/phpmyadmin
در لوکال به آن دسترسی پیدا کنیم، در برنامه های سرور مجازی معمولا با نام کاربری root و بدون پسورد می توانیم وارد محیط برنامه phpMyAdmin شویم.

ارتباط PHP با پایگاه داده MySQL


همان طور که اشاره شد با کدنویسی PHP می توانیم به پایگاه داده MySQL دسترسی داشته و بین کدهای PHP با سیستم مدیریت پایگاه داده MySQL ارتباط برقرار کنیم، این قابلیت باعث می شود بتوانیم برنامه های حرفه ای تحت وب که معمولا نیازمند نگهداری داده ها در یک بانک اطلاعاتی مطمئن هستند را طراحی و عملیاتی از قبیل ذخیره سازی، دسته بندی، جستجو، انتخاب، ویرایش و حذف ردیف ها را به صورت سیستماتیک و با کمک دستورات برنامه نویسی انجام دهیم، به طور مثال کاربر می تواند در فیلد جستجوی برنامه تحت وب عبارت مورد نظر خود را وارد کرده و ما با دستورات PHP به MySQL می گوییم که ردیف های متناسب با کلمه درخواستی کاربر را انتخاب و به عنوان نتیجه به مفسر PHP برگرداند، در ادامه نتیجه دریافتی را با کدنویسی PHP تجزیه تحلیل نموده و خروجی نهایی را مطابق هدف برنامه به کاربر نشان دهیم، این ارتباط با کمک برنامه هایی تحت عنوان اکستنشن (Extension) صورت می گیرد، اکستنش ها در واقع بسته های نرم افزاری هستند که به هسته PHP امکان انجام عملیات های خاص مانند اتصال و مدیریت پایگاه داده را می دهند، در PHP برای این منظور پیشتر از اکستنشن قدیمی MySQL استفاده می شد که در نسخه 7 PHP منسوخ و به صورت پیش فرض حذف شده است و توصیه می شود برای برنامه های جدید اکستنشن MySQLi یا PDO را جایگزین آن نمائیم.
نکته: سیستم مدیریت پایگاه داده MySQL با اکستنشن MySQL دو عبارت مجزا هستند!
       PHP <===> MySQL
- MySQL (Deprecated - منسوخ شده)
- MySQLi (Recommended - توصیه شده)
- PDO (Recommended - توصیه شده)

چرا از اکستنشن MySQLi یا PDO استفاده کنیم؟


اکستنشن MySQLi (حرف i پایانی مخفف improved) نسخه بهبود یافته از اکستنشن MySQL بوده و شیوه نگارش دستورات آن در حالت برنامه نویسی رویه ای شباهت زیادی به شیوه نگارش دستورات MySQL دارد، همچنین MySQLi اکستنشن اختصاصی PHP برای کار با سیستم مدیریت پایگاه داده MySQL بوده و بیشترین سازگاری را با امکانات آن دارد، با توجه به این دلایل در آموزش های پیش رو از این اکستنشن در مثال ها استفاده خواهیم کرد، PDO (مخفف PHP Data Objects) اکستنشن دیگری است که می تواند جایگزین MySQL شود، PDO اکستنشن غیراختصاصی PHP برای کار با پایگاه داده و از جمله پایگاه داده MySQL است، این اکستنشن در مقایسه با MySQLi سازگاری کمتری با امکانات سیستم مدیریت پایگاه داده MySQL دارد اما به لحاظ حجم کم (Lightweight)، حرفه ای بودن و امکان کار با سیستم های مختلف پایگاه داده می تواند در برنامه های تحت وب گزینه مناسبی باشد، توسعه دهندگان PHP در نسخه های جدید استفاده از اکستنشن MySQL را توصیه نمی کنند و آن را به حالت Deprecated درآورده اند که یعنی استفاده از آن توصیه نمی شود و حتی از نسخه PHP 7 به بعد دیگر این اکستنشن در مفسر PHP به صورت پیش فرض وجود ندارد، دلیل این موضوع رشد امکانات و قابلیت های PHP در طی سالیان گذشته و قدیمی شدن اکستنشن MySQL در طی این فرآیند است، همچنین قابلیت های زیادی به سیستم مدیریت پایگاه داده MySQL اضافه شده است که با اکستنشن قدیمی MySQL امکان استفاده بهینه از آنها وجود ندارد، به طور مثال در بخش حفظ امنیت برنامه های نوشته شده به زبان PHP استفاده از این اکستنشن باید با دقت و تسلط کافی صورت گیرد تا با حملات موسوم به SQL Injection روبرو نشویم که این با هدف استفاده همگان از PHP در تضاد است و در اکستنشن های جدید (MySQLi و PDO) امنیت کدهای PHP به شکل محسوسی بهبود یافته، همچنین نگهداری فنی و ایجاد تغییرات بعدی در برنامه های نوشته شده با اکستنشن MySQL در مقایسه با اکستنشن های جدید به نسبت زمانبر و حساستر است.
نکته: در طراحی ساختار برنامه ها می توانیم با جدا کردن بخش اجرای پرس و جوهای دیتابیس، امکانی در نظر بگیریم که کاربر به دلخواه خود اکستنشن مورد نظر را انتخاب کند، قاعدتا این کار صرفا جنبه تزئینی ندارد و در مواردی که یک اکستشن به هر دلیل کارایی ندارد می تواند راهگشا باشد.

پشتیبانی MySQLi از برنامه نویسی رویه ای و شی گرا


اکستنشن MySQLi از دو شیوه برنامه نویسی رویه ای (Procedural) و شی گرا (Object-oriented) پشتیبانی می کند، در این سری از آموزش ها نمونه کدها هم به شیوه رویه ای و هم به شیوه شی گرا ارائه می شوند، یادآور می شویم که دو روش در عمل کارکرد مشابه دارند و تفاوت در نحوه کدنویسی و مدیریت ساختار برنامه است، هرچند بحث در مورد تفاوت برنامه نویسی رویه ای و شی گرا باید در جای خود بررسی شود اما در یک تحلیل ساده معمولا از کدنویسی رویه ای برای نوشتن برنامه ها و پروژه های کوچک به عنوان روش به اصطلاح دم دستی استفاده می شود و برنامه نویسی شی گرا برای ایجاد ساختارهای پیچیده تر و نوشتن برنامه هایی با جزئیات بیشتر کاربرد دارد، خوشبختانه PHP در این زمینه سخاوتمند است و حق انتخاب را به کاربران می دهد، توصیه ما این است که ضمن فراگیری روش رویه ای به عنوان شیوه پایه و مقدماتی، پروژه های کاربردی و پر جزئیات خود را به روش شی گرا (OOP یا Object-oriented programming) بنویسیم.
sectionدسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
» توابع تجمعی (Aggregate Functions) در MySQL
» انتخاب ردیف ها با دستور SELECT در MySQL
» به روز رسانی ردیف ها در MySQL با UPDATE
» استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL
» ساخت دیتابیس، جدول و ستون با دستور CREATE در MySQL
commentنظرات (۶۸ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: امیرحسین
۱۳:۳۹ ۱۳۹۶/۰۶/۱۲
سلام استاد عزیز
در مورد سوال قبلی ممنون از راهنمایی هاتون استفاده کردم
یه سوال دیگه در مورد INNER JOIN ها داشتم در صورتی که دوتا جدول داشته باشیم و مقدار یک فیلد از جدول اول و مقدار یک فیلد از جدول دوم باهم برابر باشند پیوند میخورند این درست اما من یه فیلد در جدول به صورت ارایه هست و میخوام به صورت ارایه ای پیوند بدم اینجا چگونه کدی لازم است ؟
به طور مثال من یه جدول دارم با فیلدهای
id:1             title:text1
id:2 title:text2
و یه جدول دیگه دارم با فیلد های
id:1               cat:akhbar      post_id=1,2
id:2 cat:mosabeghe post_id:2
اینجا اونی که فیلد post_id به صورت ارایه ای نیست مشکلی نداره و پیوند میخوره و اونی که به صورت ارایه ای هست پیوند نمیخوره چون مقدارش برابر نیست در اصل این یک دسته بندی هست که که در دسته ی "اخبار" دو تا پست قرار داره و در دسته "مسابقه" یک پست قرار داره اینجا باید چه کرد؟
در هر سایتی گشتم راهنمایی مفیدی پیدا نکردم استاد گرامی و به همین جهت دست به سوی شما بلند کردم. منتظر جواب خوب شما هستم.
پاسخ: 
در این موارد اگر مقدار همیشه ثابت و الگو از قبل قابل تعریف باشد می توانیم از تابع REGEXP استفاده کنیم، اما با توجه به توضیحات الگو ثابت نیست و باید از تابع FIND_IN_SET استفاده کرد، مثال:
SELECT tbl_1.user FROM tbl_1 JOIN tbl_2 ON FIND_IN_SET(tbl_1.id, tbl_2.ids) GROUP BY tbl_1.id
راهنمایی بیشتر:
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set
نویسنده: لیا
۱۰:۱۸ ۱۳۹۶/۰۸/۱۶
سلام خسته نباشید من میخام وب سایتی برای رزرو غذا در سلف دانشگاه بسازم طراحی اولیشو کردم الان برای ثبت اطلاعات فرمم باید چیکارکنم
پاسخ: 
برای ایجاد سیستم های تحت وب الزاما باید یک زبان برنامه نویسی سمت سرور مانند PHP و کار با پایگاه داده MySQL را بلد باشید.
نویسنده: امیرحسین
۱۵:۵۸ ۱۳۹۶/۰۹/۱۰
سلام استاد عزیز
یه سوال داشتم
من یه جدولی دارم تو دیتابیسام که اسم کاربران توش به صورت base64_encode ذخیره شده حالا میخوام یه سیستم جستجو داشته باشم که بتونم تو نام کاربران که انکد شدن سرچ کنم
تو ورژن جدید مای اس کیو ال مشکلی ندارم
با این دسترو میتونم حلش کنم
SELECT * FROM tbl_users WHERE FROM_BASE64(name) LIKE '%امیر%'
اما من یه هاست دارم که ورژنش زیاد بالا نیست از دستور FROM_BASE64 هم پشتیبانی نمیکنه راه حل چیه
SELECT name, FROM_BASE64(name) AS decoded_name FROM user
من یه همچین سلکتی میخوام داشته باشم تو ورژن قدیمی که دوتا ستون واسم ایجاد کنه یکیش انکد شدشو میخوام یکیش دیکد شدش
پاسخ: 
همانطور که خودتان اشاره کردید تابع FROM_BASE64 در نسخه های جدید MySQL اضافه شده و در اغلب سرورها پشتیبانی نمی شود، توصیه ما این است که ابتدا در کدهای PHP مقادیر را با تابع base64_encode به شکل مورد نظر تبدیل کرده و سپس مقدار تبدیل شده را با مقادیر موجود در دیتابیس تطبیق دهید، برای برگردان به حالت خوانا نیز از تابع base64_decode در PHP استفاده کنید.
نکته: رمزی کردن اطلاعات در دیتابیس صرفا برای ستون های حاوی محتوای حساس مانند کلمه عبور، شماره تماس، آدرس ایمیل و مواردی از این دست توصیه می شود.
نویسنده: امیرحسین
۱۹:۲۸ ۱۳۹۶/۰۹/۱۱
سلام استاد عزیز
تشکر بابت پاسخ ولی انگار منظورم رو خوب نتونستم برسونم ببینید من در یکی از جداولم فیلدی ک title نام دارد این مقادیر کد شده در آنجا ذخیره شده است.
2KzZh9iqINmF2K/bjNixINi02K/Zhg==
مثلا این مقادیر ها که صرفا متن فارسی رو انکد کردم ذخیره کردم تو دیتابیس مثلا مقدار "سلام خوبی" رو کد کردم گذاشتم تو جدول حالا میخوام در این مقدار کد شده جستجو انجام بدم مثلا با دستور LIKE موجود در سلکت میخوام کلمه ی "خوبی" را جستجو کنم.
توجه: کلمه ی "خوبی" را اول انکد میکنم سپس جستجو میکنم انگاه میگه این مقدار اینکد شده موجود نمیباشد !!
راه حلی که به ذهن من میرسه اینه که از ویو view ها استفاده کنم به این صورت که مقدار دی کد شده یه جداول رو در یک ویو ذخیره کنم سپس در آن ویو جستجومو انجام بدم سپس آن ویو رو حذف کنم ولی حوصله سر بر هستش اینطوری شما راه بهتر سراغ ندارید.
با FROM_BASE64 در لوکال هاست این کار به سادگی صورت میپذیره ولی در نسخه قدیمی تنها راهی که به ذهن بنده میرسه اینه که از ویو ها استفاده کنم شما چی پیشنهاد میدید؟
دلیل اینکه جستجو با شکست مواجه میشه مثلا عبارت "سلام خوبی" رو من اینکد میکنم به فرض یه همچین عبارتی میده
2KJA2@%AM 
فرض کنید این عبارت اینکد شده یه "سلام خوبی" هست سپس من کلمه ی "خوبی" رو ک اینکد میکنم اینطوری میشه
Q1@SD 
به فرض این کلمه ی "خوبی" اینکد" شدش هست به همین دلیل جستجو با شکست مواجه میشه
پاسخ: 
به قسمت LIKE دقت نکرده بودیم! متاسفانه تا آنجا که اطلاع داریم روش ساده ای برای رفع بهینه این مورد در نسخه های قدیمی تر MySQL وجود ندارد، استفاده از VIEW می تواند راهگشا باشد البته باید ببینید برای حجم زیاد داده ها عملکرد دیتابیس غیرعادی کند نشود (تست نکرده ایم).
نویسنده: بهروز محمدی
۲۱:۴۱ ۱۳۹۶/۱۰/۱۷
با سلام استاد گرامی من دو تا تیبل دارم که یکیش اطلاعات تکراری زیاد داره و میخوام اطلاعات را در فایل جدید اضافه کنم به شرطی که اطلاعات تکراری در فایل دوم اضافه نشود آیا با دستورات sql میشه اینکار را انجام داد که سریعتر انجام بشه یا باید با php اینکار را انجام بدم لطفا راهنمایی بفرمایید با تشکر
پاسخ: 
با هر دو روش می توانید این کار را انجام دهید، روش استفاده از SQL کوتاهتر است اما انعطاف پذیری PHP را ندارد، به طور مثال:
INSERT INTO table2 SELECT * FROM table1 WHERE DELETE FROM table1 WHERE table1.col in (SELECT table2.col FROM table2)
در این مثال فرضی عبارت col نام ستون مد نظر است، با کدهای PHP نیز می توانید با استفاده از دستورات شرطی این کار را انجام دهید، ابتدا یک پرس و جو بنویسید که وجود یا عدم وجود عبارت مد نظر را بررسی کند، اگر وجود نداشت مقدار جدید اضافه شود، در هر حال دقت کنید که در هر دو روش ابتدا باید از جداول موجود پشتیبان تهیه کنید تا در اثر اتفاقات ناخواسته اطلاعاتتان حذف نشوند!
نویسنده: بهروز محمدی
۰۰:۱۹ ۱۳۹۶/۱۰/۱۹
با سلام و خسته نباشید
استاد عزیز بابت راهنمایی قبلی کمال تشکر را دارم
دو سوال دیگر دارم
1- برای آپدیت کردن چند فیلد از تیبل اول می تونم از فیلدهای تیبل دوم استفاده کنم یا نه البته با دستورات mysql تو اینترنت سرچ کردم ولی نتیجه ای نداشت
2- یه فرم دارم که تعدای اینپوت با تایپ فایل داره زمانی که برای ارسال از تگ سابمیت استفاده می کنم اطلاعات ارسال میشه و مشلی نداره یعنی همه اطلاعات مربوط به فایل های انتخابی ارسال میشه ولی اگر به جای تگ سابمیت بیام باتن بزارم و با روش ایجکس سابمیت کنم همه اطلاعات ارسال میشه بغیر از اطلاعات تگ فایل
لطفا راهمایی بفرمایید
قبلا از زحمات جنابعالی کمال تشکر را دارم
پاسخ: 
سوال اول مبهم است، در هر صورت می توانید با نوشتن پرس و جوهای ترکیبی از اطلاعات جداول هر طور که مد نظرتان است استفاده کنید، معمولا در اینگونه موارد از JOIN استفاده می شود، این عبارت را در گوگل جستجو کنید:
mysql update table from another table
در مورد سوال دوم، آپلود فایل با Ajax کمی پیچیده تر از ارسال اطلاعات متنی است، در کل چند روش برای ارسال فایل به سرور با Ajax یا شبیه سازی روش Ajax وجود دارد (استفاده از جاوا اسکریپت، استفاده از جی کئوری، استفاده از متدهای جدید مانند FormData، شبیه سازی با iFrame و...)، چند راه حل دم دستی در وب:
https://www.codeproject.com/Articles/685251/AJAX-file-uploader-with-progress-notification-in-p

https://stackoverflow.com/questions/11506510/ajax-file-upload-form-submit-without-jquery-or-iframes
نویسنده: بهروز محمدی
۱۲:۱۰ ۱۳۹۶/۱۰/۲۲
با سلام و خسته نباشید خدمت استاد گرامی
و همچنین تشکر بابت راهنمایی های مرحمت می فرمایید
این بار هم مثل قبل مزاحم شدم جهت راهنمایی گرفتن من وقتی از دستور جوین استفاده می کنم (inner یا left) در خروجی تغییر حاصل نمیشه و رکوردها تکرار میشه خیلی زیاد مثلا تیبل 30 رکورد داره ولی در خروجی 2000 رکورد دارم لطف می کنید راهنمایی بفرمایید
حذف شد
پاسخ: 
قاعدتا استفاده از پرس و جوی JOIN باید با هدف نهایی شما مطابقت داشته باشد، برای درک مشکل این پرس و جو، باید یک نمونه دیتابیس از اطلاعات در دسترس باشد و نتیجه مد نظرتان نیز در قالب یک اسکرین شات یا توضیحات دقیق مشخص گردد، سپس پرس و جو بر همان اساس اصلاح شود، در حد راهنمایی اولیه توصیه می کنیم پرس و جو را ابتدا کوتاه و مختصر بنویسید و در یک نمونه دیتابیس ترجیحا در لوکال هاست تست کنید و اگر ایراد نداشت آن را به صورت مرحله به مرحله توسعه دهید، با این روش خطایابی ساده خواهد بود.
نویسنده: بهروز محمدی
۰۰:۰۲ ۱۳۹۶/۱۰/۲۵
یا سلام و خسته نباشید
و سپاس فراوان بابت راهنمایی هایی که مرحمت می فرمایید
مشکل قبلی حل شد ظاهرا زمانی که آپدیت تیبل انجام میشد از یه محدوده اطلاعات به بعد را یک کد ثابت قرار میداد
بازم ببخشید سوال جدید
برای جایگزین کردن حرف ک فارس به جای ك عربی در تیبل ها باید چه گونه عمل کرد چندین مورد سرچ کردم ولی قابل انجام نبود شما راه حلی دارید با تشکر
پاسخ: 
برای تغییر اطلاعات موجود در دیتابیس قاعدتا باید پرس و جو اجرا کنید، مثال:
UPDATE tbl_name SET col_name = REPLACE(col_name, 'ك', 'ک')
اما قبل از ذخیره اطلاعات در دیتابیس با PHP می توانید این کار را انجام دهید:
<?php
$var = str_replace('ك', 'ک', 'اردك');
echo $var;
?>
نویسنده: بهروز محمدی
۱۹:۰۸ ۱۳۹۶/۱۰/۲۷
با سلام و خسته نباشید
بسیار سپاسگزارم از راهنمایی ها خیلی محبت دارید
نویسنده: navid
۱۷:۰۴ ۱۳۹۷/۰۳/۱۵
با سلام خدمت شما
من دو جدول به نام های رجیستر و زیر مجموعه دارم من در جدول رجیستر یک ستون به نام id به عنوان کلید اصلی تعریف کردم و در جدول زیرمجموعه یک ستون به نام admin id تعریف کردم بعد از اون به قسمت structure این جدول رفتم و در قسمت relation فیلد admin id رو کلید خارجی فیلد id قرار دادم در ضمن فیلد admin id رو هم به صورت index قرار دادم ولی در آخر ارور
Error: Field 'admin id' doesn't have a default value
رو ازم میگیره . من default value روی none تنظیم کردم وقتی هم که روی null تنظیم میکنم در این ستون همه رکورد ها رو null میزنه.
علتش این ارور چیه؟
پاسخ: 
ظاهرا این مسئله به تنظیمات MySQL و فعال بودن حالت STRICT_ALL_TABLES یا STRICT_TRANS_TABLES برمی گردد، دقت کنید که فیلد id از نوع AUTO_INCREMENT باشد، اگر در لوکال هستید و این حالت مشکل جدی در برنامه ایجاد کرده است، برنامه سرور مجازی خود را (پس از گرفتن پشتیبان از اطلاعات) به روز کنید.
نویسنده: امیرهادی
۱۶:۲۹ ۱۳۹۷/۰۴/۲۲
سلام
توی wamp چطور میشه در قسمت SQL_MODE عبارت STRICT_TRANS_TABLES رو به NO_ STRICT_TRANC_TABLES تغییر داد؟
پاسخ: 
برای اطمینان از اینکه حالت فعلی sql_mode به چه صورتی تنظیم شده است می توانیم پرس و جوی زیر را اجرا کنیم:
SHOW VARIABLES LIKE 'sql_mode';
برای ویرایش یا غیرفعال سازی حالت STRICT_TRANS_TABLES نیز در قسمت SQL برنامه phpMyAdmin در لوکال هاست پرس و جوی زیر را درج و اجرا می کنیم:
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
به جای عبارت NO_ENGINE_SUBSTITUTION می توانیم مقادیر خالی نیز قرار دهیم.
نویسنده: امیرهادی
۲۰:۳۰ ۱۳۹۷/۰۴/۲۶
ممنون از جوابهای دقیق شما.
برای تغییر موتور پیش فرض جستجو به MariaDB باید چه تنظیماتی انجام بدم؟
بنده wamp 3.1.3 نصب کردم. خودش mariadb هم داره. چطور سوییچ کنم به mariadb ؟
پاسخ: 
MariaDB مانند MySQL یک سیستم مدیریت پایگاه داده (DBMS) است، برای انتخاب این سیستم ابتدا مطمئن شوید که این گزینه در هنگام ورود به برنامه phpMyAdmin فعال باشد، در آپدیت های جدید برنامه WampServer در صورت فعال بودن MariaDB در هنگام ورود به برنامه phpMyAdmin منوی Server Choice نمایش داده می شود که دو گزینه MySQL و MariaDB قابل انتخاب است، برای تغییر یا تعیین اینکه کدام سیستم فعال باشد بر روی آیکن برنامه Wamp در سمت راست نوار وظیفه ویندوز کلیک راست کرده و گزینه Wamp Settings را انتخاب کنید، در این گزینه دو پارامتر Allow MySQL و Allow MariaDB برای انتخاب یا عدم انتخاب وجود دارد، برای انتقال دیتابیس MySQL به MariaDB نیز می توانید از امکانات برنامه phpMyAdmin برای Import و Export دیتابیس استفاده کنید.
نویسنده: امیرحسین
۰۱:۰۰ ۱۳۹۸/۰۲/۲۷
سلام استاد عزیز
این دستور کارش چیه ؟
LOCK TABLES `sepidar` WRITE;
پاسخ: 
همان طور که از معنی عبارات دستور مشخص است برای قفل گذاری موقت روی جداول MySQL کاربرد دارد، در مواقع خاصی که ممکن است چند اتصال هم زمان در حال اجرا باشند و نخواهیم عملیات آنها با هم تداخلی داشته باشد می توانیم از این دستور استفاده کنیم، پارامترهای این دستور عملکرد آن را تغییر می دهد به فرض WRITE یعنی امکان خواندن و نوشتن تا پایان پردازش فعلی صرفا توسط اتصال جاری ممکن است.
نویسنده: امیرحسین
۲۳:۲۲ ۱۳۹۸/۰۳/۱۴
سلام استاد وقت بخیر
DROP TABLE IF EXISTS `mkyong`.`stock`;
CREATE TABLE `mkyong`.`stock` (
`STOCK_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`STOCK_CODE` varchar(10) NOT NULL,
`STOCK_NAME` varchar(20) NOT NULL,
PRIMARY KEY (`STOCK_ID`) USING BTREE,
UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`),
UNIQUE KEY `UNI_STOCK_CODE` (`STOCK_CODE`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `mkyong`.`stock_detail`;
CREATE TABLE `mkyong`.`stock_detail` (
`STOCK_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`COMP_NAME` varchar(100) NOT NULL,
`COMP_DESC` varchar(255) NOT NULL,
`REMARK` varchar(255) NOT NULL,
`LISTED_DATE` date NOT NULL,
PRIMARY KEY (`STOCK_ID`) USING BTREE,
CONSTRAINT `FK_STOCK_ID` FOREIGN KEY (`STOCK_ID`) REFERENCES `stock` (`STOCK_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
این کدا ارتباط یک به یک رو نشون میده سوال اول اینکه مگه میشه یه ستون از جدول هم کلید اصلی باشه و هم کلید خارجی؟ و خواستم کاربرد این دستور رو بدونم
 PRIMARY KEY (`STOCK_ID`) USING BTREE,
منظور قسمت using btree هست کارش چیه؟
پاسخ: 
در مورد سوال اول بله در صورتی که ساختار جداول ایجاب کند یک ستون هم می توانید PRIMARY KEY باشد و هم FOREIGN KEY البته به شرط اینکه مقدار این ستون همواره یکتا و غیرتکراری باشد (تا آنجا که اطلاع داریم موتور InnoDB از این حالت پشتیبانی می کند)، در مورد قسمت USING BTREE این شیوه پیش فرض ایندکس گذاری در MySQL است و زمانی که ستون را به عنوان INDEX نشانه گذاری می کنیم می تواند استفاده شود، تعیین مقدار پیش فرض الزامی نیست.
نکته: منظور از INDEX گذاری یعنی مقادیر ستون یا ستون هایی که معمولا در قسمت WHERE استفاده می شوند با متدهایی به صورت مجزا دسته بندی شده که این باعث سهولت جستجو، افزایش سرعت اجرای پرس و جوها و در نتیجه کاستن از فشار بر MySQL می شود.
نویسنده: یه سوال کننده
۰۴:۴۴ ۱۳۹۸/۰۹/۰۵
سلام. ببخشید من یه سری فایل dbf دارم که نمیدونم چطور تبدیلش کنم به فایل اکسل که فرمتش درست باشه. مربوط به فایل برنامه 118 هست و میخوام ازش تو یه برنامه پایگاه داده استفاده کنم ولی همه شو بصورت ناخوانا میاره خیلی وقته میخوام درستش کنم ولی کسی رو ندارم راهنماییم کنه که اصلا با چه برنامه ای نوشته شده و چطور تبدیلش کنم. کلا راجع به تبدیل فایل ها و انکدینگ اونها میشه یه مقاله جامع بزارین فکر کنم مشکل خیلی ها باشه. پیشاپیش تشکر میکنم.
پاسخ: 
همان طور که اشاره کردید ظاهرا فایل ها با یک برنامه خروجی داده شده اند، در حالت عادی می توانید با برنامه هایی نظیر DBF Viewer فایل های مروبط به دیتابیس (DataBase File) را تبدیل به Excel کنید، اما در مورد این فایل ها باید آزمایش و خطا انجام گیرد که فرآیندی زمانبر است و ممکن است با توجه به شیوه کامپایل شدن امکان تبدیل به فرمت خوانا وجود نداشته باشد! در صورتی که نیاز فوری ندارید از طریق ایمیل سایت (موجود در بخش تماس) اعلام کنید تا بررسی های بیشتر صورت گیرد (به چند روز زمان نیاز است!).
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





3 × 5
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form عبدالمالت ریالی
در:
سلام علیک میشه از چند فونت در یک صفحه html استفاده کرد.؟
۱۳۹۹/۰۸/۰۱

form مبینا
در:
سلام من برنامه ای میخواستم که داخل ارایه 5 رنگ قرار گرفته باشه. و با استفاده از حلقه for این یک متنو به اون پنج...
۱۳۹۹/۰۸/۰۱

form mohadeseh
در:
ممنون از راهنماییتون مشکلم حل شد
۱۳۹۹/۰۷/۲۸

form محمد
در:
سلام. یک کد نوشته ام بدین صورت: وقتی صفحه باز شده یک پنجره پیام خالی با یک ok باز شده هر چه ok را...
۱۳۹۹/۰۷/۲۸

form فایز پور جهانبخشی
در:
سلام اگر بخواهیم برنامه ای که داخل متلب نوشتیم تا یک ثانیه اجرا شود و بعد از ثانیه اول در حالت خطا که...
۱۳۹۹/۰۷/۲۸

form mohadeseh
در:
الان کد من که توی تگ <head> گزاشتم میخواستم بدونم ایا امکانش هست که توی تگ link که ایکون رو باهاش اوردم بتونم...
۱۳۹۹/۰۷/۲۷

form mohadeseh
در:
سلام ببخشید لطفا راهنمایی کنید که چجوری title برای favicon در html بزارم؟ جوری که وقتی موس روی icon قرار بگیره متن...
۱۳۹۹/۰۷/۲۷

form ryomaechizen
در:
سلام. اگه حافظه وب پر بشه و مجبورا عکسا کپی باشن چطور باید مشکل بارگزاریشون حل بشه؟
۱۳۹۹/۰۷/۲۶

form رونا
در:
پرونده فرستاده شده نمی‌تواند به wp-content/uploads/2020/10 برود. سلام این ارور برای چی رخ می ده
۱۳۹۹/۰۷/۲۵

form reza
در:
سلام خوبید انشاالله؟ خواستم بدونم این نوار ابزار رو چطور باید اونایی رو دوست دارم بزارم سمت راست وبلاگم. هر چی کد و ......
۱۳۹۹/۰۷/۲۴

form سینا
در:
چگونه میتوانیم با استفاده از HTML فرمول شیمیایی مواد را بنویسیم؟ با عدد اتمی، جرمی و بار اتمی
۱۳۹۹/۰۷/۲۱

form فاطمه
در:
سلام ممنونم... خیلی ساده و روون توضیح دادین.. اونقدر که تشویق شدم محتوای یه فایل تکس رو با ایجکس درون یه div بیارم ولی...
۱۳۹۹/۰۷/۲۱

form امیرحسین
در:
خب متوجه شدم. که باید خط اول عدد فانکشن رو تغییر بدم. بسته به تعداد آرایه یا هر عدد دیگه تغییر بدم جوابمو...
۱۳۹۹/۰۷/۲۱

form امیرحسین
در:
عالی بود. خیلی ممنونم. ولی هر چند کلمه داخل آرایه داشته باشم به همون میزان خروجی گرفته میشه. من اگه 10 کلمه در آرایه داشته...
۱۳۹۹/۰۷/۲۱

form سعادتی
در:
سلام کاش روش برطرف کردن این بهم ریختگی رو هم توضیح میدادید. ممنون
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
موفق شدم اینو پیدا کنم. ولی میخوام کلمات تکراری داخلشون نباشه. مثال AAA فقط یک بار در اون خط وجود داشته باشه.
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
سلام. نه محدودیت زمانی وجود نداره.
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
سلام خسته نباشید. میخوام از این تابع برای بدست آوردن لیست های متفاوت استفاده کنم. مثلا یه آرایه داشته باشم. امیدوارم کمکم...
۱۳۹۹/۰۷/۲۰
form ابوالفضل
در:
سلام وقتتون بخیر من میخوام یه افزونه برای مرورگر کروم طراحی کنم و میخوام یه متنی رو هر سری از سایت دریافت کنه و...
۱۳۹۹/۰۷/۲۰
form mahdi
در:
سلام چطور می تونم از ip خارجی استفاده کنم؟ برای دریافت لانچر میخام. مرسی
۱۳۹۹/۰۷/۱۹
form احسان عباسی
در:
با سلام و تشکر از سایت خوبتون من یه کد تعریف کردم که در بورس ایران سهم مدنظرمو بیاره .. میخواستم ببینم امکانش هست دستوری...
۱۳۹۹/۰۷/۱۷
form شبنم
در:
سلام وقتتون بخیر، ببخشید از کلمه event یا e دقیقا چه زمانی توی فانکشن استفاده میکنیم؟
۱۳۹۹/۰۷/۱۷
form احمد
در:
با عرض سلام مجدد ساختار کلی دستورم به این صورت هست. بعد از حلقه وایل اون دیو کلاس 1 و 2 و 3 میخواهم...
۱۳۹۹/۰۷/۱۶
form احمد
در:
با عرض سلام ببخشید چطوری میتونم یه قسمت از تگ ها رو داخل حلقه وایل رد کنم دوباره تگ های بعدی داخل حلقه قرار بگیرن...
۱۳۹۹/۰۷/۱۶
form ابوالفضل
در:
سلام واقعا من خیلی گشتم تا بتونم این آموزش رو پیدا کنم چون واقعا نمی دونستم چی بنویسم تا یک رتبه بندی برای نتایج جستجو...
۱۳۹۹/۰۷/۱۵
form mahtab
در:
سلام وقتتون بخیر ببخشید میشه بفرمایید چجوری کلیپ رو بزاریم وبلاگ ؟؟ بی زحمت کامل بفرمایین ممنون و متشکر
۱۳۹۹/۰۷/۱۴
form Saeid Azari
در:
سلام ببخشید اگه امکانش هست سوال منو جواب بدید یکم گیج شدم...من یک کد html دارم که باید یک سایت درست کنم و ان را...
۱۳۹۹/۰۷/۱۳
form ابوالفضل
در:
سلام یک سوال دارم چجوری یک متنی که درون تگ td هست و بعد تگ br هست (تگ br درون تگ td است) رو...
۱۳۹۹/۰۷/۱۳
form parnian
در:
با سلام با توجه به این که این مطلب در سال 91 نوشته شده ایا تغیری هم کرده؟ مثلا استفاده و مهم بودن تگ های...
۱۳۹۹/۰۷/۱۳
form fahimeh
در:
سلام من دارم پروژه واسه دانشگاه مینویسم طراحی سایتو کردم برای کار با پایگاه داده دستور insert و delete کار میکنه ولی...
۱۳۹۹/۰۷/۱۲
form امین
در:
با عرض سلام ببخشید یه فرم دارم اخر فرمم یه دکمه دارم میخواستم بدونم چطوری باید بعد از کلیک کردن دکمه به صفحه دیگه انتقال...
۱۳۹۹/۰۷/۱۱
form محسن
در:
سلام من از فرم ساز گرویتی استفاده میکنم آیا امکان استفاده همچین چیزی رو میتونم داخلش داشته باشم آیا کدی داره که در قسمت...
۱۳۹۹/۰۷/۱۱
form مالکی
در:
چرا وبلاگم بالا نمی یاد
۱۳۹۹/۰۷/۰۹
form احمد
در:
با عرض سلام مجدد و خسته نباشید ببخشید نمونه کد رو اگر امکانش هست نگاه کنید که چطوری این متغییری رو که بدست اوردم در...
۱۳۹۹/۰۷/۰۹
form الناز
در:
سلام وقتتون بخیر. چطور میشه برنامه ای رو در php نوشت که کدملی رو تبدیل به شماره دانشجویی کنه اگه برام بنویسید ممنون میشم.
۱۳۹۹/۰۷/۰۹
form محمد
در:
سلام من میخواستم بدونم چه طوری میشه بدون اینکه از کاربر بپرسی که میخواهد از حساب خروج پیدا کند خود سایت بفهمد که کاربر از...
۱۳۹۹/۰۷/۰۹
form احمد
در:
با سلام ببخشید چطوری باید در جکوری از یک متغییر در صفحات دیگه استفاده کنم مثال دو عدد را باهم جمع کردم و ریختم داخل...
۱۳۹۹/۰۷/۰۹
form مهسا
در:
سلام و خسته نباشید مشکلی برای وبلاگ من پیش اومده موقع ورود بهم پیام میده وبلاگ داره بروز رسانی میشه و بعدا وارد وبلاگ شوید...
۱۳۹۹/۰۷/۰۸
form Moshtagh
در:
سلام و خسته نباشید بنده چند روزه که وقتی اطلاعات ورود به وبلاگم رو وارد تیترها و کلیک میکنم با چنین پاسخی مواجه میشم...
۱۳۹۹/۰۷/۰۸
form mahtab
در:
سلام خسته نباشین ببخشید چرا بلاگفا باز نمیکنه ؟؟؟ میرم مدیریت وبلاگ نه تو بروز شده ها وبی هستم نه هم که...
۱۳۹۹/۰۷/۰۷
form جواد
در:
سلام و عرض ادب. سایت من هک شده و یک کد ریدایرکت تو دیتابیس هاستم بارگزاری شده که آخر همه پست ها تو...
۱۳۹۹/۰۷/۰۷
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.