Friday, April 30, 2010

PHP: Session-ы тухай && Login хийж нэвтрэх энгийн жишээ

Вэб програмчлалд зайлшгүй хэрэглэгддэг ойлголтуудын нэг нь Session юм. "Session" нь англи хэл дээр "хурал, чуулган" гэсэн утга илэрхийлдэг. Харин Вэб програмчлалын хувьд session гэдэг нь хэрэглэгч вэб үзэх(нэвтрэх гэх мэт) сервер дээр тухайн хэрэглэгчтэй холбоотой мэдээлэл(хувьсагч) сервер дээр үүсэх үйл явц хэмээн энгийнээр тайлбарлаж болох юм. Жишээ нь ямар нэг гишүүнчлэл бүхий сайтуудад уншигч, хэрэглэгчид өөрийн хэрэглэгчийн эрхээр нэвтрээд ижил хуудсуудаар "аялахад" тухайн хэрэглэгчид л хамаарах мэдээллүүдийг харуулдаг шүү дээ. Үүнийг session-ы тусламжтай програмчилдаг.

Дээрхи зургаас session-ыг боловсруулах үйл явцыг хялбархан ойлгож болно.

Одоо хэдэн энгийн жишээг PHP дээр нэвтрүүлье.

<?php
    session_start();
?>

Session ашиглахын тулд тухайн хуудасныхаа эхэнд session_start(); функцийг зайлшгүй дуудах ёстой.

<?php
    session_start();
    $_SESSION['hello'] = 'Hello World';
    echo $_SESSION['hello'];
?>

Session-д хадгалагдаж буй өгөгдөл(хувьсагч)-үүд $_SESSION[] массив хувьсагчид хандах байдлаар ажилладаг. Дээрхи жишээнд $_SESSION['hello'] хувьсагчид 'Hello World' утгыг оноож хэвлэж байна.

Дээрхи жишээг амжилттай туршсан бол Session-ы үйл ажиллагааг илүү сайн ойлгохын тулд дараах кодыг өөр эх файлд хадгалаад ажиллуулаад үз.

<?php
    session_start();
    echo $_SESSION['hello'];
?>

Энэ кодын хувьд $_SESSION['hello'] хувьсагчид утга оноогоогүй хэдий ч түрүүчийн файлыг ажиллуулахад үүссэн session-д утга оноогдон сервер дээр учир энэ файлд ч гэсэн $_SESSION['hello'] хувьсагч хүчин төгөлдөр үйлчилнэ гэсэн үг юм. Хичнээн Refresh хийж хуудсыг дахин дахин ачааллаж үзсэн ч зүгээр байгаа биз :)

Одоо session-ы талаар арай дэлгэрүүлэн ойлгоход дөхөм болгох үүднээс саяын эх кодыхоо төгсгөлд бүх session хувьсагчийг устгах session_destroy(); функцийг нэмж дуудаад үз.

<?php
    session_start();
    echo $_SESSION['hello'];
    session_destroy();
?>

Саяын хуудсаа 2 дахин ачааллаад үзвэл 'Hello World' тэмдэгт мөр хэвлэгдэхгүй болж байгааг анзаарсан уу? session_destroy() функц эхний удаа хуудас дуудалтанд биелсэн учир дараа дараачин дуудалтанд $_SESSION['hello'] хувьсагч устсан байгааг үүнээс анзаарч болно.

session устгахад session_destroy() функцээр бүх session-г устгахаас гадна тухайн нэг функцийн хувьд unset() функцийг ашиглах боломжтой.

<?php
session_start();
if(isset($_SESSION['hello']))
    unset($_SESSION['hello']);
?>

Session ашиглан уншигч та бүхэн өөрсдөө сэтгэмжлэн олон янзын жишээ туршиж үзэхийг зөвлөж байна. Миний зүгээс "амьд" жишээ болгох үүднээс нэвтрэх (login) маш энгийн жишээг бичиж үзүүлье.

login.php

<?php
    global $error;
    session_start();
    if(isset($_SESSION['user'])){
        header("Location: welcome.php");
    }
    
?>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Нэвтрэх хэсэг</title>
</head>
<body>
<form action="check.php" method="post" name="logform">
<table>
<tr>
<td>
Хэрэглэгчийн нэр:
</td>
<td>
<input type='text' name="user" />
</td>
</tr>
<tr>
<td>
Нууц үг:
</td>
<td>
<input type='password' name="pass" />
</td>
</tr>
<tr>
<td />
<td style='text-align:right;'>
<input type='submit' value="Нэвтрэх"/>
</td>
</tr>
</table>
<?php
                echo $error;
            ?>
