Monday, March 8, 2010

PHP: MySQL database холболт үүсгэх, query ажиллуулах

Өмнөх бичлэг дээр PhpMyadmin ашиглан database үүсгэх Query бичиж ажиллуулах талаар бичсэн. Одоо харин PHP source code дээрээс MySQL database-тай connection(холболт) үүсгэх, Query ажиллуулах талаар жаахан тайлбар хийе.

<?php
    $db_host='localhost';
    $db_database='example_db';
    $db_username='root';
    $db_password='';

    $db_conn = mysql_connect($db_host, $db_username, $db_password);
    
    if (!$db_conn){
        die ("DB connection not successful <br />". mysql_error());
    }else{
        echo "Connection successful <br />";
    }
    
    $db_select = mysql_select_db($db_database);
    
    if (!$db_select){
        die ("DB selection not successful <br />". mysql_error());
    }else{
        echo "DB selection successful<br />";
    }
    
    $query1 = "INSERT INTO `user` (user_name,user_last_name,user_pass,user_mail,age)
                    VALUES ( 'newuser', 'new', 'pass', 'newuser@mail.dm',20);";
    
    $r = mysql_query( $query1 );
    
    if (!$r){
        die ("Could not query1 the database: <br />". mysql_error());
    }else{
        echo "Query1 executed <br />";
    }
    
    $query2 = "select * from `user`";
    
    $result = mysql_query( $query2 );
    
    if (!$result){
        die ("Could not query2 the database: <br />". mysql_error());
    }

    while ($row = mysql_fetch_row($result)){
       echo "$row[0] "."$row[1] "."$row[2] "."$row[3] "."$row[4]<br />";
       
    }
    mysql_close($db_conn);
?>
PHP дээр MySQL database-тай mysql_connect() функцийн тусламжтай холбогдоно.
mysql_connect($db_host, $db_username, $db_password);
Харин энэ функцээр эхлээд host name (өөрийн компьютер дээр server ажиллуулж байгаа болохоор localhost нэртэй байна), мөн database-ийн user name(нэвтрэх нэр), password гэсэн гурван аргументийг дамжуулж холбогдоно. XAMPP суулгасан үед username нь root, password нь хоосон default утга авсан байдаг. Холболт амжилтгүй болон тохиолдолд mysql_connect() функц маань false (null, 0) утга буцаадаг. Амжилтай болсон эсэхийг доор нь if() нөхцөл шалгаж
DB connection not successful / Connection successful мэдээллүүдийг хэвлэхээр source code дээр бичлээ.

MySQL database-тай холбогдсон бол mysql_select_db() функцийн тусламжтай үүсгэсэн database-ийг сонгож идэвхижүүлнэ.

Харин query-г execute(гүйцэтгэл) хийлгэхийн тулд mysql_query( ) функцийн дундуур query-ээ argument болгож дамжуулна. Манай жишээнд:
INSERT INTO `user` (user_name,user_last_name,user_pass,user_mail,age)
VALUES ( 'newuser', 'new', 'pass', 'newuser@mail.dm',20);
query-г
user_name = 'newuser',
user_last_name = 'new',
user_pass = 'pass',
user_mail = 'newuser@mail.dm',
age = 20 утгуудыг авахаар бичиж гүйцэтгүүллээ.

Дараа нь
select * from `user`
query-г ажиллуулж, буцаасан утгыг нь mysql_fetch_row() фунцкийн тусламжтай $row массив хувьсагчид утгыг оноож дэлгэцэнд хэвлэх үйлдлийг гүйцэтгүүллээ.

Эцэст нь mysql_close(); функцийн тусламжтой database connection-оо салгаж байна.

Хэд хэдэн удаа refresh хийгээд харвал web browser дээр маань иймэрхүү л үр дүнг харуулж байна даа :)



MySQL: PhpMyAdmin ашиглан database үүсгэх, query бичих

LAMP/WAMP server-ийг суулгахад хамт суудаг нэгэн "мундаг" хэрэгсэл бол phpmyadmin юм. Ихэнхи Server-үүдэд web application-аа байрлуулахад database үүсгэх, тохиргоо хийх зэрэгт phpmyadmin багажыг ашигладаг. LAMP/WAMP server ажиллаж байгаа үед цахим хөтөчийхөө хаягийн мөрөн дээр http://localhost/phpmyadmin/ бичихэд дараах байдалтай цонх гарч ирнэ.

Зүүн талын багананд database-ууд харагдаж байна. Database шинээр үүсгэхдээ MySQL localhost дотор Create new database хэсэгт өгөгдлийн сангийхаа нэрийг бичээд Create товчин дээр дарна. Жишээлбэл: example_db

