در این سوال قرار است شما تاریخی را به عنوان ورودی دریافت کنید و تعداد روز های باقیمانده از امروز تا تاریخ مورد نظر را محاسبه کنید (برای مثال تعداد روزهای باقیمانده از امروز تا فردا ۱ میباشد). اگر تاریخ مورد نظر قبل از امروز بود عبارت "gone" (بدون علامت ") و در غیر این صورت عدد محاسبه شده را چاپ کنید.
12 oct 2018
می باشد.POST
و با کلید date
برای اسکریپت شما ارسال می شود. یعنی باید از $_POST['date']
استفاده کنید.Y-m-d
به شما داده می شود.echo
استفاده کنید.فایل پاسخ خود را با نام ez.php
ذخیره کرده و به صورت فایل zip.
آپلود کنید.
یک وبسایت داریم که در آن نمرات دانشجویان اعلام میشود، میخواهیم با برنامهای نمرات دانشجویان را دریافت و در قالب یک json
خروجی دهیم.
این وبسایت دارای دو نوع صفحه است.
که در آن لیست دانشجویان و لینکی به صفحهی نمرهاشان قرار گرفته است.
که در آن یک جدول قرار دارد که سطر اول آن نام دروس و سطر دوم آن نمرهی هر درس است.دقت کنید دروس هر دانشجو ممکن است متفاوت با دیگران باشد.
یک نمونه از وبسایت در این آدرس بارگذاری شدهاست. همانطور که میبینید در صفحهی اول آن یک لیست وجود دارد که تعدادی لینک با متن User #number
و لینکی به شکل score-??.html
قرار دارد. عدد نوشته شده بعد از مربع شماره دانشجویی و عبارت داخل لینک بیمعناست.
بعد از کلیک روی هر یک از لینکها به صفحهی جدیدی میرویم که صفحهی نمرهاست.
وظیفهی شما این است که با گرفتن آدرس وبسایت از طریق GET
و با کلید url
، با گرفتن محتوای صفحهی {$_GET['url']}/index.html
دانشجویان و لینک صفحهشان را پیدا کرده و سپس با فرستادن درخواست به صفحهی دانشجویان و تحلیل آن لیست دروس و نمرههایشان را به دست آورید.
خروجی برنامهی شما باید یک json
از نوع object
باشد که کلیدهای آن شمارهدانشجویی افراد و به ازای هر دانشجو مقدار آن، یک object
با کلید نام درس و نمرهی آن باشد.
json
باید یک آبجکت خالی {}
باشد.به طور مثال خروجیای که از وبسایت نمونه ساخته میشود کد زیر است:
شما تنها کافی است فایلی به نام crawl.php
بسازید که از طریق GET
یک ورودی به نام url
که آدرس سایت نمرات است بگیرد و خروجی json
را چاپ کند، سپس این فایل را داخل یک فایل zip
قرار داده و آپلود کنید.
میخواهیم یک سامانهی رایگیری آنلاین با کمک پایگاه دادهی sqlite3
پیادهسازی کنیم.
بدین صورت که هر بازدید کننده از سایت با مشاهدهی صفحهی اصلی لیست گزینههای قابل رای دادن را ببیند و از بین آنها یکی را انتخاب کند، سپس به صفحهی ثبت رای متنقل شده و رای او ثبت شود.
همچنین یک بخش افزودن گزینه وجود داشته باشد که با کمک آن بتواند گزینهی جدید به رایگیری اضافه کرد.
سامانهی ما چند بخش اساسی دارد:
کدهای بخش نصب باید در فایل install.php
نوشته شود، در اولین بار مشاهدهی صفحهی نصب، باید پایگاه دادهای از نوع sqlite3
به نام
_db.sqlite
در همانجایی که فایل install.php
قرار دارد ساخته شود.
در این پایگاهداده باید یک جدول به نام options
وجود داشته باشد که ستونهای آن به شرح زیر است:
id
: integer PRIMARY KEY
subject
: text NOT NULL UNIQUE
count
: integer DEFAULT 0
همچنین اگر قبلا فرایند نصب انجام شده بود، خطای Already installed
نمایش داده شود.
کدهای این بخش باید در فایل add_option.php
نوشته شود.
اگر ریکوئست به این صفحه از نوع GET
بود، باید فرمی برای اضافه کردن گزینهی جدید به کاربر نمایش داده شود که در کد اولیه این پیادهسازی انجام شدهاست.
اگر ریکوئست از نوع POST
بود، باید گزینهی جدید به پایگاه داده اضافه شود و پیغام اضافهشدن با موفقیت به او نمایش داده شود.
کدهای این بخش در فایل index.php
زده میشود.
کاربر با مشاهده این بخش باید لیست گزینههای موجود و تعداد رایهای داده شده به آنها را مشاهده کند. هر کدام از گزینهها باید یک لینک به صفحهی رایدهی باشند.
کدهای این بخش در فایل vote.php
زده میشود.
این صفحه با گرفتن id
گزینه از طریق GET
رای کاربر را به گزینهی مورد نظر ثبت میکند، دقت کنید هر کاربر باید حداکثر یکبار قابلیت رایدهی داشته باشد. (برای این موضوع، از کوکیها استفاده کنید.)
پروژهی اولیه در زیر قرار گرفتهاست، تنها قسمتهایی که کامنت TODO: implement
دارند را پیادهسازی کنید و تغییری در بقیهی قسمتهای کد ایجاد نکنید.
دقت کنید هر بخش به شکل جدا نمرهدهی میشود و با پیادهسازی قسمتی از سوال، میتوانید نمرهی آن قسمت را دریافت کنید.
فایلهای
global.php
، index.php
، install.php
، add_option.php
و vote.php
را داخل یک فایل زیپ قرار داده و بارگذاری کنید.
میخواهیم یک کتابخانه برای تجزیهی جدول بنویسیم.
یکی از علاقهمندیهای ما در نوشتن این کتابخانه، شیگرا نوشتن آن است پس برای نوشتن آن کلاسهایی را در نظر میگیریم.
هدف اصلی ما این است که این کتابخانه ورودیای مانند زیر بگیرد:
و در آخر یک کد htmlشده از جدول مثل
خروجی دهد.
در ادامه به شرح کلاسها و جزئیات پیادهسازی آنها میپردازیم.
\Quera\CodeCup4\TableParser\Parser
🔗این کلاس کلاسِ اصلی ما است که دارای سه تابع زیر از نوع استاتیک است:
parse
که یک کد میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Table
بر میگرداند که جدول ساخته شده است، کد جدول از چندین سطر تشکیل شده که ستونهای هر سطر با |
از هم جدا شدهاند.parseHeader
که یک خط کد به عنوان سطر اول جدول میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Header
بر میگرداند و در صورت معتبر نبودن کد یک اکسپشن از نوع InvalidHeaderException
پرت میکند.parseRow
که یک خط کد به عنوان سطر جدول و یک Header
میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Data
بر میگرداند و در صورت معتبر نبودن کد یک اکسپشن از نوع InvalidRowException
پرت میکند.\Quera\CodeCup4\TableParser\Table
🔗این کلاس وظیفهی نگهداری جدول را بر عهده دارد و شامل توابع زیر است:
Header
و یک آرایه از نوع Data
میگیرد و جدول را از روی آن میسازد.getHeader
که سطر اول را بر میگرداند.getRows
که یک آرایه از سطرها برمیگرداند.render
که کد html
مربوط به جدول را ساخته و بر میگرداند.
این تابع تنها شامل تگهای table
، tr
، td
و th
است و خروجیای مانند شکل زیر دارد:دقت کنید هیچ فاصلهای در بین تگها یا در انتهای خروجی مجاز نیست.
\Quera\CodeCup4\TableParser\Row
🔗یک ابسترکت کلاس است که \Quera\CodeCup4\TableParser\Header
و \Quera\CodeCup4\TableParser\Data
این کلاس را به ارث میبرند.
\Quera\CodeCup4\TableParser\Header
🔗این کلاس وظیفهی نگهداری سطر اول جدول را بر عهده دارد و شامل توابع زیر است:
InvalidHeaderException
پرت شود.columnsCount
که تعداد ستونها را برگرداند.render
که باید یک کد html
با تگ tr
و th
به شکل زیر خروجی دهد:دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
\Quera\CodeCup4\TableParser\Data
🔗این کلاس وظیفهی نگهداری دیگر سطرهای جدول را بر عهده دارد و شامل توابع زیر است:
InvalidRowException
پرت شود.columnsCount
که تعداد ستونها را برگرداند.get
که یک ورودی مثل x
دارد، اگر ورودی از نوع عدد بود، آنگاه مقدار ستون x
ام (با شروع از ۰) سطر را برگرداند و در غیر اینصورت مقدار متناظر با سطر اولی که مقدار آن به شکل CamelCase
برابر با x
است را برگرداند. در هر دو صورت اگر ستون پیدا نشد یک اکسپشن از نوع ColumnNotFoundException
پرت کند.get*
دیگر توابعی که با get
شروع میشوند، باید به شکل CamelCase
مقدار ستون متناظر با هدرش را برگرداند (در مثالها توضیحات بیشتری داده میشود.) و در صورتی که تابع نامعتبر بود اکسپشنی از نوع InvalidMethodException
پرت شود.render
که باید یک کد html
با تگ tr
و td
به شکل زیر خروجی دهد:دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
کلاسهای دیگری نیز قابل استفاده هستند که در پروژهی اولیه آنها را میبینید.
CamelCase
🔗منظور از CamelCase
در تبدیل این است که فاصلههای رشته حذف شده و حروف اول همهی کلمات به شکل بزرگ و بقیهی حرفها به کوچک نوشته شوند. به طور مثال alireza amir
به AlirezaAmir
تبدیل شود.
یک نمونه از اجرای این کلاسها شکل زیر است:
پروژهی اولیه را میتوانید از زیر دانلود کنید. دانلود کدهای اولیه پروژه
در بارگذاری تنها کافی است پوشهی Quera
را داخل یک فایل زیپ قرار داده و ارسال کنید.
در این سوال از شما میخواهیم که بخشی از کوئرا فریمورک را طراحی کنید.
JWT(Json Web Token)
استفاده می شود.sqlite3
استفاده میشود.signUp
و signIn
) .\n
استفاده کنید.TODO: implement
دارند را پیادهسازی کنید.برای شروع پایگاه دادهای با نام qdb.sqlite
در جایی که bootstrap.php
در آن قرار دارد، ایجاد کنید.
در این پایگاه داده باید یک جدول به نام users
وجود داشتهباشد که ستونهای آن به شرح زیر است:
id
: INTEGER PRIMARY KEY NOT NULL
name
: TEXT NOT NULL
passWD
: TEXT NOT NULL
firstName
: TEXT NOT NULL
lastName
: TEXT NOT NULL
email
: TEXT NOT NULL
این تابع به عنوان تابع ورودی به spl_autoload_register
داده خواهد شد.
این تابع باید در صورت ایجاد شدن شیء از هر یک کلاسهای موجود در پوشهی برنامه، که ساختار نامگذاری فایل آنها بصورت class.نام کلاس.php
می باشد، فایل مربوط را require_once
کند.
این تابع باید exception
ٰهای دریافتی خود را در پوشه برنامه و در فایل exception.log
ذخیره کند.
به ازای هر exception
باید توضیحات آن را با فرمت زیر در خط جدیدی به فایل اضافه نمایید.
این تابع به عنوان ورودی به set_exception_handler
داده خواهد شد.
برای مثال یکی از خطوط ذخیره شده در فایل می تواند به این صورت باشد :
این تابع باید error
های دریافتی خود را در پوشه برنامه و در فایل error.log
ذخیره کند.
به ازای هر error
باید توضیحات آن را با فرمت زیر در خط جدیدی به فایل اضافه نمایید.
این تابع به عنوان ورودی به set_error_handler
داده خواهد شد.
برای مثال یکی از خطوط ذخیره شده در فایل میتواند به این صورت باشد:
exception
و error
الزامی برای استفاده از کلاس Log
نیست.QUERA_FRAMEWORK_ROOT
استفاده کنید.تنها ورودی آن ، آدرس فایل مورد نظر جهت ذخیره لاگ میباشد. در صورت عدم وجود آن فایل ، آن را ایجاد میکند.
دو ورودی message
و alertDetail
میگیرد و در انتهای فایل مورد نظر در خط جدید بصورت زیر مینویسد. در صورتی که فایل خالی بود از ابتدا فایل شروع میکند.
در این کلاس پنج تابع post
, get
, put
, delete
, resolve
را به نحوی پیادهسازی کنید که عملیاتهای زیر را انجام دهند.
هر یک از توابع post
, get
, put
, delete
سه ورودی میگیرند که به ترتیب زیر میباشند :
[s]
یا [i]
استفاده کرد که به ترتیب نشاندهندهی یک string
و integer
هستند./api/[i]/
باشد میتواند هرکدام از مسیر های /api/21312/
یا /api/3123/
یا /api/1/?test=sample
را مسیریابی کند.تابع resolve
نیز دو ورودی میگیرد که به ترتیب زیر میباشند:
GET
)resolve
در صورت یافتن مسیر مناسب تابع مورد نظر آن مسیریابی را با آرگومان های مشخص شده اجرا می کند و true
بر میگرداند و در صورت عدم یافتن مسیریابی مناسب false
بر میگرداند.[s]
می تواند هر کاراکتری بجز /
را شامل شود.Router
میتواند به صورت زیر باشد: اطلاعات ورودی ثبت نام یک کاربر را گرفته و در پایگاه داده ذخیره میکند. ورودیهای تابع به صورت زیر میباشند.
native password hashing API
موجود در PHP
و با استفاده از الگوریتم PASSWORD_BCRYPT
رمزگذاری کرده و سپس در پایگاه داده ذخیره کنید.یک نام کاربری و یک رمزعبور (بصورت رمزگذاری نشده) را به عنوان ورودی میگیرد و از پایگاه داده بررسی میکند که آیا اطلاعات ورودی صحیح است یا خیر.
این تابع SECRET
, HEADER
, PAYLOAD
را دریافت کرده و به عنوان خروجی JWT
را برمیگرداند.
HS256
میباشد.secret base64 encoded
نیست.TOKEN
را با فرمت صحیح برگردانید و برگرداندن SIGNATURE
به تنهایی کافی نیست.این تابع SECRET
, TOKEN
دریافت می کند و تایید میکند که آیا این TOKEN
با استفاده از این SECRET
مورد تایید است یا خیر.
فایلهای class.controller.php
، class.log.php
، class.router.php
، qdb.sqlite
و bootstrap.php
را داخل یک فایل زیپ قرار داده و بارگذاری کنید.