Scroll
PHP դասեր - Դաս 3.5 - Աշխատանք MySQL տվյալների բազայի հետ։ JOIN օպերատոր։ Ֆայլերի բեռնում սերվեր
Մինչ այս դասը գրելը, ես երկար մտածում էի, թե ինչպես ավելի լավ ներկայացնել JOIN օպերատորով հարցումները։ Բանն այն է, որ JOIN օպերատորը անհրաժեշտ է մի քանի աղյուսակներից միաժամանակ տվյալներ ընտրելու համար։ Իսկ եթե պահանջվում է երկրորդ աղյուսակ, եկեք այն ստեղծենք։ Ես առաջարկում եմ ստեղծել ֆայլերի աղյուսակ, որոնք այս դասում կբեռնենք ձևի միջոցով։ Այսպիսով, դասը կլինի երկու ուղղությամբ՝ ԲԴ-ի հետ աշխատանք և ձևերի հետ աշխատանք։
Եկեք սկսենք ֆայլ բեռնման դաշտի ավելացումից։ Որպեսզի ձևը կարողանա ֆայլեր բեռնել, անհրաժեշտ է ավելացնել համապատասխան տիպը ձևի պարամետրերում.
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';Այսպես, enctype պարամետրով մենք ցույց ենք տալիս բրաուզերին, որ այս ձևով ֆայլեր ենք փոխանցելու։ Հիմա, երբ ձևը պատրաստ է, ավելացնենք ֆայլ բեռնման դաշտը.
public function display_admin() { // հաղորդագրության մուտքագրման մեթոդ $content = ''; $content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; $content .= '<label for="title">Անուն:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" />'; $content .= '<div class="clear"></div>'; $content .= '<label for="bodytext">Հաղորդագրություն:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext"></textarea>'; $content .= '<input type="file" name="filename">'; // ֆայլ բեռնման դաշտ $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="Ավելացնել հաղորդագրություն" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">Վերադառնալ գլխավոր էջ</a></p>'; return $content; }input տիպի file դաշտով մենք բեռնում ենք ֆայլը։ Եթե պահպանեք ֆայլերը և թարմացնեք հաղորդագրության ավելացման էջը, ապա կտեսնեք ֆայլ բեռնման դաշտը։ Եկեք տեսնենք, թե ինչպես է ֆայլը փոխանցվում POST հարցմամբ։
public function write($p) { print_r($p); // տպում ենք ձևի զանգվածը print_r($_FILES); // տպում ենք ֆայլերի զանգվածը $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')'; return mysql_query($sql); }Այժմ բեռնենք որևէ ֆայլ և պահպանենք հաղորդագրությունը։ Բոլոր ֆայլերը, որոնք կբեռնվեն ձևի միջոցով, հասանելի կլինեն $_FILES սուպերգլոբալ փոփոխականում։ Ես բեռնեցի ֆայլ և ստացա հետևյալ զանգվածները․
Array ( [title] => asfasdf [bodytext] => asfasdf ) Array ( [filename] => Array ( [name] => ip.txt [type] => text/plain [tmp_name] => Y:\tmp\phpAA.tmp [error] => 0 [size] => 13 ) )Այժմ, երբ ունենք տվյալների և ֆայլի զանգված, եկեք ստեղծենք ֆայլերի աղյուսակ՝ բեռնված ֆայլերը պահպանելու համար։ Սկսենք ստեղծելով `files` թղթապանակ կայքի արմատում և տվեք նրան 777 իրավունքներ, որպեսզի սցենարը կարողանա այնտեղ ֆայլեր գրել։ Փոխենք buildDB() մեթոդի տվյալների բազայի հարցումը.
$sql = "CREATE TABLE Messages ( mid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(mid), title varchar(15), bodytext text, created int(11), file int(11) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE Files ( fid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(fid), filename varchar(255), filepath varchar(255), filemime varchar(255), filesize int(10), timestamp int(10) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";Բացի նոր աղյուսակի ավելացումից, Messages աղյուսակում ավելացվում է fid դաշտ՝ որպես արտաքին բանալի Files աղյուսակի համար։ Files աղյուսակի դաշտերն են՝ - **fid** – ֆայլի հիմնական բանալի, - **filename** – ֆայլի անունը, - **filepath** – ֆայլի ուղին կայքի արմատից, - **filemime** – ֆայլի MIME տիպը (օր.՝ text/plain, image/png), - **filesize** – ֆայլի չափը բայթերով, - **timestamp** – բեռնման ժամանակը։ Այժմ գրենք կոդը ֆայլը պահպանելու և տվյալների բազա ավելացնելու համար։ Կարող եք անհրաժեշտ դաշտերը ստեղծել phpMyAdmin-ով։
if($_FILES["filename"]["size"] > 1024*3*1024) { echo ("Ֆայլի չափը գերազանցում է երեք մեգաբայթը"); exit; } if(is_uploaded_file($_FILES["filename"]["tmp_name"])) { move_uploaded_file($_FILES["filename"]["tmp_name"], "/files/".$_FILES["filename"]["name"]); } else { echo("Ֆայլի բեռնման սխալ"); }Այժմ ֆայլը պահպանվում է `files` թղթապանակում։ Հաջորդ քայլով ֆայլի տվյալները ավելացնում ենք Files աղյուսակում։
$sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) VALUES ("'. $_FILES['filename']['name'] . '", "files/' . $_FILES['filename']['name'] . '", "'. $_FILES['filename']['type'] .'", '. $_FILES['filename']['size'] .', '. time() . ')'; mysql_query($sql);Այժմ, երբ ֆայլի գրառումը բազայում ավելացվեց, ավելացնում ենք նաև հաղորդագրությունը՝
$sql = 'INSERT INTO Messages (title, bodytext, created, fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ',LAST_INSERT_ID())';Ուշադրություն դարձրեք `LAST_INSERT_ID()` ֆունկցիային։ Այն վերադարձնում է տվյալների բազայում վերջին ավելացված գրառման ID-ը, տվյալ դեպքում՝ ֆայլի։ Հիմա գրառումները ավելացվում են աղյուսակներում, մնում է դրանք ցուցադրել JOIN օպերատորի օգնությամբ։ Փոխենք հաղորդագրությունների ընտրության հարցումը՝ ցուցադրելու նաև ֆայլի անունը։
public function display_public() { $content = ''; $sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC'; $result = mysql_query($sql) or die(mysql_error()); ...JOIN օպերատորը այստեղ օգտագործված է LEFT ձևով։ Դեռևս ընդունում ենք, որ LEFT JOIN-ը վերադարձնում է բոլոր գրառումները, այդ թվում՝ fid չունեցողները։ Եթե տպենք հարցման արդյունքը՝
while($row = mysql_fetch_array($result)) { print_r($row);Կտեսնենք որ ցուցադրվում են տվյալներ թե՛ հաղորդագրությունների, թե՛ ֆայլերի աղյուսակից։ Եթե ֆայլ չկա, դաշտերը կլինեն դատարկ, հետևաբար պետք է դրանք ստուգել։
if(!empty($row['filename'])) { $content .= '<p>Կցված ֆայլ՝ <a target="_blank" href="/'. $row['filepath'] .'">'. $row['filename'] .'</a></p>'; }Այժմ հաղորդագրության հետ նաև կցված ֆայլի հղում կցուցադրվի։ Հաջորդ դասում կծանոթանանք JOIN օպերատորի ավելի մանրամասն կիրառությանը՝ մի քանի աղյուսակների հետ աշխատանքում։ Ինչպես միշտ, կցվում է նաև թարմացված տվյալների բազայի պատճենը, պատրաստված phpMyAdmin-ով։