Database example_db has been created.
гэсэн бичиг гарч байвал асуудалгүй database маань үүслээ гэсэн үг. Харин одоо database-даа table шинээр үүсгэх хэрэгтэй. Name талбарт table-ийн нэр, Number of fields-т table дэх утгуудын тоо(мэдээллийн төрлийн тоо). Жишээ болгоод user table-ийг 6 field-тэй байхаар бөглөөд Go.

Field багананд field-ийн нэр, Type багананд field-ийн өгөгдлийн төрөл, Length/Values1 тэмдэгт мөрийн уртын хязгаар г.м, Null багананд дахь checkbox нь тухайн field нь null утга авах эсэхийг, A_I (auto increment) багана нь тухайн table-д өгөгдөл оруулах бүрт тоон төрлийн мэдээлэл нь автоматааар өсөх (индекслэх гэх мэт мэдээллийг автоаматаар олгох зэрэгт хэрэглэнэ).

Жишээ болгоод
user_id int auto_increment
user_name varchar(50)
user_last_name varchar(50)
user_pass varchar(50)
user_mail varchar(50)
age int
гэж бөглөөд Save дар. 50 гэсэн утгыг Length/Values1 баганад дахь хэсэг бөглөж өгнө.

Table `example_db`.`user` has been created. бичиг гарч, доорхи query харагдаж байвал асуудалгүй гэсэн үг.
CREATE TABLE `example_db`.`user` (
`user_id` INT NOT NULL AUTO_INCREMENT ,
`user_name` VARCHAR( 50 ) NOT NULL ,
`user_last_name` VARCHAR( 50 ) NOT NULL ,
`user_pass` VARCHAR( 50 ) NOT NULL ,
`user_mail` INT NOT NULL ,
`age` INT NOT NULL ,
PRIMARY KEY ( `user_id` )
) ENGINE = MYISAM ;

Одоо SQL Query ашиглан үүсгэсэн `user` хүснэгтэндээ өгөгдөл оруулъя. Үүний тулд SQL tab дээр дарж, Run SQL query/queries on database-ийн доорхи text aread дараах query-г бичиж Go товчин дээр дарж ажиллуулна.
INSERT INTO `user` 
VALUES (1, 'Gansukh', 'B', 'mypass', 'bganaa2009@gmail.com',18);

Дээд хэсэгт
1 row(s) inserted.
Inserted row id: 1 ( Query took 0.0004 sec ) гэсэн утгатай бичиг гарах ёстой.

Одоо SQL tab дээр дарж
SELECT * FROM `user` WHERE 1
гэсэн Query-г нь ажиллуулж үзвэл `user` хүснэгтэнд бидний оруулсан өгөгдлүүд харагдана. Амжилттай туршсан бол баяр хүргэе :)

SQL Server-ийг тусад нь суулгасан бол энэ хаягаар орж илүү дэлгэрүүлэн судалж болно. Миний бичиж байгаа хичээлийн хувьд бол Apache, MySQL, PHP -ийг нэг дор багтаасан XAMPP(WAMP/LAMP) ашиглаж байгаа учир тэр бүрийг нарийн бичихээс татгалзлаа.



MySQL

MySQL нь холбоост өгөгдлийн санг удирдах систем юм. MySQL хэмээх нэрний хувьд уг системийг санаачлан хөгжүүлэгч Micheal Widenius-ын охины нэр My + SQL(Structed Query Language) гэсэн утгатай ажээ.

Энэ систем нь GNU (General Public License) буюу нээлтэй эхийн систем учир хүссэн хэн бүхэн хөгжүүлэлтэнд оролцож, үнэгүй хэрэглэж болох юм. Эзэмшигч нь алдарт Java-г хөгжүүлсэн Sun MicroSystems компани байсан ба, одоогоор Sun-г Oracle корпораци эзэмших болсон билээ.

Үнэгүй програм хангамжийн өгөгдлийн санг удирдах системд ихэвчлэн MySQL-ийг хэрэглэдэг бөгөөд тэдгээрийн сонгодог жишээ гэвэл Joomla, Drupal, Wordpress, phpBB гэх мэт агуулга удирдах системүүд (CMS-Content Management System), Wikipedia, Facebook, Google гэх мэт гигантууд юм.

