Поздрав свима, овим почињемо серије о PHP и MySQL, у виду неких трикова и трипова :).
Као што сам навео у последњем посту о JSON-у и PHP-у, у задње време радим са базом библиотеке факултета. Ишчитане податке приказујем помоћу jQuery-јевих DataTables. Примери које сам нашао и употребио у раду са базом су користили класичне mysql драјвере. У консултацији са асистентом, одлучили смо да користимо PDO драјвере. Пошто користим објектни PHP, PDO драјвери су логичан след ствари, јер омогућују да се резултатима упита аутоматски попуњавају објекти, који ће се инстанцирати на основу класе коју сами дефинишете. То је мени било врло интересантно, и на крају крајева био изазов. У преправкама кода, морао сам да преправљам и дефинисане MySQL упите. Ту долазимо до трипа и трика, који сам хтео да вам откријем.
У раду са DataTables, при позивању PHP скрипте која се налази на серверу, шаљу се параметри, међу којима и параметри о броју приказаних објеката, које добијете из упита. Тим параметрима се попуњава део упита, који изгледа овако:
"LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".mysql_real_escape_string( $_GET['iDisplayLength'] );
Искључимо функцију mysql_real_escape_string која припада класичним MySQL драјверима. Треба је заменити PDO еквивалентом, што представља мој следећи изазов. Овај део упита се комбинује са делом за сортирање и главним SELECT делом, и добија се упит који се изврши и врати тачно онолико објеката у табелу, колико је речено овим LIMIT упитом. Дакле, iDislpayStart говори бази од ког реда резултата узима податке, а iDisplayLength колико ће редова узети. Истовремено, је потребно вратити и податак о броју редова који је упит вратио, без LIMIT-а, наравно. То је трип, сложићете се. У почетку ми ово није било познато, тако да сам имао проблема. За параметре који се шаљу LIMIT наредби, користи се једна спуштајућа листа, са предефинисаним бројем резултата које желите да видите у табели (10,25,50,100). Колико год да сам изабрао, резултата је увек било, али исто онолико колико сам селектовао. То ми је било чудно, јер је резултата било више.
Део упита који сам намерно изоставио је био SQL_CALC_FOUND_ROWS, који иде одмах после SELECT наредбе. Незнајући сврху овога, јавили су се већ поменути проблеми. На крају сам на тежи начин научио чему ова наредба служи :). Наиме, коришћење овакве функције је много брже него извођење неког упита са LIMIT и без LIMIT наредбе. Она ће, при првом упиту израчунати број редова које упит врати, не рачунајући ограничења LIMIT-а. То је трик ;). Овим ћете једним ударцем (упитом), завршити два посла.
Упитом који следи, ћете покупити број објеката, које сте добили упитом. На овај начин, који је бржи, добијате број враћених података и лимитиране податке за испис у табели.
Ево sql упита:
SELECT FOUND_ROWS()
Надам се да ће неком бити од помоћи. Видимо се ускоро! 😉