</form>
</body>
</html>

check.php

<?php
    session_start();
    $username = "ganaa";
    $password = "pass";
    $user = $_POST['user'];
    $pass = $_POST['pass'];
    if($user == $username && $pass == $password){
        $_SESSION['user'] = $user;
        header("Location: welcome.php");
    }
    else {
        $error = "Хэрэглэгчийн нэр, эсвэл нууц үг буруу байна.";
        include("login.php");
    }
?>

welcome.php

<?php
    session_start();
    if(!isset($_SESSION['user'])){
        header("Location: login.php");
    }
?>
<html>
<head>
<title>Welcome <?php echo $_SESSION['user']; ?> </title>
</head>
<body>
<p>
<a href="logout.php">Log out</a>
</p>
</body>
</html>

logout.php

<?php
    session_start();
    if(isset($_SESSION['user'])){
        unset($_SESSION['user']);
    }
    session_destroy();
    header("Location: login.php");
?>

Session-той холбоотой функц, боломжуудын талаар илүү лавлагааг эндээс үзээрэй :)

Saturday, April 3, 2010

PHP: Unicode тексттэй ажиллах

Өнөө үеийн бүхий л програм хангамжуудад юникод дэмждэг болсон нь маш өргөн боломжийг хэрэглэгчдэд олгодог. Unicode хэрэглээнд төдийлөн нэвтрээгүй үед Arial Mon фонт, Monkey гарын драйвер, RealMon аппликэйшнуудыг бүгдийг нь байнга тээж авч явах төвөгтэй гэмээр үе байв.

Үйлдлийн систем, цахим хөтөчүүд (web browser)-ууд юникод дэмжихгүй байсан нь вэб урлаачдад багагүй төвөг удаж байсан нь тодорхой. Багахан хэсэг хэсэг нь Arial Мон гэх мэт фонтоор бичээд бусад хэрэглэгчдэд(гадаадад байгаа дээр дурдсан хэрэглүүрүүийг хэрэглэх боломжгүй) уншихад төвөгтэй байдал үүсч арзайж гүйцсэн "Мотомборо хэл"-ээр бичсэн мөрүүд л харагддаг байж :D

Харин тухайн үеийн эх хэлээр нийтлэхэд хэрэглэгдэж байсан цорын ганц боломж нь local тэмдэгтүүдийг html код руу нь хөрвүүлж ашиглах явдал байв. Жишээ нь Гансүх гэсэн текстийг
&#1043;&#1072;&#1085;&#1089;&#1199;&#1093;
гэсэн html код руу хөрвүүлж хэрэглэдэг байв. Dreamweaver гэх мэт хүчирхэг хөгжүүлэтийн багажуудад энэ код руу хөрвүүлэх боломж нь байсан ба вэб аппликэйшндаа энэ код руу хөрвүүлэх скрипт бичиж ашигладаг байсан болов уу.
Миний өмнө бичиж байсан хичээлүүдийг дагаж хийж байхдаа магадгүй unicode тэмдэгтийг хэрхэн дүрслэх талаар сонирхож үзэж байсан болов уу гэж бодож байна.
<?php
    echo "Сайн уу?";
?>

Хэрэв дээрхи кодыг ажиллуулж үзэхэд түрүү үеийн Apache PHP server дээр алдаатай арзайсан текст харагдаж болно. Үүнийг шийдэж болох эхний шийдэл нь
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
метатагийг
<head> </head>
тагын завсар оруулж өгөх хэрэгтэй. Жишээлбэл:
<html>
<head>
<title>PHP work with Unicode example</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<body>
<?php
        $s = "Сайн уу?";
         echo $s.'<br />';
    ?>
</body>
</head>

Өөр нэгэн арга нь

header( 'Content-Type: text/html; charset=utf-8' );

функцийг php скриктийхээ толгой хэсэг оруулж өгөх нь үр дүнтэй.

<?php
 header( 'Content-Type: text/html; charset=utf-8' );
 $s = "Сайн уу?";
 echo $s.'<br />';
?>

MySQL database-тай ажиллахдаа

@mysql_set_charset('utf8',$database_connection_name);

функцийг дуудахад хангалттай.
<?php
    $db_host='localhost';
    $db_database='blog_db';
    $db_username='root';
    $db_password='';
    
    $db_conn = mysql_connect($db_host, $db_username, $db_password);
    if (!$db_conn){
        die ("Could not connect to the database: <br />". mysql_error());
    }
    @mysql_set_charset('utf8',$db_conn);
    $db_select = mysql_select_db($db_database);
    if(!$db_select){
        die ("Could not select the database: <br />". mysql_error());
    }
?>