Хөгжүүлэлт нь C/C++ хэл дээр хийгдсэн ба AIX, BSDi, FreeBSD, HP-UX, i5/OS, Linux, Mac OS X, NetBSD, Novell NetWare, OpenBSD, OpenSolaris, eComStation, OS/2 Warp, QNX, IRIX, Solaris, Symbian, SunOS, SCO OpenServer, SCO UnixWare, Sanos, Tru64, Microsoft Windows гэсэн олон үйлдлийн системүүд дээр ажилладаг.

Үнэгүй, вэб програмчлалын тал дээр найдвартай хурдан ажилладаг учир Вэб хөгжүүлэгчид маань MySQL-ийг ихэвчлэн хэрэглэдэг.

Monday, February 8, 2010

Proactive network Provider Participation for P2P (P4P)

"Архаг интернэтчид" маань Peer to peer (P2P) хэмээх ойлголтыг мэддэг, хэрэглээндээ ашигладаг байх гэж бодож байна.

Ерөнхий ойлголтыг энгийнээр тайлбарлавал бид интернэтээс өгөгдлийг байршуулж татахдаа ихэвчлэн ямар нэг тусгай зориулалтын сервер ашигладаг. Хэрэв тухайн серверийн үйл ажиллагаа доголдсон юм уу хаягаа өөрчилсөн бол татах боломжгүй болж хувирдаг. Харин P2P технологи нь 2000 оноос эхлэн хөгжиж эхэлсэн ба ISP, серверээс үл хамааран тухайн мэдээлэл байршиж буй бүхий л хэрэглэгчдийн компьютерээс өгөгдлийг солилцох, хуваалцах боломжийг олгон хостуудын ачааллыг хөнгөвчилсн шинэлэг технологи юм. Үүний хамгийн сонгодог жишээ гэвэл Торрент. Интернэтийн сүлжээнд холбогдсон хэрэглэгчдийн тоогоор тухайн файлыг зэрэг татаж, тухайн татсан файлыг бусад интернэт хэрэглэгчидтэй хуваалцдаг.

Хэрвээ торрент хэрэглэн юм татаж байхдаа анзаарсан бол down, up гэсэн 2 хурдны үзүүлэлт дэлгэцэн дээр гардаг. Up гэсэн хурдны үзүүлэлт нь таны компьютерээс бусад хэрэглэгчид татаж авч байгаа хурд юм. Нэг файл татаж авах үйл явц үргэлжилж байх явцад ч тухайн файлын татаж авсан хэсгээс чинь өөр хэрэглэгч татаж авах боломжтой.

Гэвч энэ технологийг хэрэглэгчид бид entertainment тал руу нь, ихэвчлэн том хэмжээний кино татах мэтэд хэрэглэдэгээс болж интернэт урсгалын ихэнх хэсгийг хэдхэн хүний файл татах үйл явц эзэлж, бусад хэрэглэгчдийн интернэсэд хандах урсгалыг эзлэх сөрөг тал анзаарагдах болсон байна. Үүний эсрэг ISP-уудаас P2P урсгалыг хаах, хязгаарлах арга хэмжээг авдаг тал бий. Үүнийг хөнгөвчлөх нэгэн шийдэл нь P4P(Proactive network Provider Participation for P2P) болсон байна.

P4P нь сүлжээний технологийг оновчтойг, илүү боловсронгуйгаар ISP дотроо зохион байгуулах юм. Зөвхөн ISP дотооддоо ч гэлтгүй ISP-ууд хоорондоо хамтран ажиллаж P2P-ээс болж гарч байсан асуудлыг шийдэх юм. Хэрэв Монголд P4P нэвтэрлээ гэхэд торрентоор татахад аль дэлхийн бөөр Америкт байгаа хэрэглэгчдийн компьютерээс татаж авах биш, хамгийн эхлээд тэр файлыг татаж авсан Монгол дахь хэрэглэгчид, цаашлаад азийн орнуудыхаа хэрэглэгчдээс татаж авах, тэдэнтай хуваалцах замыг эрэлхийлнэ гэсэн үг юм. Ингэснээрээ одоогийн 2P2 технологиос хэд дахин хурдан болгож сайжруулах боломжтой гэнэ.

P4P нь ISP, content distributor(агуулга түгээгч), P2P үйлчигээ үзүүлэгч байгуулагуудын хамтын нэгдлээс бүтэх ба ISP компаниуд нь iTracker хэмээх технолгийг ашиглана. Ингэснээр P2P дурийн peer-ээс татдаг байсныг илүү ойрхоноос peer-г сонгож татахаар оновчлолыг бий болгох юм.



Ашигласан холбоосууд: P4P (en.wikipedia.org), P2P (Wikipedia)

