Çàïðîñû â PHP
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
 ïðåäûäóùåì óðîêå ìû ïîçíàêîìèëèñü ñ îñíîâàìè ÿçûêà SQL è òåïåðü ïîïðîáóåì ïðèìåíèòü ýòè çíàíèÿ íà ïðàêòèêå.
Âñå çàïðîñû â PHP â îñíîâíîì âûïîëíÿþòñÿ ñ ïîìîùüþ ôóíêöèè mysql_query(). Ôóíêöèÿ ïðèíèìàåò äâà ïàðàìåòðà: ñòðîêó çàïðîñà è èäåíòèôèêàòîð ïîäêëþ÷åíèÿ, ïîëó÷åííûé ïîñëå âûçîâà mysql_connect().  ïðèíöèïå, èäåíòèôèêàòîð ïîäêëþ÷åíèÿ ìîæíî íå óêàçûâàòü, òîãäà áóäåò èñïîëüçîâàòüñÿ ïîñëåäíåå ñäåëàíîå ïîäêëþ÷åíèå. Íî òàêîé ïîäõîä ÷ðåâàò îøèáêàìè â ñëîæíûõ ñêðèïòàõ ñ íåñêîëüêèìè îäíîâðåìåííûìè ïîäêëþ÷åíèÿìè ê ðàçëè÷íûì áàçàì.
 êà÷åñòâå ïåðâîãî ïðèìåðà âûáåðåì âñå ñòðîêè èç íàøåé òàáëèöû:
<?php $sql = 'SELECT id, user_ip, user_agent FROM user_tracker'; $qry = mysql_query($sql, $dblink); if(!$qry) { echo 'Îøèáêà âûïîëíåíèÿ çàïðîñà: ' . mysql_error(); exit(); } // îáðàáàòûâàåì ðåçóëüòàòû çàïðîñà ?>
Ôóíêöèÿ mysql_query() ïîçâðàùàåò ññûëêó íà ðåçóëüòàòû âûïîëíåíèÿ çàïðîñà. Åñëè çàïðîñ çàâåðøèëñÿ ñ îøèáêîé - ôóíêöèÿ âåðí¸ò false, ïîñëå ÷åãî òåêñò îøèáêè ìîæíî áóäåò ïîëó÷èòü âûçîâîì ôóíêöèè mysql_error(), à íîìåð îøèáêè - ôóíêöèåé mysql_errno().
Äëÿ ïîëó÷åíèÿ îòäåëüíîé çàïèñè èç ðåçóëüòàòîâ çàïðîñà íåîáõîäèìî âîñïîëüçîâàòüñÿ îäíîé èç fetch-ôóíêöèé (ôóíêöèè ïîëó÷åíèÿ äàííûõ). Èõ íåñêîëüêî è êàæäàÿ óäîáíà â ñâî¸ì ñëó÷àå.
mysql_fetch_array($result, $type) |
|
|
$result - ýòî ïåðåìåííàÿ, ïîëó÷åííàÿ ïîñëå âûçîâà mysql_query() Ïàðàìåòð $type îïèñûâàåò ôîðìàò âîçâðàùàåìûõ äàííûõ. Ìîæåò ïðèíèìàòü îäíî èç òð¸õ çíà÷åíèé: MYSQL_NUM. Ôóíêöèÿ âîçâðàùàåò íóìåðîâàííûé ìàññèâ, ãäå íóëåâîé ýëåìåíò - çíà÷åíèå íóëåâîãî ïîëÿ, ïåðâûé ýëåìåíò - çíà÷åíèå ïåðâîãî ïîëÿ è ò.ä. (ïîëÿ ñ÷èòàþòñÿ "ñëåâà íàïðàâî" â òîì ïîðÿäêå, â êîòîðîì áûëè îáúÿâëåíû â çàïðîñå): <?php ... $row = mysql_fetch_array($qry, MYSQL_NUM); echo "IP-àäðåñ ïîëüçîâàòåëÿ: " . $row[1]; echo "Èñïîëüçóåìûé áðàóçåð: " . $row[2]; ... ?> MYSQL_ASSOC. Ôóíêöèÿ âîçâðàùàåò àññîöèàòèâíûé ìàññèâ, â êîòîðîì ýëåìåíò ñ èìåíåì ïîëÿ ñîäåðæèò çíà÷åíèå ýòîãî ïîëÿ. <?php ... $row = mysql_fetch_array($qry, MYSQL_NUM); echo "IP-àäðåñ ïîëüçîâàòåëÿ: " . $row['user_ip']; echo "Èñïîëüçóåìûé áðàóçåð: " . $row['user_name']; ... ?> MYSQL_BOTH. Âîçâðàùàåòñÿ ìàññèâ, â êîòîðîì ìîæíî îäíîâðåìåííî îáðàùàòüñÿ ê äàííûì è ïî íîìåðó è ïî èìåíè. <?php ... $row = mysql_fetch_array($qry, MYSQL_NUM); echo "IP-àäðåñ ïîëüçîâàòåëÿ: " . $row[1]; echo "Èñïîëüçóåìûé áðàóçåð: " . $row['user_agent']; ... ?>
|
mysql_fetch_assoc ( $result ) |
|
Ôóíêöèÿ ïîëüíîñòüþ àíàëîãè÷íà ôóíêöèè mysql_fetch_array() ñ óêàçàíèåì òèïà MYSQL_ASSOC. |
|
mysql_fetch_row ( $result ) |
|
Ôóíêöèÿ ïîëüíîñòüþ àíàëîãè÷íà ôóíêöèè mysql_fetch_array() ñ óêàçàíèåì òèïà MYSQL_NUM. |
|
mysql_fetch_object ( $ result ) |
|
Ôóíêöèÿ âîçâðàùàåò îáúåêò, ñîäåðæàùèé ñâîéñòâà, îäíîèì¸ííûå ïîëÿì ðåçóëüòàòîâ çàïðîñà. Çíà÷åíèÿ ýòèõ ñâîéñòâ âñåãäà òåêñòîâîãî òèïà è ðàâíû çíà÷åíèþ ñîîòâåòñòâóþùåãî ïîëÿ. <?php ... $row = mysql_fetch_object($qry); echo "IP-àäðåñ ïîëüçîâàòåëÿ: " . $row->user_ip; echo "Èñïîëüçóåìûé áðàóçåð: " . $row->user_agent; ... ?>
|
|
Âñå fetch-ôóíêöèè ðàáîòàþò ïî îäíîìó àëãîðèòìó. Ïðè ïåðâîì âûçîâå ôóíêöèÿ ïðîâåðÿåò íàëè÷èå ñòðîê è åñëè ðåçóëüòàò çàïðîñà íå ïóñòîé - âîçâðàùàåò ïåðâóþ ñòðîêó è ïåðåâîäèò óêàçàòåëü òåêùåé ñòðîêè íà ñëåäóþùóþ çàïèñü. Ïðè êàæäîì ïîñëåäóþùåì âûçîâå ôóíêöèÿ âîçâðàùàåò ïîëüçîâàòåëþ òåêóùóþ ñòðîêó è ïåðåõîäèò ê ñëåäóþùåé. Åñëè äîñòèãíóòà ïîñëåäíÿÿ ñòðîêà è ïåðåäàâàòü áîëüøå íå÷åãî - ôóíêöèÿ âîçâðàùàåò false.
Òàêèì îáðàçîì, öèêë ïåðåáîðà âñåõ çàïèñåé áóäåò âûãÿäåòü òàê:
<?php ... // ïîëó÷àåì ïåðâóþ ñòðîêó $row = mysql_fetch_object($qry); while ($row) { // îáðàáàòûâàåì ïîëó÷åííûå äàííûå echo "IP-àäðåñ ïîëüçîâàòåëÿ: " . $row->user_ip; echo "Èñïîëüçóåìûé áðàóçåð: " . $row->user_agent; // ïîëó÷àåì ñëåäóþùóþ ñòðîêó $row = mysql_fetch_object($qry); } ... ?>
Èíîãäà âîçíèêàåò íåîáõîäèìîñòü ïåðåäâèãàòüñÿ ïî çàïèñÿì íå òîëüêî "âïåð¸ä", íî è "íàçàä", ò.å. ïî íàïðàâëåíèþ îò òåêóùåé ñòðîêè ê ïåðâîé.  ýòîì ñëó÷àå íàäî èñïîëüçîâàòü ôóíêöèþ mysql_data_seek(), êîòîðàÿ ïîçâîëÿåò ïåðåéòè ê çàïèñè ñ çàäàííûì íîìåðîì.
<?php ... // $x - òðåáóåìûé íîìåð ñòðîêè $x = 100; if(mysql_data_seek($qry, $x)) echo 'óñïåøíî ïåðåøëè ê ñòðîêå ¹' . $x; else echo 'ïåðåéòè ê ñòðîêå ¹' . $x . ' íå óäàëîñü'; ... ?>
Çíà÷åíèå íîìåðà ñòðîêè äîëæíî áûòü â äèàïàçîíå îò 0 äî êîëè÷åñòâà ñòðîê â ðåçóëüòàòàõ çàïðîñà. Êîëè÷åñòâî ñòðîê ìîæíî óçíàòü ïðè ïîìîùè ôóíêöèè mysql_num_rows (). Ñ ó÷¸òîì ýòîãî, ìîæíî ïåðåïèñàòü ïðåäûäóùèé ïðèìåð â áîëåå áåçîïàñíîé ôîðìå:
<?php ... // $x - òðåáóåìûé íîìåð ñòðîêè $x = 100; if($x < mysql_num_rows($qry)) mysql_data_seek($qry, $x); else echo "ïåðåéòè ê ñòðîêå ¹" . $x . " íå óäàëîñü." . "Ñòðîêà ñ òàêèì íîìåðîì íå ñóùåñòâóåò."; ... ?>
Îäíàêî mysql_num_rows() ïðèìåíèìà òîëüêî ê ðåçóëüòàòàì âûïîëíåíèÿ SELECT. Ïðè âûïîëíåíèè âñåõ îñòàëüíûõ êîìàíä (INSERT, UPDATE è DELETE) ôóíêöèÿ âîçâðàùàåò 0 (âåäü ñåðâåð íå âîçâðàùàë íè îäíîé ñòðîêè). ×òîáû îïðåäåëèòü, ñêîëüêî ñòðîê áûëî âñòàâëåíî, èçìåíåíè èëè óäàëåíî ïðè âûïîëíåíèè ïîñëåäíåãî çàïðîñà íåîáõîäèìî âîñïîëüçîâàòüñÿ ôóíêöèåé mysql_affected_rows().
Íàïðèìåð, ñëåäóþùèé êîä ïîìîãàåò óçíàòü ðåçóëüòàòû î÷èñòêè òàáëèöû:
<?php $sql = "DELETE FROM user_tracker"; $qry = mysql_query($sql, $dblink); if($qry) echo 'Óäàëåíî ' . mysql_affected_rows() . ' ñòðîê.'; else 'Îøèáêà óäàëåíèÿ: ' . mysql_error(); ?>
Åñëè âàì íåîáõîäèìî óçíàòü çíà÷åíèå àâòîèíêðåìåíòíîãî ïîëÿ äëÿ òîëüêî ÷òî âñòàâëåííîé çàïèñè - âîñïîëüçóéòåñü ôóíêöèåé mysql_insert_id().
<?php $sql = "INSERT user_tracker (session_id, enter_dt, 'user_ip') ". "VALUES('ahduyfis', NOW(), '192.168.10.33')"; $qry = mysql_query($sql, $dblink); if($qry) { echo 'Äîáàâëåíà çàïèñü ñ id = ' . mysql_insert_id($dblink); } else 'Îøèáêà äîáàâëåíèÿ: ' . mysql_error(); ?>
Êàê óæå ãîâîðèëîñü ðàíåå - âñå òåêñòîâûå çíà÷åíèÿ â çàïðîñàõ çàïèñûâàþòñÿ â îäèíàðíûõ êàâû÷êàõ. Íî î÷åíü ÷àñòî âîçíèêàåò ñèòóàöèÿ, êîãäà íåîáõîäèìî çàíåñòè ñòðîêó, â êîòîðîé óæå åñòü êàâû÷êè (íàïðèìåð, ïàðîëü âèäà "my'1super'2password"). Åñëè ïîïðîáîâàòü âíåñòè å¸ â èñõîäíîì âèäå, òî MySQL íå ñìîæåò îáðàáîòàòü çàïðîñ è âûäàñò ñîîòâåòñòâóþùóþ îøèáêó. ×òîáû ýòîãî èçáåæàòü íåîáõîäèìî ïðåäâàðèòåëüíî ïîäãîòîâèòü ñòðîêó ê çàíåñåíèþ. Äëÿ ýòîãî ïðèìåíÿåòñÿ ôóíêöèÿ mysql_real_escape_string(). Îíà ïðåîáðàçóåò âñå ñëóæåáíûå è íå÷èòàåìûå ñèìâîëû â ñîîòâåòñòâóþùèå èì ñïåöñèìâîëû, òàêèå êàê \x00, \n, \r è ò.ï.
Îáÿçàòåëüíàÿ ïðîâåðêà âñåõ äàííûõ ïåðåä çàíåñåíèåì â òàáëèöó íå òîëüêî ÿâëÿåòñÿ ïðèçíàêîì "õîðîøåãî òîíà" ñðåäè ïðîãðàììèñòîâ, íî è ÿâëÿåòñÿ íàñóùíîé íåîáõîäèìîñòüþ äëÿ çàùèòû ñàéòà îò âçëîìà è õèùåíèÿ äàííûõ.
<?php $session_id = mysql_real_escape_string('ahduyfis'); $user_ip = mysql_real_escape_string('192.168.10.33'); $sql = "INSERT user_tracker (session_id, enter_dt, 'user_ip') ". "VALUES($session_id, NOW(), $user_ip)"; ... ?>
Ïðè íàïèñàíèè ñëîæíûõ çàïðîñîâ ëó÷øå âñåãî ïðåäâàðèòåëüíî çàïðîñ èñïûòàòü ïðè ïîìîùè ñòîðîííèõ ïðîãðàìì, à òîëüêî ïîòîì äîáàâëÿòü åãî â êîä. Òàêîé ïîäõîä ñóùåñòâåííî îáëåã÷àåò òåñòèðîâàíèå êàê çàïðîñà, òàê è ñêðèïòà â öåëîì.