از صفر تا صد php به همراه فایل word
نمره :
سیّد الشُهدا...
فهرست مطالب
- · فصل اول - مقدمه ای از Php.........................................................5
- · فصل دوم - مراحل ساخت پروژه..................................................52
- فصل سوم - سورس پروژه به همراه توضیحات ..............................55
فهرست جداول
- جدول 1..........................................................................................11
- جدول 2..........................................................................................11
- جدول 3..........................................................................................12
- جدول 4..........................................................................................14
- جدول 5..........................................................................................23
- جدول 6..........................................................................................34
- جدول 7..........................................................................................39
- جدول 8..........................................................................................41
- جدول 9..........................................................................................45
فهرست تصاویر
- تصویر 1..........................................................................................52
- تصویر 2..........................................................................................53
- تصویر 3..........................................................................................54
- تصویر 4..........................................................................................56
- تصویر 5..........................................................................................56
- تصویر 6..........................................................................................57
- تصویر 7..........................................................................................58
- تصویر 8..........................................................................................59
فصل اول
مقدمه ای از PHP
PHP یک زبان اسکریپتی تحت سرویس دهنده و مفسری است که بر روی تعداد بسیاری از سکوها شامل برخی از نسخههای Apache، Micorosft Internet Information Server (IIS) قابل استفاده است. نسخة اصلی برنامه، ابزارهای شخصی صفحة خانگی یا Personal Home Page Tools نامیده شد که PHP از سرنام این ترکیب آمده است. اگرچه تعاریف دیگری نیز برای این نام وجود دارد. برخی میگویند که PHP یک سرنام سه حرفی بازگشتی به معنی PHP Hypertext Preprocessor است. یک تعریف مرسوم و پذیرفته شدة دیگر نیز Pre Hypertext Processor است. اسکریپت PHP در صفحة وب تعبیه میشود و قبل از ارسال صفحه برای سرویسگیرندة درخواست کنندة آن، بر روی سرویسدهنده ترجمه و تفسیر میگردد. PHP یک زبان منبع باز یا Open Source است و از سایت php.net قابل برداشت است.
شروع کار
اسکریپتهای PHP دارای پسوند .PHP هستند و هر اسکریپت PHP بین تگهای ?> و <?php قرار داده میشود. اسکریپتی که بین این تگها قرار داده میشود پیش از ارسال برای سرویسگیرنده بر روی سرویسدهنده ترجمه و به HTML تبدیل میگردد و سرویسگیرنده یک صفحة HTML محض و بدون اسکریپت PHP را دریافت میکند. ساختار زبان PHP و دستورات آن اساساً شباهت بسیار زیادی به زبان C++ دارد.
نوشتن توضیحات
شما میتوانید در کُد PHP خود از توضیحات استفاده نمایید که در پردازش اسکریپت نادیده گرفته میشوند. سبک توضیحات در PHP مانند توضیحات زبان C++ است. در زیر نمونهای از توضیح تک خطی و توضیح بلوکی نشان داده شده است:
// This is an inline comment
/*
This is a block comment
Placed over two or more
Lines
*/
خروجی
دو دستورالعمل اساسی برای ارسال متن به خروجی وجود دارد. یکی دستور print و دیگری دستور echo. متنی که قرار است به خروجی فرستاده شود در جلوی دستور echo یا print قرار داده میشود. مثال:
<html>
<head>
<title> Starting PHP </title>
<meta http-equiv=”content-type” content=”text/html; charset=ISO-8859-1”>
</head>
<body>
<?php echo “Hello World! (using echo)<br>”; ?>
<?php print “Hello World! (using print)<br>”; ?>
</body>
</html>
همچنین یک راه میانبر برای ارسال اطلاعات به خروجی با استفاده از تگهای ?> و <?= نیز وجود دارد. در مثال زیر مقدار متغیر $name (که از یک فرم دریافت شده است) توسط روش میانبر مزبور برای خوشآمدگویی به کاربر به خروجی ارسال میشود:
Welcome <?=$name?>
اطلاعات PHP
در PHP تابعی به نام phpinfo وجود دارد که از نسخة PHP و نحوة پیکربندی آن خبر میدهد و در رفع عیب و خطایابی مفید است. در مثال زیر اطلاعات phpinfo به خروجی فرستاده میشود:
<html>
<head>
<title>PHP information</title>
</head>
<body>
<p><?php phpinfo(); ?></p>
</body>
</html>
PHP انواع دادة پایة رشته، اعداد صحیح، اعداد اعشاری با دقت مضاعف و غیره را پشتیبانی مینماید اما از لحاظ نوع داده، زبان خشکی نیست. بدین معنا که متغییرها به یک نوع دادة مشخص محصور نمیشوند و در طول برنامه میتوانند هر نوع دادهای داشته باشند و از هر نوعی به خود مقدار بگیرند. متغییرها در PHP نیازی به تعریف ندارند اما باید پیش از نام یک متغییر از علامت $ استفاده نمود.
اتصال و چسباندن رشتهها به یکدیگر در PHP توسط عملگر نقطه . انجام میشود. در مثال زیر از متغییری به نام anyDataType استفاده شده است که یک بار یک مقدار رشتهای به آن نسبت داده میشود و مقدار آن به خروجی ارسال میگردد. سپس یک مقدار عددی در آن قرار داده میشود و بر روی آن یک عمل ریاضی انجام شده و سپس مقدار آن به خروجی ارسال میشود. در هر مرحله نیز متغییر anyDataType به هنگام ارسال به خروجی توسط عملگر نقطه با مقدار رشتهای “<br>” جمع میشود.
<html>
<head>
<title>PHP information</title>
</head>
<body>
<?php // use several data types with one variable
$anyDataType=”Hello world!”;
print $anyDataType.”<br>”;
$anyDataType=64;
print $anyDataType.”<br>”;
$anyDataType+=1900;
print $anyDataType.”<br>”;
?>
</body>
</html>
عملگرها
عملگرهای ریاضی:
+ |
عملگر جمع |
- |
عملگر تفریق |
* |
ضرب |
/ |
تقسیم |
% |
باقیمانده |
++ |
افزایش |
-- |
کاهش |
جدول 1
خود نسبتدهی:
اگر در یک دستورالعمل نسبتدهی، مقدار متغییری پس از انجام محاسبهای ریاضی درون خود آن قرار گیرد، PHP یک میانبر برای دستورالعمل نسبتدهی پیشنهاد میدهد بدین ترتیب که عملگر ریاضی مورد نظر را پیش از عملگر تساوی یا = قرار داده و در سمت راست دستورالعمل نسبتدهی تنها به ذکر نام عملوند دوم آن عمل ریاضی اکتفا نمایید. مثال زیر چگونگی این مطلب را نشان میدهد.
$total+=$a; // equivalent to: $total=$total+$a;
$x-=$a; // equivalent to: $x=$x-$a;
$p*=$a; // equivalent to: $p=$p*$a;
$q/=$a; // equivalent to: $q=$q/$a;
$r%=$a; // equivalent to: $r=$r%$a;
عملگرهای رابطهای:
عملگرهای رابطهای (که گاهی عملگرهای مقایسهای نیز نامیده میشوند) برای مقایسة دو مقدار در یک عبارت مقایسهای مورد استفاده قرار میگیرند. مقدار برگشتی مقایسه، true یا false است.
< |
کوچکتر |
<= |
کوچکتر یا مساوی |
== |
مساوی |
> |
بزرگتر |
>= |
بزرگتر یا مساوی |
!= |
نامساوی |
جدول 2
عملگرهای منطقی:
عملگرهای منطقی شما را قادر میسازند که مقدار برگشتی چند عبارت مقایسهای را با هم ترکیب کنید.
! |
نقیض |
&& |
عملگر”و“ |
|| |
عملگر”یا“ |
جدول 3
سیر برنامه
برنامهنویسی ساختیافته بر سه ساختار اساسی استوار است: ترتیب، انتخاب و تکرار یا حلقه. ساختار ترتیب، سادهترین ساختار است که در آن دستورات قرار داده شده به ترتیب پشت سر هم اجرا میگردند. اما در ساختار انتخاب و حلقه، هر دو نیازمند به انجام یک مقایسه هستند. مقایسه میتواند بر روی اعداد، متغییرها، رشتهها، عبارات محاسباتی، مقدار برگشتی توابع و هر عبارت مقایسهای دیگری صورت پذیرد.
ساختارهای انتخاب:
دستورالعمل If:
دستورالعمل if به منظور کنترل سیر اجرای برنامه برای اجرای یک یا یک گروه از دستورات مشخص، بر اساس نتیجة یک مقایسه، مورد استفاده قرار میگیرد و ممکن است با else همراه باشد که دستورات مشخص شدة پس از آن، در صورت نادرست بودن نتیجة مقایسه اجرا خواهد شد. مثال:
<html>
<head>
<title>Simple If Statement</title>
</head>
<body>
<?php
$morning=date(“I”);
if ($morning=date(“1”))
print “Good morning <br>”;
else
print “Good afternoon <br>”;
?>
</body>
</html>
دستورالعمل if را میتوان به صورت تو در تو مورد استفاده قرار داد. چنانچه قرار باشد بیش از یک دستورالعمل پس از if یا else اجرا شود باید آنها را به صورت یک بلاک کُد بین علامتهای } و { قرار داد. مثال:
<?php if ($x==10)
{
print “That’s an excellent result<br>”;
print “You should be extremely proud of yourself<br>”;
}
?>
یک استباه متداولی که در بهکارگیری دستورالعمل if انجام میشود استفاده از عملگر نسبتدهی = به جای عملگر مقایسهای تساوی == است که باید در این مورد دقت نمود. توجه کنید که کُد نوشته شده با عملگر تساوی، به هنگام پردازش، مورد خطا قرار نمیگیرد. چرا که یک عبارت نسبتدهی، خود دارای مقدار برگشتی است و مقدار برگشتی آن برابر مقدار محاسبة شدة سمت راست دستورالعمل نسبتدهی است. حال اگر مقدار سمت راست برابر صفر باشد مقدار برگشتی عبارت نسبتدهی برابر false و در سایر حالات برابر true تعبیر میشود. لذا به عنوان مثال، دستور print در دستور if مثال زیر همیشه اجرا میشود. چرا که مقدار برگشتی عبارت مقایسهای برابر 10 است که به عنوان true تعبیر میشود.
<?php
if ($x=10) print “Excellent!”;
?>
دستور switch:
هنگامی که یک متغییر یا عبارت بر اساس مقادیر مختلف خود حالات مختلفی را برای تصمیمگیری تشکیل بدهد ساختار switch میتواند بسیار موثر باشد که از بهکارگیری چندین if…else به صورت پشت سر هم خوانایی بهتری دارد. مثال:
<?php
switch($num)
{
case 1: print “one”;
break;
case 2: print “two”;
break;
case 3: print “three”;
break;
case 4: print “four”;
break;
case 5: print “five”;
break;
}
print “<br>”;
?>
ساختارهای تکرار و حلقه:
حلقة while:
while (condition) { statement1; statement2; … } |
while (condition) statement; |
حلقة do:
Do { statement1; statement2; … } while (condition); |
do statement while (condition); |
حلقة for:
for (initialization; condition; incerement) { statement1; statement2; … } |
for (initialization; condition; incerement) statement; |
جدول 4
در مثال زیر، کامپیوتر اعداد اول بین 1 تا عددی را که کاربر وارد مینماید بر روی صفحه چاپ مینماید:
<html>
<head>
<title>Prime Numbers form</title>
</head>
<body>
<h1>Prime Numbers</h1>
<form id=”selection” name=”selection” method=”post” action=”displayprimes.php”>
<p>
<input type=”text” size=”5” value=”” name=”num”><br>
<input type=”submit” value=”display primes”>
</p>
</body>
</html>
displayprimes.php
<html>
<head>
<title>Display Primes</title>
</head>
<body>
<p>
<?php
print “The following are the prime numbers between 1 and “.$num.”<br>”;
for($counter=1;$counter<$num;$counter++)
{
$test=$counter;
$prime=1;
while($test-- >2)
if (($counter%test)==0)
$prime=0;
if ($prime==1)
print $counter.”<br>”;
}
?>
</p>
</body>
</html>
حلقة foreach:
این ساختار برای پردازش و مرور خانه به خانة آرایهها به کار میرود. آرایهها در PHP ستونی از خانههای کلید/مقدار هستند. مثال زیر نحوة کار با یک آرایه را توسط این ساختار نشان میدهد:
<html>
<head>
<title>Global Array</title>
</head>
<body>
<?php
foreach($Globals as $key=>$value)
print $key.”=”.$value.”<br>”;
?>
</body>
</html>
متغییرهای سرویسدهنده:
تمامی سرویسدهندهها مجموعهای از متغییرها موسوم به متغییرهای سرویسدهنده در اختیار دارند که اطلاعات مفیدی نظیر این که کاربر از کجا آمده است را در اختیار توسعهدهندگان وب سایتها قرار میدهند. در PHP این متغییرها را میتوان توسط نامشان مورد دستیابی قرار داد. به عنوان مثال اگر بخواهید بدانید کاربر در چه صفحهای بوده است که از طریق آن صفحة مورد درخواست فعلی را درخواست نموده است میتوانید از متغییر $HTTP_REFERER استفاده نمایید. و یا برای به دست آوردن اطلاعاتی دربارة مرورگر کاربر میتوانید از متغییر $HTTP_USER_AGENT استفاده نمایید. به مثال زیر دقت کنید:
<html>
<head>
<title>Server Variables</title>
</head>
<body>
<?php
print “user came from:” . $HTTP_REFERER . “<br>”;
print “user browser:” . $HTTP_USER_AGENT . “<br>”;
?>
</body>
</html>
لیست متغییرهای سرویسدهنده:
آرایة $GLOBALS لیست تمامی متغییرهای سرویسدهنده را در خود دارد که میتوانید آن را با ساختار foreach مورد پیمایش قرار بدهید. مثال زیر تمامی متغییرهای سرویسدهنده را بر روی صفحه چاپ مینماید:
<html>
<head>
<title>List Of Server Variables</title>
</head>
<body>
<?php
foreach($GLOBALS as $key=>$value)
print $key . “=” . $value . “<br>”;
?>
</body>
</html>
فرمها:
همان طور که احیاناً میدانید در صفحاتی که دارای فرم هستند خاصیت method در فرم نحوة ارسال اطلاعات دریافت شده از کاربر را به صفحة پردازش کنندة فرم و خاصیت action نام برنامه یا صفحة پردازش کنندة فرم را تعیین مینماید. چنانچه صفحة تعیین شده به عنوان صفحة پردازش کنندة فرم یک صفحة PHP باشد در آن میتوان از طریق آرایههای $_POST یا $_GET بسته به نحوة تعیین شده برای ارسال دادههای فرم برای فرم، در کُد اسکریپتی PHP به فیلدهای فرم پر شده دسترسی داشت. در مثال زیر نام و سن کاربر پس از دریافت بر روی صفحه نشان داده میشود:
<html>
<head>
<title>Subscribe form</title>
</head>
<body>
<h2>Please fill in the form below:</h2>
<fomr id=”userDetails” name=”userDetails” method=”post” action=”subscribe.php”>
<p>
Enter your name: <input type=”text” size=”40” value=”” name=”name”><br>
Enter your age: <input type=”text” size=”5” value=”” name=”age”><br>
Enter your email address: <input type=”text” size=”40” value=”” name=”email”><br>
</p>
</form>
</body>
</html>
<html>
<head>
<title>Subscription Process</title>
</head>
<body>
<?php
print “Welcome “.$_POST[“name”].”<br>”;
print “You are “.$_POST[“age”].” years old<br>”;
print “and your email is: “.$_POST[“email”].”<br>”;
?>
</body>
</html>
هدرهای HTTP:
برای ارسال فرامین خام HTTP از طریق پروتوکل HTTP از تابع header استفاده میشود. این تابع به تعدادی که فرمان HTTP نیاز دارد آرگومان میگیرد به علاوة یک آرگومان اختیاری true یا false که مشخص میکند که هدر جدید جایگزین هدر قدیمی شود یا خیر. در حالت پیش فرض مقدار این آرگومان پیش فرض true است که یعنی هدر جدید جایگزین هدر قدیمی شود.
چه زمانی هدرها باید فراخوانی شود؟
هدرهای HTTP باید قبل از اینکه هر گونه دادهای به خروجی یا صفحة وب ارسال شده باشد فراخوانی شود. لذا نتیجه میشود که تابع header باید در ابتدای اسکریپت و در ابتدای صفحه قرار گیرد. احیاناً ممکن است شما از فایلهای include نیز استفاده نمایید و تابع header را در آن فراخوانی نمایید که چنانچه شما چیزی بر روی صفحه نوشته باشید فراخوانی تابع header باعث بروز اشکال میشود. در چنین حالتی از دستور خروجی بافری ob_start() برای شروع به بافر سازی و از دستور ob_end_flush() برای ارسال کل محتویات درون بافر به صفحه استفاده نمایید. هنگامی که از بافرینگ استفاده میشود تا زمانی که پردازش کل صفحة درخواستی تمام نشود و دستور خالی کردن بافر و ارسال محتویات آن به سرویس گیرنده استفاده نشده باشد هیچ چیزی برای سرویس گیرنده فرستاده نمیشود. برای تعیین این که آیا هدرها ارسال شدهاند یا خیر میتوانید از تابع headers_sent استفاده نمایید. این تابع در حالتی که هدرها ارسال شدهاند مقدار بولی TRUE و در غیر این صورت مقدار FALSE بر میگرداند. مثال زیر نشان میدهد که چگونه MIME type را در هدرهای HTTP برای یک سند XHTML تنظیم نماییم.
if (stristr($_SERVER[HTTP_ACCEPT],”application/xhtml+xml”))
{
header(“content-type: application/xhtml+xml; charset=iso-8859-1”);
}
else
{
header(“content-type: text/html; charset=iso-8859-1”);
}
کنترل نهانگاه:
برای این که صفحات شما توسط سرویسگیرنده یا هرگونه نهانگاه proxy موجود بین شما و سرویسگیرنده کش نشود باید هدر Expires را توسط تابع header برابر با یک روز تعیین شده مقداردهی کنید. در HTTP/1.1 از هدر Cache-Control و در HTTP/1.0 از دستور pragma استفاده میشود.
<?php
header(“Expires: Sat, 1 Jan 2000 00:00:00 GMT”);
header(“Last-Modified: “ . gmdate(“D, d M Y H:i:s”) . “ GMT”);
header(“Cache-Control: no-store, no-cache, must-revalidate”);
header(“Cache-Control: post-check=0, pre-check=0”, false);
header(“Pragma: no-cache”);
print “This page won’t be cached”;
?>
هدایت ملاقات کنندگان به صفحهای دیگر:
برای هدایت ملاقات شونده به صفحهای دیگر میتوانید از هدر Location استفاده نمایید که در HTTP/1.1 باید URL کامل صفحة مقصد را ذکر نمایید. مثال:
Header(“Location: http://www.yahoo.com/”);
برای به دست آوردن این اطلاعات از متغییرهای سرویسدهنده نیز میتوانید استفاده نمایید و یک نام نسبی صفحه را به صورت پیشوند قبل از این اطلاعات قرار دهید. مثال زیر یک کوکی به نام “username” را برای آن که متوجه شود که آیا کاربر Login کرده است یا خیر چک میکند. اگر Login نکرده باشد او را به صفحة Login هدایت مینماید.
<?php
if (!isset($username))
{
$redirect=”http://” . $HTTP_SERVER_VARS[‘HTTP_HOST’];
if (dirname($HTTP_SERVER_VARS[‘HTTP_SELF’])!=”/”)
$redirect=$redirect . dirname($HTTP_SERVER_VARS[‘PHP_SELF’]) . “/”;
$redirect=$redirect . “login.php”;
header(“Location: “ . $redirect);
exit();
}
?>
تصدیق هویت پایهای:
در تصدیق هویت پایهای یک سری تلاش/پاسخ هایی برای تعیین این که آیا صفحه بر روی سرویس دهنده در حال حفاظت است یا خیر مورد استفاده قرار میگیرد. هنگامی صفحهای درخواست میشود، سرویسدهنده با یک کُد کاربر غیر مجاز (401) در هدر HTTP پاسخ میدهد. هنگامی که مرورگر کاربر این کُد را دریافت میکند یک پنجرة login نشان میدهد تا کاربر در آن نام کاربری و کلمة عبور خود را وارد نماید. سپس این اطلاعات برای بررسی به سرویسدهنده فرستاده میشود. اگر نام کاربری و کلمة عبور درست باشد صفحة درخواست شده نشان داده میشود. نام کاربر و کلمة عبور او در دو متغییر سراسری به نامهای $PHP_AUTH_USER و $PHP_AUTH_PW نگهداری میشود. در مثال زیر این دو متغییر سراسری بررسی میشود و چنانچه برابر با مقادیر “guest” و “guest” باشند صفحه نشان داده میشود که البته به سادگی برای بررسی نام کاربر و کلمة عبور وی با بک لیست ذخیره شده درون یک فایل قابل توسعه است:
<?php
if ((!isset($PHP_AUTH_USER))||(!isset($PHP_AUTH_PW)||($PHP_AUTH_USER!=”guest”)||($PHP_AUTH_PW!=”guest”))
{
header(‘www-Authenticate: Basic realm=”Private Area”’);
header(“HTTP/1.1 401 Unauthorized”);
print “This page requires authurization.”;
exit();
} else
{
print “You are through to the secret page!”;
}
// … rest of your code
?>
طرح یک سوال:
میخواهیم در انتهای یک متن بزرگ، یک چکباکس بگذاریم تا کسانی که صفحه را میبینند بتوانند با تیک زدن چکباکس، موافقت یا عدم موافقت خود را با متن نوشته شده اعلام کنند. اگر موافق باشند آنها به یک صفحة مشخص هدایت شده و در صورت عدم توافق به صفحهای دیگر هدایت میشوند. چگونه این کار را انجام دهیم؟
جواب:
کُد زیر را درست در ابتدای صفحاتتان در تمام آنها قرار دهید. حتی قبل از تگ <html> و دقت کنید که پیش از تگ <?php هیچگونه فضای خالی وجود نداشته باشد.
<?php
if ($action==”submit”)
{
if ($terms==”agree”)
{
header(“location:/agree.htm”);
exit;
}
else
{
header(“location:/other.htm”);
exit;
}
}
?>
اکنون کُد زیر را در صفحهای که میخواهید چکباکس و متن آن آنجا باشد قرار دهید.
<form name=”agreeterms” method=”post” action=”<? Echo “$PHP_SELF?action=submit”; ?>”>
Tick if you agree:
<input type=”checkbox” name=”terms” value=”agree”>
<input type=”submit” name=”Submit” value=”Go”>
</form>
خوب. اما ببینیم این فرم چه کار میکند. ما عملی به نام self تعریف کردهایم، لذا به هنگام submit شدن فرم، عبارت $PHP_SELF?action=submit به همین صفحه توسط دستور echo فرستاده میشود. در ابتدای صفحه نیز کُدی نوشتهایم که پارامتر action جلوی نام صفحه را بررسی میکند و بر اساس مقدار آن، با استفاده از تابع header، کاربر را به صفحة agree.htm یا other.htm هدایت میکند. این کُد، بسیار ساده، موثر و قابل انتقال است.
نکتة جالب در این تکنیک این است که کاربر به هنگام submit کردن فرم، بلافاصله به صفحة agree.htm یا other.htm (بسته به این که چکباکس را تیک زده باشد یا خیر) هدایت میشود و به هیچگونه ارتباط مجددی با سرویسدهنده و انجام پردازشی بر روی آن به منظور این که آیا کاربر چکباکس را تیک زده است یا خیر نیازی نیست. لذا به نحوی بار سرویسدهنده را سبک کردهایم. این مطلب در مواقعی که سایتهایی با تعداد بازدید کنندة بالا داریم میتواند مفید باشد.
اگر شما پیغامی مانند :”Warning: cannot add header function-headers already sent by...” دریافت کردید، کُدی را که در ابتدا گفتم درست بالای صفحهتان و پیش از هر گونه تگ یا چیزی بگذارید، قرار ندادهاید. ای داد! از اول امتحان کنید. ;)
مدیریت فایلها:
باز کردن و بستن فایلها:
در PHP فایلها توسط دستور fopen باز میشوند. این دستور دو پارامتر دریافت میکند: نام فایلی که قرار است باز شود و مُدی که قرار است فایل در آن مُد باز شود. در صورت موفقیتآمیز بودن انجام عمل، تابع یک اشارهگر به فایل و در غیر این صورت مقدار صفر (false) برمیگرداند. به این اشارهگر، اصطلاحاً دستگیرة فایل گفته میشود. پس از باز کردن فایل، برای کار با آن، مثلاً خواند از آن، نوشتن در آن و غیره، با دستگیرة فایل کار میکنیم.
$fp=fopen(“junk.txt”,”r”);
مُدهای مخنلف باز کردن فایل:
جدول زیر لیست مُدهای مختلفی را که یک فایل میتواند در آن مُد باز شود نشان میدهد:
مُد |
توضیح |
r |
مُد فقط خواندنی. اشارهگر فایل در ابتدای فایل قرار میگیرد |
r+ |
مُد خواندن/نوشتن. اشارهگر فایل در ابتدای فایل قرار میگیرد |
w |
مُد فقط نوشتنی. در صورتی که فایل از قبل موجود باشد محتویات قبلی آن را پاک شده و اشارهگر فایل درابتدای آن قرار میگیرد. در صورتی که فایل از قبل موجود نباشد، fopen اقدام به ایجاد آن مینماید. |
w+ |
مُد خواندن/نوشتن. در صورتی که فایل از قبل موجود باشد محتویات قبلی آن را پاک شده و اشارهگر فایل درابتدای آن قرار میگیرد. در صورتی که فایل از قبل موجود نباشد، fopen اقدام به ایجاد آن مینماید. |
a |
مُد الحاق. اشارهگر فایل در انتهای فایل قرار میگیرد. اگر فایل از قبل موجود نباشد، fopen اقدام به ایجاد آن مینماید. |
a+ |
مُد خواندن/الحاق. اشارهگر فایل در انتهای فایل قرار میگیرد. اگر فایل از قبل موجود نباشد، fopen اقدام به ایجاد آن مینماید. |
جدول 5
اگر fopen نتواند فایل را باز کند، صفر برمیگرداند. لذا میتوان با بررسی مقدار برگشتی تابع مزبور، در صورتی که عمل باز کردن فایل موفقیتآمیز نباشد، یک پیغام مناسب به کاربر نشان داد و از اجرای دستورات بعدی کار با فایل جلوگیری کرد. مثال:
if (!($fp=fopen(“junk.txt”,”r”)))
exit(“Unable to open the input file.”);
بستن فایل:
برای بستن فایل از تابع fclose استفاده میشود. بدین ترتیب که دستگیرة فایلی را که میخواهیم ببندیم به صورت پارامتر به تابع مزبور میفرستیم.
flose($fp);
خواندن از فایل:
شما میتوانید از یک فایل، پس از باز کردن آن در تمام مُدهای ذکر شده، به جز مًد الحاق و فقط نوشتنی (a و w) بخوانید. برای خواندن فایلها از توابع مختلفی استفاده میشود. تابع fgetc هر بار یک کاراکتر از فایل میخواند و اشارهگر فایل را یکی به جلو حرکت میدهد.
کلاً با هر بار خواندن از فایل، اشارهگر فایل به اندازة دادهای که از فایل خواندهاید، به جلو پیش میرود. نکتهای که باید به آن توجه نمایید بررسی رسیدن به انتهای فایل است. چرا که اگر اشارهگر فایل به انتهای فایل برسد و مجدداً سعی کنید از فایل چیری بخوانید، با خطا مواجه خواهید شد. به منظور بررسی این که آیا اشارهگر فایل، اکنون به انتهای فایل رسیده است یا خیر، از تابع feof استفاده میشود که در حالت رسیدن به انتهای فایل، true و در غیر این صورت false برمیگرداند. بدین ترتیب در یک حلقه میتوان کل محتویات فایل را پردازش کرد. در مثال زیر محتویات فایلی با نام junk.txt، کاراکتر به کاراکتر خوانده شده و بر روی صفحه نشان داده میشود:
<?php
if(!($fp=fopen(“junk.txt”,”r”)))
exit(“Unable to open the input file.”);
while(!feof($fp))
{
$c=fgetc($fp));
print $c;
};
fclose($fp);
?>
تغییر موقعیت اشارهگر فایل:
برای تغییر دادن موقعیت اشارهگر فایل از تابع fseek استفاده میشود. به عنوان مثال، دستور زیر، موقعیت اشارهگر فایل را بر روی کاراکتر ششمی قرار میدهد (شمارة موقعیتها از صفر شروع میشود):
fseek($fp,5);
خواندن یک کلمه از فایل:
توسط تابع fscanf هر بار میتوان از فایل یک کلمه خواند. بر خلاف C/C++، در اینجا چنانچه fscanf تمام کلمات یک خط را نخواند، اشارهگر فایل را به ابتدای خط بعد حرکت میدهد. تعداد آرگومانهای این تابع متغییر است. اما دو آرگومان اول تابع که دستگیرة فایل و یک رشتة قالببندی به سبک C است، اجباری هستند. پارامترهای بعدی اختیاری هستند اما در صورت بهکارگیری، پس از اجرای تابع fscanf و موفقیتآمیز بودن آن، بر اساس رشتة قالببندی مشخص شده، مقادیر خوانده شده از فایل را در خود خواهند داشت.
فرض کنید مقادیر زیر در فایلی به نام list.txt ذخیره شده باشد.
List.txt
Dave Programmer 34
Sue Designer 21
Lisa Programmer 29
Nigel User 19
کُد زیر یک خط از فایل میخواند و بر اساس رشتة “%s %s %d”، دو رشته و یک عدد صحیح از فایل خوانده و مقادیر خوانده شده را به ترتیب در متغییرهای $name، $title و $age قرار میدهد.
$buffer=fscanf($fp,”%s %s %d”,$name,$title,$age);
پس از خواندن از فایل، تابع fscanf، تعداد مقادیری را که قادر به خواندن آنها بوده است را به عنوان مقدار برگشتی برمیگرداند. در مثال زیر، محتویات فایل بالا، خط به خط خوانده شده و بر روی صفحه نشان داده میشود:
<?php
$listfile=”list.txt”;
if (!($fp=fopen($listfile,”r”)))
exit(“Unable to open $listfile.”);
while(!feof($fp))
{
$buffer=fscanf($fp, “%s %s %d”,$name,$title,$age);
if ($buffer==3)
print “$name $title $age<br>\n”;
}
fclose($fp);
?>
در مثال بعدی، نشان داده میشود که چگونه میتوان این اطلاعات را به صورت جدول در آورد:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Formatting An Input File into a Table</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style type="text/css">
body
{
background-color:#fff;
color:#000;
font-family:arial, helvetica, sans-serif;
}
td
{
font-family:arial, helvetica, sans-serif;
color:#900;
background:transparent;
}
th
{
font-family:arial, helvetica, sans-serif;
color:#009;
font-size:larger;
background:transparent;
}
</style>
</head>
<body>
<p>
<?php
$listFile = "list.txt";
if (!($fp = fopen($listFile, "r")))
exit("Unable to open $listFile.");
print "<table border=\"0\" cellpadding=\"10\" cellspacing=\"0\">\n";
print "<tr>\n<th>Name</th><th>Title</th><th>Age</th></tr>\n";
while (!feof($fp))
{
$buffer = fscanf($fp, "%s %s %d", $name, $title, $age);
if ($buffer == 3)
{
print "<tr>\n";
print "<td>$name</td><td>$title</td><td>$age</td>\n";
print "</tr>\n";
}
}
print "</table>\n";
fclose ($fp);
?>
</p>
</body>
</html>
اگر در تابع fscanf آرگومانهای اختیاری $name، $title و $age قرار داده نشود، مقادیر خوانده شده در یک آرایه قرار گرفته و توسط تابع fscanf برگشت داده میشود. در این حالت توسط تابع list میتوان مقادیر خوانده شده را از آرایه استخراج کرد. به مثال زیر توجه نمایید:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Using fscanf Returning an Array</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p>
<?php
$listFile = "list.txt";
if (!($fp = fopen($listFile, "r")))
exit("Unable to open $listFile.");
while (!feof($fp))
{
// Assign variables to an array
$buffer = fscanf($fp, "%s %s %d");
// Use the list function to move the variables from the array into variables
list($name, $title, $age) = $buffer;
print "$name $title $age<br>\n";
}
fclose ($fp);
?>
</p>
</body>
</html>
خواندن یک خط کامل:
برای خواندن یک خط به طور کامل، از تابع fgets استفاده میشود. این تابع دو پارامتر دریافت میکند: دستگیرة فایل و تعداد بایتی که قرار است خوانده شود. این تابع یا یک خط را به طور کامل میخواند و یا به اندازة تعداد بایتهای مشخص شده، از فایل میخواند و دادة خوانده شده را برمیگرداند. کُد زیر مثالی از نحوة استفاده از تابع fgets است.
<?php
if (!($fp = fopen("junk.txt", "r")))
exit("Unable to open the input file.");
while (!feof($fp))
{
$buffer = fgets($fp, 1024);
print "$buffer<br>\n";
}
fclose($fp);
?>
خواندن یک فایل به طور کامل:
تابع fread به اندازة تعداد بایت مشخص شده از فایل میخواند تا به انتهای فایل برسد. برای به دست آوردن اندازة فایل میتوان از تابع filesize استفاده کرد. لذا مانند مثال زیر میتوان اندازة فایل را به دست آورد و کل آن را یکجا خواند.
<?php
$listFile = "junk.txt";
if (!($fp = fopen($listFile, "r")))
exit("Unable to open the input file, $listFile.");
$buffer = fread($fp, filesize($listFile));
print "$buffer<br>\n";
fclose($fp);
?>
فرق fread و fgets:
فرق این دو تابع این است که تابع fgets به کاراکتر خط جدید توجه میکند و تابع fread به رسیدن به انتهای فایل. بدین معنی که چنانچه خطی به طول 25 کاراکتر داشته باشیم و دستوری مانند fgets($fp,50); را برای خواندن یک خط از فایل به کار ببریم، تابع fgets شروع به خواندن کاراکتر به کاراکتر خط مورد نظر مینماید. اما وقتی به انتهای خط برسد، چون با کاراکتر خط جدید مواجه شده است، عمل خواندن را متوقف مینماید و خط خوانده شده را بر میگرداند (با این که برای او تعیین کردهایم 50 کاراکتر بخواند، اما مشاهدة کاراکتر خط جدید بر اندازة تعیین شده ارجحیت دارد). اما اگر به جای این دستور از دستور fread($fp,50); استفاده کرده بودیم، دقیقاً 50 بایت از فایل میخواند و کاری نداشت که کاراکتر خط جدید هم خوانده است یا خیر. حال اگر کل فایل جمعاً 45 بایت میبود، تابع fread به محض این که به پایان فایل میرسید، کارش را متوقف و بایتهای خوانده شده را بر میگرداند (برای این تابع نیز، رسیدن به انتهای فایل بر اندازة مشخص شده ارجحیت دارد).
نوشتن در فایل:
برای نوشتن یک رشته یا بخشی از یک رشته در فایل از تابع fwrite استفاده میشود. تابع مزبور سه پارامتر میگیرد: دستگیرة فایلی که قرار است در آن نوشته شود، رشتهای که قرار است در فایل نوشته شود و تعداد بایتی که قرار است نوشته شود. اگر تعداد بایتی که قرار است در فایل نوشته شود، ذکر نشود، کل رشته در فایل نوشته میشود، اگر میخواهید رشتههایی که در فایل مینویسید در خطوط مجزا نوشته شوند، در انتهای رشته، کاراکتر \n که کاراکتر خط جدید است اضافه کنید. توجه: در ویندوز علاوه بر کاراکتر خط جدید به کاراکتر \r که کاراکتر ”ابتدای خط“ است نیز نیاز است. لذا اگر در ویندوز کار میکنید، رشته را با \r\n خاتمه دهید.
در مثال زیر، رد بازدیدکنندگان سایت در فایلی با نام stats.txt ثبت شده و سپس محتویات آن نشان داده میشود.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Statistics File</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p>
<?php
$logFile = "stats.txt";
// Open the file in append/read mode
$fp = fopen($logFile, "a+");
// Create a string containing the user details
$userDetails = $HTTP_USER_AGENT;
if (isset($HTTP_REFERER))
$userDetails = $userDetails . " $HTTP_REFERER <br>\r\n";
else $userDetails = $userDetails . "<br>\r\n";
// Write the user details to the file
fwrite($fp, "$userDetails");
// Move to the start of the file
rewind($fp);
$entries = 0;
// Display each line in the file
while(!feof($fp))
{
$buffer = fgets($fp, 1024);
if ($buffer != "")
{
print $buffer;
$entries++;
}
}
// Show a summary
print "There are $entries entries in the log file<br>";
fclose ($fp);
?>
</p>
</body>
</html>
کوکیها:
دنیای وب، دنیایی stateless است. این بدین معنی است که این دنیا هیچ چیزی راجع به شما به خاطر نمیسپارد. روش عادی در ثبت اطلاعات سلایق کاربران، استفاده از کوکیها است. اگر شما میخواهید یک کوکی ایجاد نمایید، باید این کار را پیش از نوشتن هدرها انجام دهید، لذا این کار باید درست در ابتدای صفحه انجام شود. در PHP، کوکیها توسط تابع setcookie به صورت زیر ایجاد میشوند.
setcookie(name, value, expire, path, domain);
کوکیها حقیقتاً در صفحهای که نوشته میشوند ایجاد نمیشوند، بلکه در صفحات بعدی سایت ایجاد میشوند. در مثال زیر یک کوکی با نام userName ایجاد میشود که پس از یک ساعت از بین میرود.
<?php
// Set a cookie that expires in one hour
setcookie("userName", $name, time()+3600);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PHP Cookies</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p>
A cookie was set on this page, and will be active when
the client has sent the cookie back to the server.
</p>
</body>
</html>
خواندن کوکیها:
هنگامی که یک کوکی ایجاد میشود، PHP امکان استفاده از کوکی را درست مانند متغییرها، با استفاده از نام آن مهیا میسازد. دستیابی به مقدار یک کوکی نیز، درست مانند دستیابی مقدار یک متغییر است. برای این که وجود یا عدم وجود یک کوکی را متوجه شوید میتوانید از تابع isset استفاده نمایید. در مثال زیر وجود یک کوکی با نام userName بررسی میشود و سپس پیغامی در این رابطه بر روی صفحه چاپ میشود:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Accessing a Cookie</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p>
<?php
if (isset($userName))
print "Welcome " . $userName . "<br>";
else
print "You are not logged in <br>";
?>
</p>
</body>
</html>
الحاقات تحت سرویسدهنده:
یک فایل الحاقی تحت سرویسدهنده، فایلی است که به یک صفحة وب، بر روی سرویسدهنده الحاق میشود. این قابلیت، در زمان ایجاد سایتها، صرفهجویی قابل ملاحظهای به عمل میآورد. اگر تمام صفحات سایت شما، هِدِر یکسانی دارند، میتوانید این هدر را در یک فایل قرار داده و به جای تکرار مستقیم هدر در تمام صفحات، نام فایل آن را در صفحات ذکر نمایید. مزیت این کار این است که چنانچه بخواهید هدر را تغییر بدهید، دیگر واهمهای نسبت به سایر صفحات ندارید و تنها همان صفحة شامل هدر را تغییر میدهید. شما هر چند تا بخواهید میتوانید از این نوع فایلها در طراحی سایت خود استفاده نمایید.
در PHP، الحاق نمودن یک فایل الحاقی به یک صفحه توسط دستور require انجام میشود. در مثال زیر یک banner، شامل یک لوگو و تعدادی لینک به سایر صفحات به صفحة وب این مثال، اضافه میشود:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Server Side Include</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<?php require("banner.html"); ?>
<p>
This page contains a banner that may be incuded in any
of the PHP files used on this site.
</p>
</body>
</html>
کار با تاریخ و زمان:
در PHP تابعی به نام date وجود دارد که بر اساس یک رشتة قالببندی که به عنوان پارامتر به آن پاس داده شده است، یک رشته شامل تاریخ و زمان درخواست شده برمیگرداند. به مثال زیر توجه نمایید:
print date("l \\t\h\e dS \o\f F Y") . "<br>";
قالببندی رشتة تابع date:
در جدول زیر کاراکترهای قابل استفاده در رشتة قالببندی تاریخ برای استفاده از تابع date نشان داده شده است. کاراکترهایی که در رشتة قالببندی، توسط تابع date تشخیص داده نشوند، به همان صورت در تاریخ برگشتی توسط این تابع، ذکر میشوند.
کاراکتر |
توضیح |
a |
“am” یا “pm” |
A |
“AM” یا “PM” |
B |
زمان اینترنت |
d |
شمارة روز در ماه. اگز شمارة روز یک رقمی باشد، قبل از آن یک صفر قرار داده میشود |
D |
یک رشتة سه کاراکتری، نشاندهندة چندمین روز هفته. مثل “Sat”، “Sub” و ... |
F |
نام ماه. مانند “November” |
g |
ساعت در سیستم 12 ساعته، بدون وجود صفر پیش از آن برای شماره ساعتهای یک رقمی |
G |
ساعت در سیستم 24 ساعته، بدون وجود صفر پیش از آن برای شماره ساعتهای یک رقمی |
H |
ساعت در سیستم 12 ساعته، همراه با صفر پیش از آن برای شماره ساعتهای یک رقمی |
h |
ساعت در سیستم 24 ساعته، همراه با صفر پیش از آن برای شماره ساعتهای یک رقمی |
i |
دقیقه به همراه صفر پیش از آن در صورت لزوم |
I |
1 در حالتی که نیمهشب باشد و 0 در بقیة حالات |
L |
1 در حالتی که سال کبیسه باشد و 0 در حالتی که کبیسه نباشد |
l |
نام کامل روز مانند “Saturday” |
m |
شمارة ماه به همراه صفر پیش از آن در صورت لزوم |
M |
یک رشتة سه حرفی نشاندهندة نام ماه مانند “Nov” |
n |
شمارة ماه بدون صفر پیش از آن |
O |
اختلاف زمان فعلی با زمان گرینویچ به ساعت |
r |
یک زمان قالببندی شده در ساختار RFC 822 مانند “Thu, 10 Nov 2001 18:34:07 +0000” |
s |
ثانیه به همراه یک صفر پیش از آن در صورت لزوم |
S |
پیشوند ترتیبی روز. مانند “th” |
t |
تعداد روز یک ماه |
T |
زمان محلی. مانند GMT |
U |
تعدا ثانیه از زمان میلاد مسیح تا کنون |
W |
شمارة روز هفته |
Y |
شمارة سال به صورت یک عدد چهار رقمی |
y |
شمارة سال به صورت یک عدد دو رقمی |
z |
شمارة روز در سال مانند “264” |
جدول 6
چنانچه بخواهید از هر یک از کاراکترهای بالا در رشتة قالببندی تابع date استفاده نمایید به نحوی که به صورت یک کاراکتر قالببندی تعبیر نشوند و دقیقاً به همان معنی حرف لاتینی که دارند مورد استفاده قرار بگیرند، کافی است پیش از آنها از یک \ استفاده نمایید. در مثال زیر برای استفاده از رشتة the of در رشتة قالببندی، از آنجا که کاراکترهای t و h، هر دو جزو کاراکترهای قالببندی تابع date هستند باید پیش از آنها از \ استفاده نماییم. اما از سوی دیگر \t نیز در PHP به عنوان کاراکتر Tab تعبیر میشود لذا باید یک \ دیگر پیش از آن استفاده نماییم. اگرچه کاراکترهای e، o و f جزو کاراکترهای قالببندی نیستند اما خوب است که کاراکتر \ را پیش از آنها نیز به جهت نشان دادن هدف به کار برد.
print date("l \\t\h\e dS \o\f F Y") . "<br>";
اتصال به یک منبع داده توسط ODBC (مثال Access):
اتصال پایگاه دادة باز یا ODBC یک واسط برنامهنویسی برنامههای کاربردی است که به شما اجازه میدهد که به یک منبع داده مانند یک پایگاه دادة Access متصل شوید. به جهت استفاده از تکنیک ODBC، ابتدا باید یک اتصال ODBC به منبع داده تعریف نمایید. برای این کار در پنجرة Control Panel بر روی آیکون ODBC Data Source Administrator دو بار کلیک کنید. برای تعریف یک اتصال به یک پایگاه داده، ابتدا یک نام برای آن نعیین میکنید که به آن DSN گفته میشود و سپس یک منبع داده به آن وصل میکنید. اگر فایل شما بر روی یک سرویسدهندة دیگر باشد، باید از Administrator بخواهید که اتصال ODBC به آن پایگاه داده را برای شما ایجاد نماید.
اتصال به یک ODBC:
برای اتصال به یک منبع دادة ODBC از تابع odbc_connect استفاده میشود. این تابع سپس یک کُد اتصال یا Connection ID بر میگرداند که از آن در توابع دیگر برای دستکاری دادهها در منبع داده استفاده میشود. این کُد اتصال چیزی شبیه دستگیرة فایلی است که تابع fopen به هنگام باز نمودن فایل بر میگرداند. پارامترهای تابع odbc_connect عبارتند از: نام منبع داده، نام کاربری، کلمة عبور و یک پارامتر اختیاری cursor_type که نوع مکان نما را در کار با منبع داده مشخص مینماید. در مثال زیر یک اتصال به یک DSN با نام accessExample بدون مشخص نمودن نام کاربری و کلمة عبور برقرار میشود.
$dbConnection = odbc_connect('accessExample' , '', '');
اجرای پرس و جو توسط یک اتصال ODBC:
به منظور اجرای پرس و جو ها تحت یک اتصال ODBC، از تابع odbc_exec استفاده میشود. این تابع یک مقدار برگشتی دارد که نتیجة اجرای پرس و جو است و میتوان از آن برای واکشی رکوردها از منبع داده استفاده نمود. در مثال زیر یک متغییر رشتهای برای یک پرس و جو تعریف میشود و سپس پرس و جوی تعریف شده، توسط تابع odbc_exec با استفاده از Connection ID به دست آمده از تابع odbc_connect در مثال قبل (که در متغییر $dbConnection قرار گرفته است)، اجرا میشود.
$strSQL = "SELECT * FROM search ORDER BY [Category]";
$cur= odbc_exec( $dbConnection, $strSQL);
واکشی رکوردها:
برای واکشی رکوردها از منبع داده از تابع odbc_fetch_row استفاده میشود. این تابع، مقدار برگشتی تابع odbc_exec و شمارة سطر رکورد را به عنوان پارامتر دریافت میکند و اگر قادر به کار با رکوردهای برگشت داده شده از اجرای پرس و جو باشد، true و در غیر این صورت false بر میگرداند. در حقیقت نتیجة اجرای یک پرس و جو، یک مجموعه رکورد است که خود دارای یک اشارهگر است و این اشارهگر، پس از اجرای پرس و جو، به اولین رکورد آن، اشاره میکند و چیزی شبیه اشارهگر فایلها است. به هنگام پردازش رکوردها، این اشارهگر هر بار یکی به جلو میرود. کار تابع odbc_fetch_row نیز جا به جا نمودن این اشارهگر است. توسط آن میتوان با تعیین شمارة یک رکورد، اشارهگر را به سمت آن حرکت داد و یا با عدم تعیین یک شماره، رکوردها را در یک حلقه به صورت پشت سر هم واکشی کرد. با هر بار فراخوانی تابع مزبور، اشارهگر، یکی به جلو حرکت خواهد کرد.
واکشی فیلد از رکورد:
برای واکشی فیلد از یک رکورد باید از تابع odbc_result استفاده نماییم. این تابع مقدار برگشتی تابع odbc_exec و همچنین نام یا شمارة فیلدی که میخواهیم مقدار آن را بخوانیم، به عنوان پارامتر دریافت میکند و مقدار فیلد را به صورت یک رشته بر میگرداند. اگر به جای نام فیلد از شمارة آن استفاده مینمایید توجه کنید که شمارة فیلدها از یک شروع میشود. در مثال زیر، اولین فیلد رکورد جاری مجموعه رکورد $cur را بر میگرداند:
$category = odbc_result($cur, 1);
و در مثال زیر نیز، مقدار فیلدی با نام “category” خوانده میشود:
$category = odbc_result($cur, "Category");
بستن یک اتصال ODBC:
برای بستن یک اتصال ODBC از تابع odbc_close استفاده میشود. این تابع، Connection ID برگشت داده شده از تابع odbc_connect را به عنوان پارامتر دریافت میکند. اگر هنوز تراکنشهایی در حال انجام باشد، تابع در بستن اتصال، با شکست مواجه میشود. در مثال زیر یک اتصال ODBC بسته میشود.
odbc_close($dbConnection);
یک مثال کامل از کار با اتصال ODBC:
در مثال زیر، رکوردهای جدول search از یک پایگاه داده با اتصال DSN با نام accessExample به ترتیب در یک جدول بر روی صفحه چاپ میشود:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>ODBC Example</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p>
<?php
$dbConnection = odbc_connect('accessExample' , '', '');
if (!$dbConnection)
{
exit("Unable to connect to database: $dbConnection");
}
$strSQL = "SELECT * FROM search ORDER BY [Category]";
$cur= odbc_exec( $dbConnection, $strSQL);
if (!$cur)
{
exit("Error in query");
}
print "<table>";
print "<tr><td><b>Category</b></td><td><b>File</b></td><td><b>Directory</b></td></tr>";
while (odbc_fetch_row($cur))
{
$category = odbc_result($cur, "Category");
$file = odbc_result($cur, "Page");
$directory = odbc_result($cur, "Directory");
print "<tr><td>$category</td>";
print "<td>$file</td>";
print "<td>$directory</td></tr>";
}
odbc_close($dbConnection);
print "</table>";
?>
</body>
</html>
اتصال مستقیم به یک پایگاه داده بدون استفاده از ODBC:
اگر از ODBC استفاده نمینمایید، برای اتصال به پایگاه داده ابتدا باید یک رشتة اتصال به پایگاه داده بسازید. اتصالات غیر ODBC از اتصالات ODBC سریعتر هستند، چرا که از میان ODBC عبور داده نمیشوند و مستقیماً با پایگاه داده در ارتباطند و نیازی به انجام دستیابی ثبت ندارند. با توجه به مطلب ذکر شده، نسبت به اتصالات DSN امنیت کمتری دارند.
در مثال زیر یک رشتة اتصال، برای اتصال به یک پایگاه دادة Access با نام search.mdb که در مسیر c:\db\ قرار دارد نشان داده شده است:
DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\db\search.mdb
در رشتة اتصالی مزبور، باید مسیر پایگاه داده دقیقاً ذکر شود. برای به دست آوردن مسیر فایل پایگاه داده میتوان از تابع realpath استفاده نمود. مثال:
$strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("\db\search.mdb");
برای اتصال به پایگاه داده از طریق این رشتة اتصالی، باید یک نمونه از شیء ADODB بسازیم. برای این کار در PHP از شیء COM استفاده میشود. پس از آن، برای کار با پایگاه داده میتوان از متدهای این شیء استفاده کرد. در مثال زیر، نمونهای از کار با یک پایگاه دادة Access به طور کامل نشان داده شده است:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>DSN-Less Example</title>
<meta http-equiv="Content-Type" content="text/html; ISO-8859-1">
</head>
<body>
<p>
<?php
if (!$conn = new COM("ADODB.Connection"))
exit("Unable to create an ADODB connection<br>");
$strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("\db\search.mdb");
$conn->open($strConn);
$strSQL = "SELECT Category, Page, Directory FROM search ORDER BY [Category]";
$rs = $conn->execute($strSQL);
$category = $rs->Fields(0);
$page = $rs->Fields(1);
$directory = $rs->Fields(2);
print "<table border=\"0\" cellpadding=\"5\" cellspacing=\"0\">";
print "<tr><td><b>Category</b></td><td><b>File</b></td><td><b>Directory</b></td></tr>";
while (!$rs->EOF)
{
print "<tr><td>$category->value</td>";
print "<td>$page->value</td>";
print "<td>$directory->value</td></tr>";
$rs->MoveNext();
}
print "</table>";
// Tidy up
$rs->Close();
$conn->Close();
$rs = null;
$conn = null;
?>
</body>
</html>
اتصال به یک پایگاه دادة MySQL در PHP:
برای کسب اطلاع در مورد MySQL به ”خودآموز MySQL“ مراجعه کنید. محور صحبت این بخش بر اتصال به پایگاه دادههای MySQL در PHP متمرکز است.
اتصال به پایگاه داده:
برای اتصال به یک پایگاه دادة MySQL از تابع mysql_connect استفاده میشود. این تابع، نام کامپیوتر میزبان، نام کاربر و کلمة عبور وی را به عنوان پارامتر دریافت میکند و یک MySQL link identifier برمیگرداند که به عنوان دستگیرة پایگاه داده مورد استفاده قرار میگیرد و در توابع بعدی کار با پایگاه داده از آن استفاده میشود. مثال:
$link = mysql_connect($host, $un, $pw);
تمامی پارامترهای تابع، اختیاری هستند. مقادیر پیشفرض این پارامترها به صورت زیر است:
host |
localhost:3306 |
username |
نام کاربری که پروسة سرویسدهنده متعلق به او است |
password |
خالی |
جدول 7
در مثال زیر یک اتصال به یک پایگاه دادة MySQL بر روی کامپیوتر localhost ایجاد میشود:
$link = mysql_connect("localhost");
اگر برقراری اتصال موفقیتآمیز نباشد، تابع مقدار false برمیگرداند. از مقدار برگشتی تابع میتوان برای بررسی موفقیتآمیز بودن برقراری اتصال به پایگاه داده استفاده نمود:
if (!$link = mysql_connect($host))
exit("Unable to connect to $host");
انتخاب جدول:
برای انتخاب جدول، از تابع mysql_select_db استفاده میشود. این تابع، نام جدول و یک رشتة اتصالی به عنوان پارامتر دریافت میکند. رشتة اتصالی اختیاری است و در صورت ذکر نکردن آن، تابع سعی میکند از آخرین ارتباط بازاستفاده نماید. اگر هیچ ارتباطی موجود نباشد، تابع، خودش یک ارتباط بر پا میکند درست مانند این که تابع mysql_connect بدون پارامتر فراخوانی شده باشد. در مثال زیر بر روی ارتباط برقرار شده با پایگاه دادة مثال قبل، جدولی با نام search انتخاب میشود:
mysql_select_db("search", $link);
اگر تابع موفق به برقراری ارتباط با جدول تعیین شده نشود، false برمیگرداند. با استفاده از این مقدار برگشتی میتوانید موفقیتآمیز بودن اجرای آن را به صورت زیر بررسی نمایید:
if (!mysql_select_db("search", $link))
exit("Unable to select the database");
اجرای پرس و جو:
برای کسب اطلاع دربارة نحوة ساخت پرس و جوها با استفاده از MySQL به ”خودآموز MySQL“ مراجعه نمایید. برای اجرای یک پرس و جو بر روی یک پایگاه دادة MySQL از تابع mysql_query استفاده میشود. این تابع، یک رشته (پرس و جوی مورد نظر) و یک رشتة ارتباط با پایگاه داده به عنوان پارامتر دریافت میکند. رشتة ارتباط با پایگاه داده اختیاری است و در صورت عدم ذکر آن، از آخرین ارتباط باز استفاده میشود. در مثال زیر یک پرس و جوی SQL تعریف میشود و سپس پرس و جو بر روی پایگاه داده اجرا میشود:
$query = "SELECT Page, Directory FROM search";
$result = mysql_query($query, $link);
اگر پرس و جو دارای خطا باشد، تابع false بر میگرداند. مثال:
$query = "SELECT Page, Directory FROM search";
if (!$result = mysql_query($query, $link))
exit("Illegal query");
واکشی رکوردها از پایگاه داده:
به منظور واکشی رکوردها از مقدار برگشتی تابع mysql_query که نتیجة اجرای پرس و جو است، از تابع mysql_fetch_array استفاده میشود که سطر جاری مجموعة جواب تابع mysql_query را به یک آرایه تبدیل میکند. پس از آن، اشارهگر مجموعة جواب، یکی به جلو حرکت میکند. پارامترهای این تابع، مقدار برگشتی تابع mysql_query را که یک مجموعه رکورد است، به علاوة یک مقدار تعیین کنندة نوع نتیجه میباشد. مقدار تعیین کنندة نوع نتیجه، اختیاری است و مقادیر قابل به کارگیری آن در جدول زیر نشان داده شده است:
نوع نتیجه |
توضیح |
MYSQL_ASSOC |
یک آرایة انجمنی برمیگرداند |
MYSQL_NUM |
یک آرایة عددی برمیگرداند |
MYSQL_BOTH |
یک آرایة انجمنی برمیگرداند که با اعداد نیز ایندکس شده است. در صورت عدم ذکر نوع نتیجه، از این مقدار برای آن استفاده میشود |
جدول 8
در مثال زیر یک رکورد از مجموعة جواب اجرای پرس و جوی مثال قبل، واکشی شده و در یک آرایة انجمنی به نام $row قرار داده میشود:
$row = mysql_fetch_array($result, MYSQL_ASSOC);
اگر هیچ رکوردی واکشی نشود، تابع mysql_fetch_array مقدار false برمیگرداند. از این رو با بهکارگیری این تابع در یک حلقه میتوانید کل رکوردها را پیمایش نمایید:
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
// Manipulate the row here
}
اگر از آرایة انجمنی استفاده نمایید، فیلدهای رکوردها از طریق نامشان نیز قابل دسیتیابی خواهند بود. به مثال زیر توجه کنید:
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
print $row["Directory"] . "\t" . $row["Page"] . "<br>\n";
}
بستن مجموعة جواب و ارتباط با پایگاه داده:
هنگامی که کارتان با مجموعة جواب و ارتباط با پایگاه داده تمام شد، باید آنها را ببندید. برای بستن مجموعة جواب از تابع mysql_free_result و برای بستن ارتباط از تابع mysql_close استفاده میشود. مثال:
// Release the Result Set
mysql_free_result($result);
// Close the connection
mysql_close($link);
یک مثال کامل:
در مثال زیر، ستونهای Directory و Page از جدول search بر روی صفحه چاپ میشود:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>MySQL Example</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>
<?php
if (!$link = mysql_connect("localhost"))
exit("Unable to make a connection to the database");
if (!mysql_select_db("search", $link))
exit("Unable to select the database");
// Define a SQL Select Query
$query = "SELECT Page, Directory FROM search";
if (!$result = mysql_query($query, $link))
exit("Illegal query");
// Display the results of the query in a table
print "<table border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n";
print "<tr><td><b>Directory</b></td><td><b>Page</b></td></tr>";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
print "<tr><td>";
print $row["Directory"];
print "</td><td>";
print $row["Page"];
print "</td></tr>\n";
}
print "</table>\n";
// Release the Result Set
mysql_free_result($result);
// Close the connection
mysql_close($link);
?>
</body>
</html>
بهکارگیری XML در PHP:
XML چیست؟
XML یک زبان پیشوندی است که از آن برای ایجاد اسنادی کاملاً ساختار یافته تهیه میشود. XML بنیان روشی نوین در ارتباطات در اینترنت است. یکی از قابلیتهای قدرتمند XML این است که به سازندگان اسناد، اجازه میدهد تا تگهای دلخواه خودشان را تعریف کنند که به یک سند خود توصیفگر منجر میشود. یک فایل XML، ساختار داده را توصیف میکند. برای انتقال دادهها به منظور نمایش و ارائة آنها عموماً از زبان XSL استفاده میشود.
شما نمیتوانید تضمین کنید تمام بازدیدکنندگان سایت شما، مرورگری با پشتیبانی XML داشته باشند. PHP4، از طریق DOM و افزونههای XML خود، از XML پشتیبانی میکند و در افزونة سابلوترون خود، یک پردازشگر XSL دارد.
API ساده برای XML (SAX):
SAX روشی دیگر برای پردازش فایلهای XML با ایتفاده از DOM و استفاده از دادههای درون آنها است. تجزیهگر SAX، در مواجهه با تگهای مختلف، توابع مشخصی را فراخوانی میکند.
مدیریت خطاها:
هنگامی که خطایی رخ دهد، شما میخواهید بدانید که چه رخ داده است. خطاهای XML معمولاً به شکل ثوابت هستند مانند XML_ERROR_SYNTAX. به منظور تبدیل این ثوابت به توضیحات متنی میتوان از تابع xml_error_string() استفاده کرد. مثال:
<?php
print xml_error_string(xml_get_error_code($parser));
?>
تکنیک بهکارگیری XML:
در مثال زیر، یک سند نمونة XML نشان داده شده است:
hardware.xml
<?xml version="1.0"?>
<machine>
<component id="1">
<title>Sound Card</title>
<price>Rs. 700.00</price>
<madein>India</madein>
</component>
<component id="2">
<title>LAN Card</title>
<price>Rs. 1000.00</price>
<madein>USA</madein>
</component>
<component id="3">
<title>Display Card</title>
<price>Rs. 750.00</price>
<madein>China</madein>
</component>
</machine>
دادههای درون این فرم چیزی شبیه زیر است:
جدول Component
Madein |
Section 6.02 Price |
Component |
India |
Rs. 700 |
Sound Card |
USA |
Rs. 1000 |
LAN Card |
China |
Rs. 750 |
Display Card |
جدول 9
از تکه کُد زیر میتوان برای راهاندازی تجزیهگر XML استفاده کرد:
//Initialize Parser
$parser=xml_parser_create();
//Specify Handlers to start and ending tag
xml_set_element_handler($parser, "start_element", "end_element");
//Data Handler
xml_set_character_data_handler($parser, "character_data");
//Open the Data File
$fp=fopen("hardware.xml", "r") ;
//read Data
while ($data=fread($fp, 4096))
{
xml_parse($parser, $data,feof($fp)) or
die (sprintf("XML Error : %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
برای راهاندازی تجزیهگر XML از تابع xml_parser_create استفاده میشود. پس از آن، باید تگهای آغازین و پایانی را برای تجزیهگر XML تعریف کرد. برای این کار از تابع xml_set_element_handler استفاده میشود که در آن، تعیین میشود که چه تابعی در صورت برخورد با تگ باز و بسته فراخوانی شود. در اینجا برای این کار ما از دو تابع start_element و end_element استفاده کردهایم. در مثال زیر تابع start_element برای المانهای آغازین هر سطر و ستون در جدول، و تابع end_element برای المانهای پایانی هر سطر و ستون در جدول به کار گرفته شده است.
برای تعیین این که چه تابعی در مواجهه با دادة کاراکتری فراخوانی شود از تابع xml_set_character_data_handler استفاده میشود. پس از آن تابع xml_parse برای پردازش فایل hardware.xml فراخوانی میشود و در انتها نیز تابع xml_parser_free فراخوانی میشود تا حافظهای که در زمان ایجاد تجزیهگر XML به آن اختصاص داده شده است، آزاد شود.
برای نمایش دادههای درون این فایل، از ساختار جدول در فایلهای HTML استفاده میکنیم.
hardware.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>XML with PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<?php
echo "<table border=\"1\">";
//Initialize Parser
$parser=xml_parser_create();
//Specify Handlers to start and ending tag
xml_set_element_handler($parser, "start_element", "end_element");
//Data Handler
xml_set_character_data_handler($parser, "character_data");
//Open the Data File
$fp=fopen("hardware.xml", "r") ;
//read Data
while ($data=fread($fp, 4096))
{
xml_parse($parser, $data,feof($fp)) or
die (sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
echo "</table>";
function start_element($parser, $element_name, $element_attrs)
{
switch($element_name)
{
case "COMPONENT":
echo "<tr>";
break;
case "TITLE":
echo "<td>";
break;
case "PRICE":
echo "<td>";
break;
case "MADEIN":
echo "<td>";
}
}
function end_element($parser, $element_name)
{
switch($element_name)
{
case "COMPONENT":
echo "</tr>";
break;
case "TITLE":
echo "</td>";
break;
case "PRICE":
echo "</td>";
break;
case "MADEIN":
echo "</td>";
}
}
function character_data($parser,$data)
{
echo $data;
}
?>
</body>
</html>
ایجاد شمارندة لینک در PHP/MySQL:
در این بخش نحوة ایجاد یک شمارندة لینک توسط PHP و MySQL به شما آموزش داده میشود.
ایجاد یک جدول MySQL:
ابتدا یک جدول برای ذخیرهسازی نام سایت و تعداد مراجعه به صورت زیر در MySQL ایجاد نمایید:
CREATE TABLE url_redirect
(
site varchar(100) NOT NULL,
hits int(10) DEFAULT 1 NOT NULL,
PRIMARY KEY (site)
);
نوشتن کُد PHP:
در کُد PHP زیر، متغییرهای $yoursite، $dbhost، $dbuser، $dbpassword، $db2use تعریف میشود که باید مقادیر متناسب با سایت شما را به خود بگیرند. پس از مقداردهی متغییرها، اسکریپت را بر روی سرویسدهنده بگذارید. لینکها به صورت مثال زیر در یک رشتة پرس و جوی SQL به اسکریپت پاس داده میشوند:
<a href="go.php?site=http://www.juicystudio.com">Visit Juicy Studio</a>
هر بار که یک لینک از صفحات سایت توسط کاربری کلیک شود، توسط اسکریپت مزبور، این کلیک، در پایگاهدادة تهیه شده ثبت شده و سپس کاربر به مقصد لینک هدایت میشود.
go.php
<?php
### --- ID: go.php :: 24/05/2002 --- ###
### --- Outgoing Links counter (uses PHP and MySQL) --- ###
### --- Made for Juicystudio Techmail --- ###
### Define variables
$yoursite = "http://www.yoursite.com/";
### Define database values
$dbhost = ""; // database host
$dbuser = ""; // database username
$dbpassword = ""; // database password
$db2use = ""; // name of database
?>
<?php
### --- NO CHANGES BELOW THIS LINE --- ###
function dbconnect()
{
global $dbhost, $dbuser, $dbpassword, $db2use;
$link = @mysql_connect($dbhost,$dbuser,$dbpassword)
or die("Connection failed: Please try later.");
@mysql_select_db($db2use,$link)
or die("Connection to database refused: Please try later.");
return $link;
}
// Connect to database
dbconnect();
if (!empty($site))
{
$qry = "SELECT hits FROM url_redirect WHERE site = '$site'"
$hitcounter = mysql_query($qry);
$hitcount = mysql_fetch_array($hitcounter);
$hits = $hitcount[0];
// next check if URL is in database
if ($hits == 0)
{
// if not then add it!
$newurl = "INSERT INTO url_redirect (site,hits) VALUES('$site',1)";
}
else
{
// Site already exists so just update the hit count
$newurl = "UPDATE url_redirect SET hits=$hits+1 WHERE site='$site'";
}
mysql_query($newurl);
mysql_close();
// re-direct to the required site as defined
// in the "go.php?site" link
header ("Location: $site");
exit;
}
else
{
// site variable not entered, so redirect back to
// "yoursite" as defined above
header ("Location: $yoursite");
exit;
}
?>
مدیریت فایلها:
اولین قدم این است که فایلی را برای ثبت این شمارنده تعیین نمایید و مقدار 0 را برای شروع در آن قرار داده و فایل را در دایرکتوری ریشة سایتتان، که فایل index.php نیز آنجا است قرار دهید. در اینجا این فایل، counter.txt است و یک متغییر برای نام این فایل نیز به صورت زیر تعریف میکنیم:
$counter_file = "./counter.txt";
پس از آن باید فایل را در مُد خواندن باز نمایید و مقدار نوشته شده در آن را بخوانید.
if (!($fp = fopen($counter_file, "r"))) die ("Cannot Open $counter_file.");
اگر باز کردن فایل موفقیتآمیز نباشد، تابع fopen خواهد مرد و پیغام “Cannot open counter.txt” نشان داده خواهد شد.
خواندن فایل:
پس از باز کدن فایل، باید مقدار درون آن را خواند. ما این مقدار را در متغییری به نام $counter قرار میدهیم تا بتوانیم بعداً آن را تغییر بدهیم. برای خواندن از فایل از تابع fread استفاده مینماییم که دو آرگومان دریافت میکند: دستگیرة فایل و تعداد کاراکترهایی را که میخواهیم بخواند (در این مثال ما فقط 20 کاراکتر میخوانیم):
$counter = (int) fread($fp, 20);
پس از آن فایل را میبندیم تا حافظة اختصاص داده شده به آن در سرویسدهنده آزاد شود:
fclose($fp)
سپس به مقدار خوانده شده یکی اضافه میکنیم:
$counter++;
نوشتن مقدار جدید در فایل:
سپس مقدار جدید را در صفحه نوشته و مجدداً فایل ثبت شمارنده را ولی این بار در مُد نوشتن باز میکنیم و مقدار جدید را در آن مینویسیم:
$fp = fopen($counter_file, "w");
برای نوشتن در فایل از تابع fwrite استفاده مینماییم:
fwrite($fp, $counter);
این تابع، دو آرگومان میگیرد. یکی دستگیرة فایلی که میخواهیم در آن بنویسیم و دیگری مقداری که میخواهیم در فایل نوشته شود که در اینجا $hit است. پس از آن فایل را میبندیم و کار تمام میشود.
<?php
// counter file created by tk_downer <webmaster@e-anmar.com>
// path to counter.txt
$counter_file = "./counter.txt";
// Open the file for reading
if (!($fp = fopen($counter_file, "r"))) die ("Cannot Open $counter_file.");
// Read 20 characters from the file
$counter = (int) fread($fp, 20);
// Close the file
fclose($fp);
// Increment the counter
$counter++;
// Display the counter
echo "You are visitor Number $counter.";
// Open the file, in write mode
$fp = fopen($counter_file, "w");
// Write the new value of counter to the file.
fwrite($fp, $counter);
// Close the text file.
fclose($fp);
?>
فصل دوم
مراحل ساخت پروژه :
این پروژه با کمک نرم افزار های FrontPage ، EasyPHP تهیه و پیاده سازی شده است و برای بانک اطلاعاتی آن نیز از PhpMyAdmin که مناسبترین راه برای ساخت پایگاه داده MySql برای زبان Php میباشد، بهره برده ایم.
طراحی سایت با استفاده از نرم افزار Frontpage و قالب های آماده سایت طراحی شده ، همانطور که می دانید سایت های Php اکثرا از قالب های آماده (Template) استفاده می کنند و برای قسمتهای کاربردی سایت شروی به کد نویسی پی اچ پی میکنند ، اگر صفحه اصلی را در نظر بگیریم برای قسمتهای مشخص شده ( مطابق شکل زیر ) نیاز به برنامه نویسی داریم چون خود سایت ( زبان Html ) جزء حالت های ایستا از صفحات وب بوده و تقریبا دارای هیچ نوع انعطاف پذیری یا امکان برنامه نویسی نیست.
تصویر 1
قسمتهای شماره 1 ( لینک همکاران )و قسمت 4 به صورت لینک هستند و به راحتی با خود نرم افزار Frontpage آنها را به صفحات مربوطه لینک داده ایم ، برای مثال برای لینک همکاران در نرم افزار Frontpage ( یا هر نرم افزار طراحی صفحات وب دیگری ) متن لینک همکاران را انتخاب کرده سپس روی آن راست کلیک میکنیم (مطابق شکل زیر) و گزینه Hyperlink را انتخاب میکنیم بعد از این کار با کادر زیر مواجه خواهیم شد که باید مشخصات فایل یا سایتی که قرار است با کلیک روی عبارت لینک همکاران به آن رویم را تعیین کنیم :
تصویر 2
در این پنجره به راحتی می توان ( برای رفتن به فایل مورد نظر ) در قسمت وسط پنجره فایل مورد نظر را انتخاب کرده و روی Ok کلیک کنیم، که برای ربط دادن عبارت لینک همکاران به فایل Link.php که لینکهای همکاران در آن قرار داده شده همین فایل را انتخاب کرده و روی Ok کلیک میکنیم ، لازم به ذکر است مواقعی که بخواهیم با کلیک روی یک عبارت یک سایت خاص باز شود باید در قسمت Address آدرس سایت را حتما با Http:// شروع کنیم.
اما قسمت های 2 و 3 در شکل اصلی ما نیاز به برنامه نویسی و کار با پایگاه داده داریم و در این قسمت ها از کد Php استفاده کرده ایم که در فصل بعدی مفصل راجع به آن توضیح می دهیم.
در فایلهای Php اگر ما از کدهای html استفاده کنیم ( خارج از کدهای Php ) این کدها به صورت html اجرا می شوند مثلا فایل لینک همکاران که فایل ساده ای است و قرار است فقط چند لینک به سایت های دیگر داشته باشد را می توان به سادگی با نرمافزار های طراحی html مثل Frontpage طراحی کرده و با پسوند php ذخیره کنیم با این کار می توانیم سایتی کلا با صفحات Php داشته باشم.
فصل سوم
سورس پروژه به همراه توضیحات :
اولین مرحله نصب برنامه ای است که بتواند یک سرور Apache روی سیستم ما نصب کند تا بتوانیم پروژه را اجرا کنیم ، نرم افزار های زیادی در این زمینه وجود دارد مثل : EasyPhp , Wamp , Xamp و ... که خوشبختانه کار تمامی آنها شبیه به هم است ، ما از نرم افزار معروف EasyPhp استفاده میکنیم که از طرف خود سایت www.Php.Net برای کاربران ارائه شده ، پس از نصب برنامه تنها کاری که باید انجام دهیم ساخت جدول و فیلد های مورد نیاز است.
برای اینکار وارد قسمت PhpMyAdmin شده که با آدرس http://localhost/phpmyadmin قابل دسترس است ، البته بعضی نسخه ها از نرم افزار easyphp قسمت PhpmyAdmin در شاخه ای جدا وجود دارد که میتوان آن را در شاخه www کپی کرد در نهایت باید با شکلی مشابه زیر مواجه شویم :
تصویر 3
برای ساخت پایگاه داده نام Books را در قسمت Create new database تایپ کرده و روی Create کلیک کرده تا دیتا بیس ساخته شود سپس با دستورات زیر فیلدها و جدول های پایگاه داده را می سازیم :
CREATE TABLE `books` (
`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`name` text NOT NULL ,
`nevisande` text NOT NULL ,
`sal` text NOT NULL ,
`mozo` text NOT NULL ,
`download` text NOT NULL ,
PRIMARY KEY ( `id` )
);
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`name` text NOT NULL,
`username` text NOT NULL,
`password` text NOT NULL,
`email` text NOT NULL,
PRIMARY KEY (`id`)
) ;
کد های بالا باعث ساخت دو جدول به نام های , Books User می شود که جدول User برای نگهداری اطلاعات کاربران می باشد و حاوی فیلد های از جمله نام کتاب ، نویسنده ، سال نشر و ... و جدول User که شامل فیلدهایی برای نگه داری اطلاعات کاربران سایت است مثل : نام ، کلمه عبور ، ایمیل و .... . برای ساخت جداول و فیلدهای ذکر شده در جدول Book بعد از ساخت جدول Book با کلیک روی Create به صفحه ای مشابه صفحه زیر رفته و در قسمت مشخص شده در شکل زیر کد Sql بالا را تایپ کرده و با کلیک روی Go جداول و فیلد ها ساخته می شود.
تصویر 4
با زدن Go به شکلی مشابه شکل زیر خواهیم رفت :
تصویر 5
تا این مرحله توانسته ایم پایگاه داده را با موفقیت پیکر بندی کنیم .
در ادامه پروژه را در شاخه ای به نام www در مسیر Easyphp کپی کرده و برنامه esyphp را اجرا میکنیم و وارد سایت می شویم، با شکلی مشابه شکل زیر موجه خواهیم شد :
تصویر 6
همانطور که مشاهده میکنید کتاب خانه حاوی هیچ کتابی نیست برای اضافه کرده کتاب ها به پایگاه داده برنامه وارد شاخه Admin می شویم ( مطابق شکل زیر ) :
تصویر 7
در قسمت بالای صفحه می توانیم کاربران و کتاب ها را به ترتیب در سمت راست و چپ مدیریت کنیم در قسمت مدیریت کتابها میتوان به سادگی اطلاعات کتاب را وارد کرد و با کلیک روی دکمه Submit اطلاعات را در بانک ذخیره کرد ، لازم به ذکر است پسوند فایلهای کتابهای Ebook حتما باید Zip باشد .
با کلیک روی مدیریت کاربران نیز با صفحه ای مشابه صفحه زیر مواجه می شویم که امکان دیدن اعضا و حذف عضو های مورد نظر را داریم.
تصویر 8
در ادامه به توضیحات کدهای Php به کار بر ده شده در هر فایل می پردازیم :
توضیحات فایل Connect.php
<?php
برقراری اتصال با Sql که اگر ارتباط بر قرار نشود پیغام I Cannot .. چاپ شده و با دستور mysql_error()); خطای رخداده شده چاپ می شود
$dbh=mysql_connect ("localhost", "root", "") or die ('I cannot connect to the database because: ' . mysql_error());
انتخاب پایگاه داده Book و تعیین Utf-8 برای نمایش و پردازش صحیح کلمات فارسی
mysql_select_db ("book");
mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET SESSION collation_connection = 'utf8_persian_ci'");
?>
توضیحات فایل Index.php :
ساخت یک جلسه (session) برای بررسی کردن ورود کاربر
<?php @session_start();
شامل (Include) کردن فایل Connect.php برای استفاده از ارتباط ایجاد شده در این فایل
include "connect.php";
?>
<?php
اگردکمه "ورود" در صفحه اصلی سایت فشرده شود مقدار موجود در کادر های نام کاربری و رمز عبور را در 2 متغیر $user name و $pasword میریزیم تابع md5 مقدار ها را رمزگزاری میکند تا امنیت سایت بالا تر رورد بعدا خواهیم دید که موقع ثبت نام نیز رمز عبور را که از کاربر دریافت کرده ایم به صورت رمزگزاری شده در بانک ذخیره میکنیم. با یک عبارت Sql جستجو در بانک میکنیم تا بفهیمیم عبارت هایی که کاربر داده در بانک هست یا نه در صورت عدم وجود یک پیام صادر کرده و دوباره با دستور document.location به صفحه اصلی میرویم ولی اگر در بانک Sql مادیر کاربر وجود داشت جلسه را با True مقدار دهی کرده و دوباره صفحه را باز میکنیم تا کاربر (با توجه به فعالشدن جلسه) بتواند کتاب ها را دانلود کند.
if($_POST["B2"])
{
$username=$_POST["T2"];
$password=md5($_POST["T3"]);
$select="select * from user where username='$username' and password='$password' ";
if($result=mysql_query($select))
$num=mysql_num_rows($result);
if($num==0)
print "<script> alert('نام کاربری و رمز عبور اشتباه است') </script>";
if($num>1)
print "<script> alert('نام کاربری و رمز عبور اشتباه است') </script>";
if($num==1)
{
while($row=mysql_fetch_array($result))
{
$_SESSION["login"]="true";
print "<script> alert('اکنون می توانید کتاب های موجود در سایت را دانلود کنید')</script>";
}
print "<script>document.location='?code=1'</script>";
}
}
?>
*******************
دساورات مربوط به جستجوی کتاب ها که با یک عبارت Sql و محتوای کادر جستجو انجام می شود، و در غیر اینصورت با select * from books کل کتاب ها نمایش داده می شوند
if($_POST["B1"]){
$category=$_POST["D1"];
$val=$_POST["T1"];
$select="select * from books where $category LIKE '%$val%' ";
}
else{
$select="select * from books ";
}
if($result=mysql_query($select))
while($row=mysql_fetch_array($result))
{
دستورا ت مربوط به فایل Register.php
با دستور if تعیین کرده ایم اگرکاربر روی دکمه "ثبت نام" کلیک کند و (&&) اگر جلسه ما با موفقیت ساخته شده باشد ابتدا با این عبارت select id from user where username='$_POST[T2]' به دنبال مقداری که کاربر به عنوان نام زده ، در بانک میگردیم که اگر وجود داشت با دستور جاوا و دستور Alert پیام ('نام کاربری که انتخاب کرده اید تکراری است') را در یک پیام به کاربر نشان می دهیم.
در غیر این صورت (Elase) با استفاده از دستور insert در یک عبارت Sql کل اطلاعات وارد شده کاربر را در رکورد جدیدی در بانک ذخیره میکنیم و در اتمام کار یک پیام با عنوان ('ثبت نام شما در سایت کامل شد اکنون می توانید با نام کاربری خود وارد شده و کتاب های مورد نظر خود را دانلود کنید'); چاپ کرده و صفحه را دوباره باز میکنیم.
<?php
if($_POST["B1"] && $_SESSION["done"]!="ture") {
$select="select id from user where username='$_POST[T2]' ";
$result=mysql_query($select);
$num=mysql_num_rows($result);
if($num >0) {
print "<script> alert('نام کاربری که انتخاب کرده اید تکراری است'); </script>";
}
else{
$pass=md5($_POST["T3"]);
$select="insert into user values('$id','$_POST[T1]', '$_POST[T2]', '$pass', '$_POST[T4]')";
if($result=mysql_query($select))
{
print "<script> alert('ثبت نام شما در سایت کامل شد اکنون می توانید با نام کاربری خود وارد شده و کتاب های مورد نظر خود را دانلود کنید');
document.location='index.php?login=true' </script> ";
$_SESSION["done"]=="true";
}
}
}
*********
توضیحات فایل Nmailer.php
در خطوط 3 تا 6 از فایل Php متغیر های مورد نیاز برنامه تعریف شده اند.
$Email_Addresse = " online_book@yahoo.com "; تعیین ایمیلی که اطلاعات به آن فرستاده می شود
$Redirect_Page = "index.php";صفحه ای که بعد از ارسال اطلاعات به آن خواهیم رفت
$Subject = "[Nazar]"; اطلاعات که به صورت ایمیل ارسال میشوند موضوع ایمیل اینجا تعیین می شود
$From = " Contactus Form"; و در نهایت آدرس فرستنده را اینجا تعیین میکنیم
لازم به ذکر است که متغیر ها در زبان Php با علامت $ شروع می شوند و تمامی خطوط به علامت ; ختم می شوند.
در ادامه با خطوط زیر عنوان (Header) ایمیل را می سازیم این قسمت را کاربران در ایمیل نخواهند دید و فقط یکسری اطلاعات به وب میل مقصد می دهد از جمله ایمیل فرستنده، نوع ایمیل و .. .
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= "From: $From" . "\r\n";
$Body = "<html><head><title>Ersale Email Ba PHP</title></head>" . "\r\n";
در ادامه Get (گرفتن اطلاعات) یا Post (ارسال اطلاعات) تعیین میشود که چون ما کد زیر را برای دکمه ارسال در فرم ارسال اطلاعات نوشته ایم Post در نظر گرفته میشود
if (count($_POST) > 0) { $pog = $_POST; $method = "POST"; }
else if (count($_GET) > 0) { $pog = $_GET; $method = "GET"; }
else print "Sorry you cannot open or save this file";
در ادامه با خطوط زیر تنظیمات فونت از جمله نام فونت و رنگ و اندازه اطلاعات ارسالی را برای تمامی فیلدهای فرم تعیین میکنیم. (bold 12px tahoma,sans-serif')
if (isset($pog))
{
reset($pog);
foreach ($pog as $name => $value)
{
$Body .= "<font style='font:bold 12px tahoma,sans-serif'
color='#000080'>$name:</font><font style='font:normal 12px tahoma,sans-serif' color='#000000'>
$value</font><br>" . "\r\n";
}
$Body .= "</body></html>" . "\r\n";
و در نهایت با استفاده از دستور Mail اطلاعات را ارسال میکنیم به $Email_Addresseکه قبلا در خطوط اول برنامه آن را تعین کرده ایم ، $Subject نیز همچنین است و $body که محتوای فیلد های فرم را داراست و $header که قبلا توضیح داده شد.
با دستور If تعیین میکنیم که اگر ایمیل به درستی ارسال شد مسیر اجرای برنامه با دستور Location به :$Redirect_Page که آنرا نیز قبلا تعیین کرده ایم منتقل شود و این باعث می شود فایل thanks.html که حاوی پیامی مبنی بر ارسال اطلاعات کاربر است خواهد شد.
if (mail($Email_Addresse,$Subject,$Body,$headers) ) {
header("Location:$Redirect_Page");
}
}
?>
?>
توضیحات فایل Book.php :
اگر روی دکمه Submit کلیک کنیم اول اطلاعات وارد شده کاربر را در متغیر هایی می ریزیم مثل $name سپس فایلی که تعیین شده را نیز در مسیر "../uploadbook آپلود میکنیم که بهتر است پسوند فایلها Zip باشد تا موقع دانلود به راحتی دانلود شود. و نهایتا با یک عبارت Sql کل اطلاعات را در جدول کتابها ذخیره میکنیم.
<?php
if($_POST["B1"]){
$name=$_POST["T1"];
$nevisande=$_POST["T2"];
$sal=$_POST["T3"];
$mozo=$_POST["S1"];
if(is_uploaded_file($_FILES['F1']['tmp_name']))
{
move_uploaded_file($_FILES['F1']['tmp_name'], "../uploadbook/".$_FILES['F1']['name']);
$filename=$_FILES['F1']['name'];
}
$select="insert into books values('$id', '$name', '$nevisande', '$sal',
'$mozo', '$filename')";
mysql_query($select);
}
?>
برای ویراش اطلاعات کتاب ها از دستورات زیر استفاده کرده ایم که ابتدا کل اطلاعات را در کادر ها نمایش می دهد و سپس یا کلیک کردنکاربر روی دکمه Submit با استفاده از دستور Update در عبارت Sql کل اطلاعات جدید را که در متتغیر ها ذخیره شده اند در بانک به روز رسانی و رونویسی می شود.
<?php
if($_POST["B2 $name=$_POST["T1"];
$nevisande=$_POST["T2"];
$sal=$_POST["T3"];
$mozo=$_POST["S1"];
$bookfile=$_POST["bookfile"];
if(($_FILES['F1']['tmp_name'])!=NULL){
if(file_exists("../uploadbook/".$bookfile))
@unlink("../uploadpic/".$smallpic );
if(is_uploaded_file($_FILES['F1']['tmp_name'])) {
move_uploaded_file($_FILES['F1']['tmp_name'], "../uploadbook/".$_FILES['F1']['name']);
$filename2=$_FILES['F1']['name']; } }
$select="update books set name='$name', nevisande='$nevisande', sal='$sal', mozo='$mozo', download='$filename2' where id='$_POST[id]'";
mysql_query($select);
}
?>
دستورات زیر باعث حذف اطلاعات مورد نظر خواهد شد که با unlink فایل آپلود شده را حذف کرده و با عبارت Sql با دستور Delete و Where به رکورد مورد نظر رفته و آنرا حذف می کنیم.
<?php
if($_REQUEST["delete"]==1)
{
$id=$_REQUEST["code"];
$filename=$_REQUEST["filename"];
@unlink('../uploadbook/'.$filename);
$select="delete from books where id='$id' ";
mysql_query($select);
}
<?php if($_REQUEST["edit"]==1) { // agar request edit daryaft shod form zir ra neshan midahim ke baraye virayesh kardane ketab ast?>
<?php
$code=$_REQUEST["code"];
$select="select * from books where id='$code' ";
if($result=mysql_query($select))
while($row=mysql_fetch_array($result)) {
?>
?>
توضیحات مربوط به مدیریت کاربران نیز مشابه قسمت بالاست البته خیلی ساده تر.
چکیده
کتابخانه دیجیتال مجموعه ای از اطلاعات و خدمات به هم پیوسته ایست که در آن اطلاعات به صورت دیجیتال ذخیره شده و از طریق شبکه قابل دسترسی است
برتری کتابخانه های دیجیتال نسبت به کتابخانه های سنتی
۱ ۰ نیاز به مراجعه حضوری استفاده کننده نمی باشد و در واقع کتابخانه نزد کاربر می آید.
۲ . استفاده از رایانه برای جستجوی اطلاعات .
۳ . اشتراک اطلاعات
۴ ۰ امکان روز آمدسازی اطلاعات
۵ ۰ اطلاعات در هر زمانی قابل دسترسی است ، به عبارت بهتردرهای کتابخانه همیشه باز است.
۶ ۰ کم بودن هزینه آن
۷ ۰ ارزان بودن ذخیره سازی اطلاعات
انواع متون الکترونیک در کتابخانه دیجیتال
1 – فرمت های ذخیره :
1-1- فرمت HTML: برای متن های ساده (برای ساخت صفحات وب طراحی شده است و استفاده کننده می تواند در سراسر متن به جستجو بپردازد و یا از طریق پیوند های بیرونی از یک متن به متن دیگر برود.
1-2- فرمت GIF و JPEG: برای تصاویر.
2 – زبان های توصیف صفحه :
1-2-TEXT: به وسیله دونال ناس ابداع شد و در ریاضی و فیزیک بسیار کاربرد دارد.
2-2- post script : اولین محصول Adobe systems در سال 1984 بود.
2-3- PDF (قالب قابل حمل مدرک یا portable document format ) :
قالب مناسبی برای ذخیره صفحات تصویری در یک فرمت قابل انتقال که به هیچ کامپیوتر خاصی وابسته نیست.