Monday, January 25, 2010

PHP: Олон хэмжээст массивын хэрэглээ

Өмнөх бичлэг дээр нэг хэмжээс массивийг хэрхэн хэрэглэх талаар нэлээд дэлгэрэнгүй бичсэн. Харин 2 ба түүнээс дээш тооны индэксээр хандах олон хэмжээс массивийн талаар энд дурдъя.

C/C++, Java гэх мэт өргөн тархсан хэн бүхний анхлан сурч хэрэглэж ирсэн програмчллын хэлүүдэд массивий индексээ бүхэл тоогоор авдаг, тэр зарчмаараа хэрэглэхэд асуудал гарахгүй учир тэр талаар яриаг орхилоо. Харин PHP хэлний гол онцлог болох "уян хатан" байдлыг илэрхийлсэн хэдэн жишээ кодыг тайлбарлаад массивтай холбоотой өргөн хэрэглэгдэх стандарт функцуудыг тайлбарлая.

Жишээ нь манай мэргэжлийхэн үздэг хичээлүүдийг суурь хичээл буюу fundamental, мэргэжлийн хичээл буюу professional, гэж ангилаад дотор нь хичээлийн кодоор ялгаад хандах, өөрөөр хэлбэл 2 түлхүүр үг буюу индексээр хандах 2 хэмжээст массивыг үүсгэж үзье.

<?php
        $lessons = array(
                'professional' => array('CS204' => 'Data structures',
                                        'SE310' => 'Wireless programmin',
                                        'CS207' => 'Operating system theory'),
                'fundamental' => array('MT201' => 'Discrete Math',
                                        'EL210' => 'English 2'));
        echo $lessons['professional']['CS207']."<br><br>";
        foreach($lessons as $lkey => $type){
                echo "$lkey lessons:<br>";
                while(list($code, $name) = each($type)){
                        echo "$code $name<br>";
                }
                echo "<br>";
        }
?>
Үр дүн нь:

Operating system theory

professional lessons:
CS204 Data structures
SE310 Wireless programmin
CS207 Operating system theory

fundamental lessons:
MT201 Discrete Math
EL210 English 2

Дээрхи кодыг уншаад, туршиж үзээд жаахан анализ хийгээд энгийнээр тайлбарлавал "PHP хэлний олон хэмжээст массив гэдэг нь элемэнт нь массив байж болох нэг хэмжээс массив юм" гэсэн рекурсив ч гэмээр дүгнэлт гарч ирнэ. Үүний баталгаа болгоод нэг код туршиж үзье.
<?php
        $a = array('Hello World!',
                   array('PHP','Programming', 'Language!'),
                   'Welcome!');
        echo $a[0]."<br>";
        for($i = 0; $i < 3; $i++){
                echo $a[1][$i]." ";
        }
        echo "<br>$a[2]";
?>
Үр дүн нь:

Hello World!
PHP Programming Language!
Welcome!


Олон хэмжээст массивыг ашиглахад хэрэглэгддэг хүчирхэг функцүүдийг нэг нь массивийн индекстэй ижил нэртэй хувьсагчид массивиын элемэнтийн утгыг оноодог extract функц юм. Жишээ код:
<?php
        $pro = array('CS204' => 'Data structures',
                     'SE310' => 'Wireless programmin');
        extract($pro);
        echo "$CS204<br>$SE310";
?>
Үр дүн:

Data structures
Wireless programmin

Өргөн хэрэглэж болох функцууд:

Array_push( array_name, element1, element2.. elements) - өгөгдсөн массивт өгөгдсөн элемэнтүүдийг дарааллаар нь нэмэх функц

Array_pop( array_name) - өгөгдсөн массивийн хамгийн сүүлчийн элемэнтийн утгыг буцааж, устгах үйлдэл.

Array_unshift( array_name,elements) - Массивын эхэнд өгөгдсөн элэмэнтүүдийг нэмэх функц

Array_shift( array) - массивын хамгийн эхний элемэнтийн утгыг буцааж устгах үйлдэл

Array_merge( array1,array2) - өгөгдсөн 2 массивыг нэгтгэн залгах үйлдэл

Array_keys( array) - өгөдсөн массивын индексүүдийг нэг массив болгон массив төрлийн утга буцаах функц

Энэ мэт олон функцууд PHP хэлний маань санд байгаа, PHP маань өөрөө агуу баялаг хэл учир тэр бүгдийг тайлбарлаж бичвэл цаг их орох тул уншигч эрхэм та бие даан тэдгээрийг судалбал зохино.