یک وبلاگ دیگر از یک برنامه نویس دیگر
نوشتههایی با برچسب MySQL
Mysql Menu قسمت سوم
مرداد ۱۲م
چند وقت پیش در باره منو و طریقه ایجاد آن با mysql نوشتم. منظورم بیشتر روش دومی بود که معرفی کردم. خودم تا همین روزها نیاز نشده بود که از این منو استفاده کنم، تا امروز برای کاری ار همان پست استفاده کردم. (این وبلاگ بیشتر از هر کسی گویا به درد خودم میخورد) میخواستم از همان کوئری ها استفاده کنم و یک ساختار تشکیل شده از ul و li های تو در تو درست کنم. اول سعی کردم اطلاعات را داخل آرایه بریزم که بعد به صورت html دربیاورم که متوجه شدم دارم لقمه دور سر میچرخانم.
با توجه به اینکه ساختار منو (لطفا پست MySQL , Menu قسمت دوم رو حتما بخونید) دقیقا شبیه ساحتار تو در توی html هست میشه از این خاصیت استفاده کرد :) یعنی اونجا همه منو های یه سمت چپ داشتن یه سمت راست، تو html هم هر تگی یه سمت چپ داره یه سمت راست. من میخوام یه ساختار منوی ساده با ul و li به وجود بیارم طوری که :
- عنصر دور تا دور فقط یه ul داره.
- عناصری که زیر مجموعه ندارن دورشون li میفته
- عناصری که زیر مجموعه دارن هم li میخوان هم ul .
- اگه آیتمی هیچ زیر منو نداشت اونوقت متن اون آیتم هم نشون داده بشه (شما اینو خودتون میتونید گسترش بدید، یا برای همه منوها آیتم رو نشون بدید، من ترجیح دادم سادهتر کار کنم.)
نتیجه خیلی سادست. فقط باید حالات مختلف رو بنویسم.ساختار دیتابیس اینه (مثل مثال قبلی ، فقط فیلد name به صورت unique در اومده برای اینکه توی کد باید به یه چیزی تکیه کرد ;) )
CREATE TABLE IF NOT EXISTS `adv_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `data` varchar(255) NOT NULL, `lside` int(11) NOT NULL, `rside` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM;
اینبار میخوام از PDO استفاده کنم برای اتصال به mysql . ایده خیلی سادست. فقط در نظر بگیرید که همونطور که قبلا گفتم (تو پست قبلی در این مورد) هر منو یه چپ داره یه راست.
خوب چی میشه اگه سمت چپ رو شروع تگ در نظر بگیریم و سمت راست رو پایان تگ؟ چی میشه اگه یه آرایه ایجاد کنیم به تعداد دو برابر آیتمها، با ایندکس ۱ تا دوبرابر آیتمها، بعد تو آرایه ایندکس سمت چپ تگ شروع html رو بذاریم (مثلا یه li یا یه ul بعد یه li یا هر چیز دیگه ای) و در ایندکس سمت راست هم دقیقا پایان همون تگ سمت راست رو (مثلا اینبار /li )، فقط کافیه بدونیم که مثلا آیتم اگه زیر مجموعه نداشت فقط li میخواد (که این فقط در صورتیه که سمت چپی یکی کمتر از سمت راستی باشه) اگه منوی دور تا دوره فقط یه ul میخواد (که خوب این هم سمت چپش همیشه ۱ میشه) و در غیر این صورت ul و li با هم.
خوب این خیلی ساده ایتمهای توی دیتابیس رو تبدیل میکنه به یه ساختار html و کافیه که اینبار فقط این آرایه رو به هم بچسبونیم و در خروجی نشون بدیم.
کد زیر کل این کارها رو به ساده ترین وجهی انجام میده، ولی باز هم جای کار داره، خیلی زیاد هم جای کار داره.
ادامه مطلب
انتقال اطلاعات از CSV به MySQL
فروردین ۱۱م
بعضی وقتها یه سری کارهای کوچیک میتونه دردسر ساز باشه. مثلا من امروز نیاز داشتم که یه فایل CSV رو توی یه جدول MySQL ببرم. واسه فایلهای کوچیک معمولا از PHP استفاده میکردم، ایندفعه هم قصد داشتم از Perl استفاده کنم، چون فایل یه چیزی در حدود ۳۰ مگا بود و خواستم که یه کدی هم با Perl بنویسم. ولی آخرش با پرل هم ننوشتم :)
خود MySQL میتونه اینکارو به راحت ترین روش بدون نیاز به هر گونه ابزار جانبی انجام بده. خیلی ساده کنسول MySQL رو باز کنید، مثلا با یه دستوری مثل این :
mysql -u root -p -h 127.0.0.1
–اگه دقت کرده باشید من Host رو هم به صورت IP دادم،نمیدونم چه مرگشه همینجوری اگه IP ندم، مثلا ولش کنم به صورت پیشفرض یا localhost سعی میکنه از طریق socket اتصال برقرار کنه که نمیتونه :(منظورم لینوکسه، ویندوز مشکلی نداشتم البته اون موقع که ویندوز کار میکردم :) کسی میدونه راه حلش چیه؟؟)–
بعد از انتخاب دیتابیس (معمولا اینطوری : use database_name ) میتونید از این دستور :
ادامه مطلب
MySQL , Menu قسمت دوم
بهمن ۲۵م
این پست رو برای اضافه کردن یه سری قابلیت جدید و رفع یه باگ ویرایش کردم. :D
قبل از شروع بگم اصل این ایده رو یکی از دوستام داد، اونم از وب خونده بود. منتها من هیچ چیز مدوّنی از این مطلب نتونستم پیدا کنم هنوز (نگشتم اگه راستشو بخواید) خواستم پیشاپیش بگم، چون حقیقتا به این مساله اهمیت میدم، احترام به حق دیگران.
توی پست قبل، روشی رو بررسی کردم که توی اون روش، از یه سری کوئری ساده استفاده میشد که یه جور منو از دیتابیس بارگذاری بشه (منظور نمایش نیست، فقط بارگذاری منو از دیتابیس به آرایه ، از MySQL به PHP ) ولی مشکل اساسی این بود که توی اون روش، زیادی قابلیت انعطافی وجود نداشت، درجه ها هم نمیشد از یه حدی بیشتر باشه و برای درجه های بالاتر باید کوئری تغییر میکرد که اینکار مستلزم زمان و کد بیشتره.
اما این دفعه روش طور دیگه ای هست. به جای روش قبلی، منو رو به این صورت در نظر بگیرید. (چیزی تغییر نکرده، فقط طرز نمایش عوض شده و به جای یه نمودار، یه سری آیتم تو در تو وجود داره)
جدولی که این دفعه قراره ساخته بشه، ساختار یه کم متفاوتی داره، به این صورت :
CREATE TABLE IF NOT EXISTS `adv_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `data` varchar(255) NOT NULL, `lside` int(11) NOT NULL, `rside` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM; INSERT INTO `adv_menu` (`id`, `name`, `data`, `lside`, `rside`) VALUES (1, 'Root', 'Root Data', 1, 24), (2, 'Home', 'Home Data', 2, 3), (3, 'Pages', 'Pages Data', 4, 13), (4, 'Articles', 'Articles Data', 14, 23), (5, 'PHP', 'PHP Data', 5, 10), (6, 'Delphi', 'Delphi Data', 11, 12), (7, 'SQL', 'SQL Data', 15, 16), (8, 'Ajax', 'Ajax Data', 17, 22), (9, 'Part2', 'Part2 Data', 18, 19), (10, 'Part1', 'Part1 Data', 20, 21), (11, 'OS', 'OS Data', 6, 7), (12, 'GTrans', 'GTrans Data', 8, 9);
Menu، MySQL و کلا هر چی با M شروع میشه
بهمن ۲۳م
اولین بار،برای ایجاد کردن یک منوی تو در تو، از یک روش ساده استفاده کردم. روشی که خیلی های دیگر هم از آن مطمئنا استفاده میکنند. (باز هم خیلی بی مقدمه شروع کردم !)
منظورم از منوهای تو در تو خیلی سادست، منوهای کناری سایتها. مثلا یه چیزی مثل شکل زیر:
با این فرض که این منوها قراره از دیتابیس خونده بشن (تو این مورد mysql) و نمایش داده بشن. دیشب یه دوستی هم همین رو پرسید ازم که من اگه باشم چیکار میکنم، و بعد من یه راهی به ذهنم رسید که تا همین الان هم یه کله دارم روش کار میکنم.(البته بگم که یه دوست دیگه هم این ایده رو بهم داد و قرار شد لینکی که اصل ایده از اونجا بوده رو برام بفرسته، ولی این دوست من خیلی بد قوله!!) اول از همه روش قدیمی مو میگم و بعد روش جدیدمو . یعنی قسمت اول روشیه که تا به امروز استفاده میکردم و قسمت دوم روش جدیدیه که مد نظرمه،احتمالا اینو تو دو تا پست سرو سامون بدم تا شاید اون لینکی که دوستم گفت رو تا اون موقع پیدا کردم چون من الان فقط طرح کلیشو میدونم و بقیش کار خودمه و شاید اون بهتر بود.
فرض کنید همون شکلی که بالا هست رو میخوام پیاده کنم. جدولی با یه ساختار ساده ایجاد میکنم :
CREATE TABLE IF NOT EXISTS `simple_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `parent` int(11) NOT NULL, `data` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM;
این روش،خیلی ساده میتونه برای منوهای تو در توی محدود استفاده بشه. مثلا تا ۴ درجه.(مثل همین تصویر اگر که ریشه رو هم یک درجه حساب کنید)و البته قسمت دیتا هم اصلا استفاده ای توی مثال من نداره و مثلا میتونه لینکی باشه که این منو قراره به اون ما رو هدایت بکنه یا یه چیزی شبیه این. تو این مثال، ما زیاد اونو جدی نمیگیریم :)
مثلا برای این تصویر اطلاعات مورد نیاز من خواهد بود :
INSERT INTO `simple_menu` (`id`, `name`, `parent`, `data`) VALUES (1, 'Root', 0, 'Root Data'), (2, 'Home', 1, 'Home Data'), (3, 'Pages', 1, 'Pages Data'), (4, 'Articles', 1, 'Articles Data'), (5, 'PHP', 3, 'PHP Data'), (6, 'Delphi', 3, 'Delphi Data'), (7, 'SQL', 4, 'SQL Data'), (8, 'Ajax', 4, 'Ajax Data'), (9, 'OS', 5, 'OS Data'), (10, 'GTrans', 5, 'GTrans Data'), (11, 'Part1', 8, 'Part1 Data'), (12, 'Part2', 8, 'Part2 Data');






