بایگانی نویسنده

چگونه یک برنامه لاگین امن و حرفه ای با PHP طراحی کنید ?

بهمن ۱۰م, ۱۳۸۷

سرفصل‌ها :
۱
ـ این اسکریپت چگونه کار می کند | پیشنیازها | الگوی بانک اطلاعاتی
۲
ـ اتصال به بانک اطلاعاتی |‌ متغیرهای جلسات
۳
ـ هسته اسکریپت | ورود کاربران
۴
ـ کنترل مداوم اعتبار ورود | اطمینان از معتبر بودن اطلاعات جلسات

این آموزش در سطح متوسط طراحی گردیده و به شما خواهد آموخت که چگونه یک برنامه لاگین امن و حرفه ای طراحی کنید . بزودی یاد می گیریم که چگونه با استفاده از توابع کوکی ها دسترسی به جلسات را قانونی کنیم و از سرقت جلسات جلوگیری کنیم.

۱ـ این اسکریپت چگونه کار می کند ؟
در این قسمت می خواهم برایتان دلیل انتخاب این متد برای لاگین امن را برایتان توضیح دهم فراموش نکنید که اصولا امنیت قانون ندارد و شما نیز با استفاده از تجربیات و توانایی های هوشی خود باید به فکر توسعه و طراحی موارد مشابه و امن تر نمائید و به هیچ وجه به این حد بسنده نکنید:
/tmp
کاربرانی که قادرند تا به سرور دست یابی داشته باشند می تواند جلسات معتبر لاگینها را از شاخه پیش فرض
که به منظور ذخیره سازی اطلاعات جلسات استفاده میشود مشاهده نمایند روش جلوگیری از این نوع حمله کنترل آی پی می باشد.
کسانی که بر روی میزبان شما سایتی دارند قادرند جلسات معتبر برای سایت شما تولید کنند توجه بفرمائید که برخی سایتها سرورهای اختصاصی دارند که به لحاظ امنیتی بسیار مطلوبترند مثل سایت پرشین بلاگ
برخی از اون آدمایی که به قول خودمون آخرشن و اند حکن می تونن شبکه رو بو بکشن و کوکی‌ها رو بقاپن
کنترل آی پی این مشکل رو هم حل می کنه

۲-۱ـ اما پیش نیازها
شما اول از همه باید بدونین که چه اطلاعاتی از کاربران قرار که در سایت ذخیره بشه در این مثال برای سهولت آموزش ساده ترین شکل ممکن رو فرض قرار دادم ضمنن چون الان همه دیگه پی اچ پی ۴٫۱ به بالا دارن من هم از استفاده کردم اگر می خواین که این اسکریپت رو روی نسخه های قدیمی تر اجرا کنین شما super global arrays
مجبورید که از
$GLOBALS['HTTP_SESSION_VARS']
استفاده کنید.

الگوی بانک اطلاعاتی ـ۱-۳
این فقط یک مثال ساده با ساختاری مناسب برای مدیریت اگر که مایلید این مثال را برای کاربران ثبت نام شده استفاده کنید می توانید ستونهای را به دلخواه اضافه کنید
من الگوی بانک اطلاعاتی را که از مای اس کیو ال استفاده می کنه اینجا گذاشتم شما می تونین از دیگر بانکهای اطلاعاتی نیز استفاده کنید:


CREATE TABLE member (
id int NOT NULL auto_increment,
username varchar(20) NOT NULL default '',
password char(32) binary NOT NULL default '',
cookie char(32) binary NOT NULL default '',
session char(32) binary NOT NULL default '',
ip varchar(15) binary NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY username (username)
);


فیلدهای پسورد و کوکی برای استفاده از ام دی فایو طراحی شدن کوکی مقدارش برای زمانیست که کاربر بخواهد اطلاعات برایش ذخیره شود و فیلدهای جلسه و آی پی برای جلسه آی دی و آی پی کاربر استفاده می شوند.

ــــــــــــــــــــــــــــــــــــــ
۲
ـ اتصال به بانک اطلاعاتی

function &db_connect() {

require_once 'DB.php';

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'shaggy';

$dsn = \"mysql://$db_user:$db_pass@unix+$db_host/$db_name\";

$db = DB::connect($dsn);

$db->setFetchMode(DB_FETCHMODE_OBJECT);
return $db;

}

این تابع شما را به بانک اطلاعاتی متصل می کند و یک اشاره گر به شی بانک اطلاعاتی پیر باز می گرداند

۲-۲ـ متغیرهای جلسات:
برای سهولت در امر دستیابی به اطلاعات کاربران من اون رو یک متغیر جلسه ثبت می کنم ولی برای جلوگیری از پیغام خطا و همچنین ست کردن برخی پیش فرض ها از تابع زیر استفاده می کنم:

function session_defaults() {

$_SESSION['logged'] = false;
$_SESSION['uid'] = 0;
$_SESSION['username'] = '';
$_SESSION['cookie'] = 0;
$_SESSION['remember'] = false;
}

برای ست کردن یه مقادیر پیش فرض از تابع بالا و برای چک کردن از تابع زیر


if (!isset($_SESSION['uid']) ) {
session_defaults();
}

رو فرا خوانی کنیمsession_startالبته فراموش نمی کنیم که قبل از اینها باید تابع

۳ـ هسته اسکریپت:
برای ایجاد یکپارچگی ساده تر با دیگر اسکریپتها و ساخت مدوله شده تر هسته اسکریپت رو یک آبجکت با ظاهری خیلی ساده می سازم


class User {

var $db = null; // PEAR::DB pointer
var $failed = false; // failed login attempt
var $date; // current date GMT
var $id = 0; // the current user's id

function User(&$db) {

$this->db = $db;
$this->date = $GLOBALS['date'];

if ($_SESSION['logged']) {
$this->_checkSession();
} elseif ( isset($_COOKIE['mtwebLogin']) ) {
$this->_checkRemembered($_COOKIE['mtwebLogin']);

}

}


این کلاس که تعریف میشه آبجکت ما رو میسازه البته این کاملا مدوله شده نیست اما یک تاریخ مشکل بزرگی نیست و شما می تونین اونو با اسکریپتهایی که بقیه دوستان نوشتن به صورت شمسی تولید کنید در اینجا ما چنین چیزی رو می سازیم:


$date = gmdate(\"'Y-m-d'\");
$db = db_connect();
$user = new User($db);


حالا برای روشن شدن هدف کد یعنی لاگین کردن تلاش می کنیم ما ابتدا کنترل می کنیم که آیا کاربر لاگین کرده یا نه اگر این کار رو کرده بود ما جلسات رو چک می کنیم(فراموش نکنین که این یک کد امنیتی) وگرنه یک کوکی رو نام گذاری می کنیم برای کنترل کردن این به ما اجازه می ده که بینندگان سایت رو شناسایی کنیم

۳-۱ـ لاگین کردن کاربران:

برای اجازه دادن به کاربران برای لاگین کردن شما باید یک فرم وب بسازید پس از اعتبار سنجی فرم شما می تونید اعتبار کاربر رو برای تائید اطلاعات وارد شده کنترل کنید که برای اینکار از
$user->_checkLogin(‘username’, ‘password’, remember)
استفاده می کنیم
خاطر نشان می کنیم که یوزر نیم و پسورد البته نباید ثابت باشند و ریممبر یک مقدار بولین است که به کاربر اجازه می دهد تا با درست قرار دادن مقدار آن لاگین خودکار را فعال بسازد

function _checkLogin($username, $password, $remember) {

$username = $this->db->quote($username);
$password = $this->db->quote(md5($password));

$sql = \"SELECT * FROM member WHERE \" .
\"username = $username AND \" .
\"password = $password\";

$result = $this->db->getRow($sql);

if ( is_object($result) ) {
$this->_setSession($result, $remember);
return true;
} else {
$this->failed = true;
$this->_logout();
return false;
}

}


تعریف تابع باید در مکانی کنار کلاس تعریف شده یوزر باشه مانند تمام کدهای پائین در تابع از متدPEAR::DB’s quote استفاده کردم تا اطلاعات با امنیت کامل به بانک اطلاعاتی انتقال پیدا کنند و به صورت بی ختری نیز از آن رهای یابند و باز گردنند من از تابع ام دی فایو ترجیحا به جای توابع مای اسکیو ال استفاده کردم تا شما اگر مایل بودید بتوانید از بانکهای اطلاعاتی دیگر نیز استفاده کنید.
حلقه ور بهینه شده زیراکه یوزرنیم به صورت منفرد تعریف شده است نیازی به کنترل خطاهای بانک اطلاعاتی نیست زیراکه خطاهای پیشفرض قبلا در بالا ست شدند چنانچه آبجکت با رزالت بانک اطلاعاتی متچ شود لذا متغیر جلسات ست می شوند و مقدار ترو باز میگردد وگرنه مقدار فلد با ترو برابر می گردد شما می تونین اینجا یک دستور کنترلی قرار دهید تا پیغام سقوط عملیات لاگین رو اعلام کنه و برای انجام لاگ اوت برای این بیننده کافیست تا session_defaults() را اجرا کنیم

۳-۳ـ وضع کردن جلسه:


function _setSession(&$values, $remember, $init = true) {

$this->id = $values->id;
$_SESSION['uid'] = $this->id;
$_SESSION['username'] = htmlspecialchars($values->username);
$_SESSION['cookie'] = $values->cookie;
$_SESSION['logged'] = true;

if ($remember) {

$this->updateCookie($values->cookie, true);

}

if ($init) {

$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"UPDATE member SET session = $session, ip = $ip WHERE \" .
\"id = $this->id\";
$this->db->query($sql);

}

}

این متد متغیر جلسه را ست می کند و همچنین اگر در خواست کوکی برای داشتن لاگین مسمتر (خودکار) ارسال شده باشد
همچنین این متد یک پارامتر دارد که معین می کند که این بار اول لاگین کردن است یا نه (از طریق فرم یا کوکی)
یا کنترل جلسه برای اولین بار نیست.

۴ـ لاگین خود کار:
اگر بینندگان در خواست کنند که کوکی ارسال بشه تا دفعات بعدی از لاگین کردن در هر مشاهده از سایت بپرید
این دو متد به شما برای رسیدن به این مهم کمک خواهد کرد

function updateCookie($cookie, $save) {

$_SESSION['cookie'] = $cookie;
if ($save) {

$cookie = serialize(array($_SESSION['username'], $cookie) );
set_cookie('mtwebLogin', $cookie, time() + 31104000, '/directory/');
}

}

4-1ـ کنترل لاگین خود کار:
اگر کاربران لاگین خودکار را انتاخاب کرده باشند که به اسکریپت اجازه ذخیره کوکی را می دهد که کنترل می شه از طریق متد زیر

function _checkRemembered($cookie) {

list($username, $cookie) = @unserialize($cookie);
if (!$username or !$cookie) return;

$username = $this->db->quote($username);
$cookie = $this->db->quote($cookie);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, true);
}

}


این تابع هرگز نباید توسط پیغام خطایی متوقف شود برای ساختن چیزهای امن تر با کوکی ها مقدار کوکی در کوکی ذخیر می شود نه پسورد کاربر یکی از این راه ها می تونه درخواست یک لغت عبور باشه برای ناحیه ای که به امنیت بیشتری نیاز دارد

۵-۵ـ مطمئن شدن از اعتبار جلسه:

function _checkSession() {

$username = $this->db->quote($_SESSION['username']);
$cookie = $this->db->quote($_SESSION['cookie']);
$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie) AND \" .
\"(session = $session) AND (ip = $ip)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, false, false);
} else {
$this->_logout();
}

}


پوف بالاخره آخرین قسمت کار ما کنترل می کنیم که آیا کوکی ذخیره شده در جلسه درست هست یا نه جلسه آی دی و آی پی کاربر
با یک پارامتر که اجازه می ده که بفهمیم که این اولین بار لاگین کردن در سیستم هست بنابراین setSessionفراخوانی
مقدار آی پی و آی دی در جلسه بروز رسانی نشود که در بقیه موارد بطور معمول انجام می شود

توسعهء PHP

آذر ۱۲م, ۱۳۸۷

در این مقاله به بررسی نحوهء توسعهء PHP می پردازیم. یکی از بزرگترین محاسن برنامه های open source از جمله PHP، باز بودن متن برنامهء آنهاست که به توسعه دهندگان این امکان را می دهد تا برنامهء مورد نظر را طبق درخواست ها و نیاز های خودشان تغییر داده و از آن استفاده کنند. پس از خواندن این مقاله شما خواهید توانست توسعه های ساده ای برای PHP نوشته و از آنها در پروژه های خود استفاده کنید.

کلمات کلیدی

PHP، برنامه نویسی، لینوکس، open source

1. مقدمه

در این مقاله به بررسی نحوهء توسعهء PHP می پردازیم. یکی از بزرگترین محاسن برنامه های open source از جمله PHP، باز بودن متن برنامهء آنهاست که به توسعه دهندگان این امکان را می دهد تا برنامهء مورد نظر را طبق درخواست ها و نیاز های خودشان تغییر داده و از آن استفاده کنند. به عنوان مثال از تاریخ شمسی در PHP پشتیبانی نمی شود و شما می توانید با توسعهء این زبان، برای پشتیبانی این تقویم، آن را برای خود مناسب و قابل استفاده کنید.

پس از خواندن این مقاله شما خواهید توانست توسعه های ساده ای برای PHP نوشته و از آنها در پروژه های خود استفاده کنید. در این مقاله با هم توسعه ای ساده برای PHP خواهیم نوشت.

برای درک مطالب این مقاله احتیاج به داشتن اطلاعاتی در مورد زبان برنامه نویسی C و PHP و روش کامپایل کردن در لینوکس دارید. زبان برنامه نویسی این مقاله C بوده و محیط کاری لینوکس می باشد. پیش فرض آن است که شما توانایی نصب برنامه های مختلف تحت لینوکس را دارید. تمامی کار های این مقاله تحت خط فرمان یا command line انجام می شود و شما باید تسلط و درک کافی در این مورد را نیز داشته باشید.

۲٫ برنامه های مورد نیاز

برای توسعهء PHP احتیاج به نرم افزار هایی داریم که مسئولیت عملیات کامپایل کردن در لینوکس را دارند. لیستی از برنامه های مورد نیاز را در زیر می بینید، این نرم افزار ها را می توانید از آدرس www.gnu.org گرفته و روی سیستم لینوکس تان نصب کنید. در صورتی که از توسعه های معروف لینوکس استفاده می کنید اکثر این برنامه ها را نصب شده دارید.

• bison
• flex
• m4
• autoconf
• automake
• libtool
• gcc یا هر نوع کامپایلر دیگر
• make
• cvs از سایت www.cvshome.org

پس از نصب برنامه های فوق، احتیاج دارید نسخهء قابل توسعهء PHP یعنی نسخهء CVS یاConcurrent Version System آن را از آدرس http://cvs.php.net بگیرید و آمادهء توسعه شوید. برای این کار باید تحت خط فرمان لینوکس تان دستوری مشابه دستور زیر تایپ کرده و به جای X، Y و Z شمارهء نگارش PHP ای که قصد گرفتن آن را دارید را وارد کنید. با اجرای این دستور متن برنامه های PHP از اینترنت گرفته می شود و با شاخه ای به نام php-src روی دیسک سخت شما ذخیره می شود.


cvs -d :pserver:cvsread@cvs.php.net:/repository checkout -r php_X_Y_Z php-src

3. توسعهء PHP

3.1. هدف برنامه و آماده کردن محیط

می خواهیم تابعی به PHP اضافه کنیم به شکل salam() که به عنوان ورودی یک رشته را دریافت کرده و رشته ای به صورت salam STRING را بر گرداند.

به عنوان اولین قدم، به شاخهء PHP رفته و سپس به شاخهء ext آن می رویم و فایلی را در مورد نوع توابعی که قصد توسعه داریم می سازیم. در این فایل که ما نام آن را salam.def می گذاریم به ترتیب نوع خروجی توابع، نام تابع، نام و نوع پارامترهای ورودی، یک ” ” (فاصله) به عنوان جدا کننده و رشته ای که توضیح مختصری از آن تابع باشد را می نویسیم. در این فایل، هر تابع را باید در یک خط بنویسیم. در زیر به نمونه فایل مورد نیاز برای توسعهء تابع مان توجه می کنیم:


string salam(string arg) return \"salam ARG\"

توجه کنید که تمامی مقادیر بعد از پرانتز بسته تا آخر خط ، توضیحات تابع می باشند.

PHP برنامه ای به نام ext_skel برای آماده سازی مقدمات توسعه دارد، که در شاخهء ext قرار دارد و شما می توانید به عنوان دومین قدم توسعه، از آن استفاده کنید. برای ادامهء توسعه احتیاج داریم از خط زیر استفاده کرده تا مجموعهء فایل های مورد نیاز توسط این برنامه ساخته شود.


./ext_skel –extname=salam –proto=salam.def

با اجرای این دستور شاخه ای به نام مقدار جلوی –extname ساخته شده و فایل های مورد نیاز نیز در آن قرار می گیرد. این فایل ها عبارتند از:
• config.m4
• CREDITS
• EXPERIMENTAL
• salam.c
• salam.php
• Makefile.in
• php_salam.h
• شاخهء tests

3.2. توسعهء فایل ها

یکی از مهمترین و اصلی ترین فایل هایی که لازم است تغییر دهیم و تمامی کدهای اصلی برنامهء ما در آن قرار دارد، فایل salam.c می باشد. با باز کردن این فایل، اولین قسمت مهمی که مشاهده می کنید، خطوط زیر می باشد:

/* {{{ salam_functions[]
*
* every user-visible function must have an entry in salam_functions[]
*/
function_entry salam_functions[] = {
PHP_FE(confirm_salam_compiled,  NULL)  /* for testing; remove later */
PHP_FE(salam,   NULL)
{NULL, NULL, NULL}  /* must be the last line in salam_functions[] */
};
/* }}} */

این مقادیر توسط فایل salam.def که تعریف کرده بودیم ساخته شده و در صورتی که فایل salam.def را بدون نقص نوشته باشیم، احتیاجی به ایجاد تغییر در این قسمت نداریم. توجه کنید که اولین تابع معرفی شده یعنی confirm_salam_compiled یک تابع برای تست کامپایل شدن یا نشدن سری توابع مان بوده که پس از موفقیت در کامپایل، می توانیم خط مربوطه را حذف کنیم.

کدهای مهم بعدی، مشابه بخش زیر خواهد بود که شامل توابع پیش فرض زمان فراخوانی و اتمام کار توابع مورد نظر می باشد. این بخش، اطلاعاتی در مورد نوع، نگارش و نام توسعهء ما را نیز داراست.

zend_module_entry salam_module_entry = {
STANDARD_MODULE_HEADER,
\"salam\",
salam_functions,
PHP_MINIT(salam),
PHP_MSHUTDOWN(salam),
PHP_RINIT(salam), /* replace with NULL if no request init code */
PHP_RSHUTDOWN(salam), /* replace with NULL if no request shutdown code */
PHP_MINFO(salam),
\"0.1\", /* replace with version number for your extension */
STANDARD_MODULE_PROPERTIES
};

برای تابعی که ما می خواهیم توسعه دهیم باید مقادیر PHP_RINIT(salam) و PHP_RSHUTDOWN(salam) را با NULL جایگزین کنیم، پس کد شما چیزی شبیه مقادیر زیر خواهد شد:

zend_module_entry salam_module_entry = {
STANDARD_MODULE_HEADER,
\"salam\",
salam_functions,
PHP_MINIT(salam),
PHP_MSHUTDOWN(salam),
NULL,
NULL,
PHP_MINFO(salam),
\"0.1\", /* replace with version number for your extension */
STANDARD_MODULE_PROPERTIES
};

سپس توابع PHP_MINIT(salam)و PHP_MSHUTDOWN(salam) را پیدا کرده و تعیین می کنیم که مقدار SUCCESS را برگردانند. پس کد این بخش برنامهء ما شبیه کد زیر می شود


PHP_MINIT_FUNCTION(salam) {
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(salam) {
return SUCCESS;
}
سپس به اصلی ترین تابع می رسیم که باید تمام وظایف مورد نظر برای تابع salam را در آن توسط زبان C نوشته تا خروجی مناسب را برای ما تولید کند. کدهای شما باید بعد از خط return بیاید و خط های بالای آن بدون تغییر بماند (این بدون تغییر ماندن به دلیل آگاهی نداشتن ما برای تغییر آنهاست. صحبت کامل در مورد این خطوط از حوصلهء این مقاله خارج بوده و فقط کافیست بدانید که این کدها شامل مراحل پردازش مقادیر ورودی تابع است).
/* {{{ proto string salam(string arg)
return \"salam ARG\" */
PHP_FUNCTION(salam)
{
char *arg = NULL;
int argc = ZEND_NUM_ARGS(  );
int arg_len;

if (zend_parse_parameters(argc TSRMLS_CC, \"s\", &arg, &arg_len)
== FAILURE)
return;

// YOUR CODES SHOULD COME HERE
}
/* }}} */

تابع PHP_FUNCTION برای PHP نام یک تابع را مشخص می کند و مقادیر داخل این تابع، اعمالی را که تابع PHP در هنگام فراخوانی آن در برنامه های PHP باید انجام دهد را نشان می دهد. همانطور که گفته شد، بعد از چند خط اول، کدهای ما قرار خواهد گرفت و برنامهء ما به صورت زیر در خواهد آمد:
PHP_FUNCTION(salam) {
char *arg = NULL, *sout;
int argc = ZEND_NUM_ARGS(  );
int arg_len, len;

if (zend_parse_parameters(argc TSRMLS_CC, \"s/\", &arg, &arg_len)
== FAILURE)
return;

strcpy(sout, \"salam \");
strcat(sout, arg);
len = strlen(sout);
RETURN_STRINGL(sout, len, 1);
}

ابتدا متغیر هایی به نام sout از نوع کاراکتر و len از نوع عددی تعریف کرده ایم. در خط بعد از return مقدار “salam ” را در متغیر sout کپی کرده و سپس مقادیر sout و arg که رشتهء ورودی ما می باشد را به هم متصل می کنیم و به sout انتساب می دهیم. سپس طول sout را به دست آورده و از طریق تابع RETURN_STRINGL (این تابع جزو توابع ZEND API بوده و برای برگرداندن مقادیر استفاده می شوند، این توابع محدود و تعیین شده می باشند) مقدار رشته و طول آنرا بر می گردانیم. سومین متغیر در تابع RETURN_STRINGL مشخص کنندهء صحت خروجی یا وجود اشکال در خروجی می باشد.

هم اکنون توسعه تابع ما به پایان رسیده، اما برای امکان کامپایل تابع توسعه داده شده لازم است مقادیر لازم برای درست کامپایل شدن تابع را تصحیح و کامل کنیم. پس فایل salam.c را ذخیره کرده و می بندیم و فایل config.m4 را برای اِعمال تغییرات باز می کنیم. در این فایل، از قبل، خطوط لازم وجود دارند ولی به صورت توضیح یا comment در آمده اند که شما باید این خطوط را از این حالت خارج کنید. پس از این کار خطوطی دقیقاً مشابه خطوط زیر خواهید داشت (توجه کنید که هیچ علامتی در ابتدای این خطوط نباشند):

PHP_ARG_ENABLE(salam, whether to enable salam support,
[  --enable-salam           Enable salam support])
توسعهء تابع ما به پایان رسید، حال نوبت کامپایل کردن PHP است تا بتوانید از تابعی که نوشتیم در آن استفاده کنیم. در بخش بعد به این مسئله می پردازیم.

۴٫ کامپایل PHP

قبل از اجرای دستورات کامپایل، برای اینکه PHP، توسعهء جدید ما را بشناسد، لازم است دستور buildconf را که در شاخهء اصلی PHP قرار دارد، اجرا کنیم. این دستور را باید به شکل زیر وارد کنیم:


./buildconf

سپس باید برنامه را با توسعه ای که نوشتیم کامپایل کنیم. این کار در PHP شبیه خیلی از برنامه های دیگر تحت لینوکس انجام می شود. به این صورت که شما باید مقداری مشابه مقدار –enable-salam را در هنگام configure کردن PHP اِعمال کنید. سپس سری دستورات make را برای نصب PHP اجرا می کنیم. دستوراتی که اجرا می کنیم به ترتیب، شبیه دستورات زیر خواهد بود، توجه کنید که تمامی این دستورات باید در شاخهء اصلی PHP اجرا شوند:


./configure --enable-salam
make
make install

اکنون PHP شما با تابع شما توسعه پیدا کرده است. حال نوبت آزمایش تابع است تا مشاهده کنیم که درست کار می کند. برای این منظور فایلی با توسعهء php و نام test ساخته و مقادیر زیر را در آن می نویسیم:

<?php
echo salam('donya');
?>

سپس، در خط فرمان دستور زیر را اجرا کنید. می بینید که مقدار “salam donya” در خروجی چاپ خواهد شد.


/usr/bin/php –q test.php

در این مقاله یاد گرفتیم که چطور از برتری های برنامه های open source استفاده کرده و از آنها برای رسیدن به اهداف مان استفاده کنیم و چطور آنها را توسعه دهیم.
تابعی برای PHP ساختیم، که قبلا در آن وجود نداشت و از آن در برنامه ای که با PHP نوشتیم استفاده نمودیم.
به یاد داشته باشید که این مقاله، فقط توضیحات مختصری در مورد توسعهء PHP ارایه کرده و قصد آشنا کردن شما با این مقوله را داشته است

PHP در مسیر شئ گرایی(قسمت اول)

آذر ۱۲م, ۱۳۸۷

اغلب از مفهوم شئ گرایی در زبان مورد علاقه ما چشم پوشی می شود یا به غلط تفسیر می شود ولی اگر به طور صحیح بکار گرفته می شود خیلی هم قوی به نظر می رسد. آینده PHP
درباره شئ گرایی بسیار روشن است این از خصوصیات جدیدی که در PHP5 گنجانده شده کاملأ مشخص است. با ابزار مناسب تنها چیزی که لازم داریم دانش است. در این مقاله
سعی شده که مفهوم واقعی شئ را بررسی کنیم و اینکه چه جوری اونها را شناسایی کنیم همچنین سعی شده ما را با سه رکن اصلی OOP یعنی کپسوله کردن، ارث بری و
پلی مورفیسم بیشتر آشنا کند.
برنامه نویسی شئ گرا همانطور که از اسمش هم پیداست برنامه نویسی با اشیاء است. ولی خوب معنی دقیق شئ چیه؟
بذارید اول بگم شئ چی نیست! شئ فقط یه کلاس نیست که یه مشت تابع داخلش ریخته باشن. شاید به نظر بدیهی بیاد ولی واقعیت اینه که وقتی آدم مقوله OOP رو در یه زبان
رویه ای مثل PHP کشف می کنه هیجان زده میشه که زودتر استفادش کنه بدون اینکه از تئوری اولیه اون خبر داشته باشه!
حالا شئ چیه؟
شئ موجودیتی است که خصوصیات(properties) و رفتارهایی را (behavior) در خودش کپسوله می کند که مخصوص همان موجودیت است.
شاید به نظر عجیب بیاد ولی اشیاء دور و ور ما هستند. بعضی خودشون از اشیاء دیگری تشکیل شدن. روزنامه دستتون، پنجره اتاق خود اتاق در دیوار…
ولی درباره OOP بعنوان یک مفهوم چیزای زیادی هست که باید بدونیم. در طول این سالها (کدوم سالها؟!) متدلوژیهای مختلفی برای نزدیک شدن به شئ گرایی توسعه یافتند، حتی
می شه به سه مرحله تقسیمش کرد: تحلیل شئ گرا(OOA)، طراحی شئ گرا(OOD) و برنامه نویسی شئ گرا(OOP) که برای تبحر در هر کدومشون وقت زیادی لازم است
مثلا مدلهای طراحی هنوز بدجوری رویه ای هستند. می دونید فقط syntax نیست که مهم هست در واقع قسمت سخت ماجرا شئ گرایانه فکر کردن و تمرین کردن و در نهایت
بکارگیری هست. نگذارید این واقعیات شما رو دلسرد کنه چون یادگیری مفاهیم قسمت اعظم موضوعه (که لابد تو این مقاله قراره یاد بگیریم)
شئ گرایی مزایای زیادی داره از جمله: استفاده دوباره، توسعه پذیری و نگهداشت پذیری که مهمترین اونها هستن.

استفاده دوباره: اشیاء می توانند رو پای خوشون بایستند یعنی مجردند؛ و نشاندهنده یک چیز هستند. به این معنی که می توانند به گونه های مختلف ترکیب شوند، که
این همون خاصیت استفاده دوباره را ایجاد میکند. استفاده دوباره از اشیاء کلی توی وقت ما صرفه جویی میکنه چون مجبور نیستیم همه چیز و از اول بسازیم.
توسعه پذیری: بجای نوشتن یک شئ از اول ما می تونیم یک شئ را گسترش بدیم. یه شئ می تواند از یک شئ دیگر مشتق شود و فقط کارایی هایی را که لازم
است به شئ جدید بیفزاییم.
نگهداشت پذیری: طبیعتأ اشیاء چون خوانایی بالایی دارند، خیلی راحتتر تحلیل میشوند و خیلی بهتر میتوان از برنامه های موجود توسعه اشون داد و اینکه
طبیعت “pluggable” دارند کد کمتری برای ویرایش اونها لازم است.

تصور غلط درباره بکارگیری OOP در PHP
قبل از ادامه بحث دوست دارم یه مقدار درباره این موضوع که PHP 4 شئ گرایی را پشتیبانی نمی کند صحبت کنم. بریم سر اصل مطلب:

فقدان وجود کنترلهای دستیابی: گرچه این در php5 تغییر میکنه (private, public و protected اضافه خواهند شد) به عقیده بنده این پارامتری نیست که جلوی
ما را در بکارگیری OOP بگیره، کنترلهای دستیابی به هیچ وجه به منظور ایجاد امنیت بوجود نیامدند، بلکه برای کمک کردن به برنامه نویس درست شدند که
برنامه نویس لازم نباشه نگران باشه که تصادفی به اعضایی دسترسی پیدا شود که نباید دست بخورند. فقط باید حواسمون رو بیشتر جمع کنیم. اینکه مفسر برنامه این
اجازه را از شما نمی گیره به این معنا نیست که شما تئوری oop رو نمی تونید بکار بگیرید.

فقدان کلاسهای مجرد: بازهم این نمی تونه شما رو از کدنویسی شئ گرا باز نگه داره حتی در تئوری! اساسأ یک کلاس مجرد به این معناست که شما باید در هنگام
ایجاد زیرکلاسها متدهای مجرد پیاده سازی کنید، و قادر نباشید از آن instance بسازید(خدا وکیلی اینو خودم هم نفهمیدم چی گفت). بعضی از زبانها مثل جاوا بصورت
built-in این موضوع را پشتیبانی می کنند که خیلی خوبه ولی بدون اون هم زندگی غیر ممکن نیست! بسادگی میشه یک متد خالی در superclass رو در زیر کلاسها
override کنید.(که در قسمت پلی مورفیسم نشان خواهم داد چگونه).

عدم پشتیبانی از ارث بری چندگانه: گرچه بعضی اعتقاد دارند که ارث بری چندگانه مفید هست ولی به عقیده من فقط ایجاد ابهام میکند. شما چندتا مثال سراغ دارین که
در آن یک شئ از دو یا چند superclass ارث ببره و هنوز بتونه رابطه is-a را حفظ کنه (اگر معنی این رابطه را نمی دانید من پایینتر توضیح دادم).

گرچه عقاید متفاوتند ولی من فکر نمی کنم این محدودیتها کاملا قابل چشم پوشی هستند و اصلأ دلیل خوبی برای ترک شئ گرایی درphp نیستند.

درک اشیاء
وقتی داریم تکنیک های جدید برنامه نویسی را یاد می گیریم، معمولأ خوبه که از نمونه های دنیای واقعی کمک بگیریم. اینجا می تونیم یک ماشین را در نظر بگیریم. فکر کنید یک
ماشین چه چیزهایی دارد(properties) و چه کارهایی می تواند انجام دهد(behaviour) .
چیزهایی که ماشین دارد: properties))
پنجره
در
چرخ
موتور
در اینجا لازم به ذکر است که که properties خودشون می توانند شئ باشند با properties و behaviour خودشان. در شئ گرایی این ترکیب نام دارد. شما می توانید
بگویید که ماشین تشکیل شده از… و حتی پا را فراتر بگذارید و بگویید که هر شئ هم از اشیاء دیگر تشکیل شده و …. ولی در موقع برنامه نویسی سعی کنید فقط چیزهایی
را تعریف کنید که بدرد میخورند و بیخودی وارد جزئیات نشوید.

خوب بریم ببینیم یک ماشین چه کار می تواند بکند:
شتاب بگیرد
ترمز کند
درها باز شوند
این رفتارها مخصوص خود ماشین هستند. شما باید قادر به تشخیص اشیاء در واقعیت باشید تا بتوانید خوب از معماری شئ گرا استفاده کنید واقعأ احمقانه نیست که در زندگی
عادی شئ گرا فکر کنیم. کل عالم از اشیاء تشکیل شده، سعی کنید اشیاء را شناسایی کنید!

رکن اول: کپسوله کردن
از اینجا به بعد باید از یک زاویه دیگه به قضیه نگاه کنیم. آیا یک ماشین می تواند خودش براند؟ البته که نه، وقتی شئ گرا نگاه کنیم خود راننده یک موجودیت جداست.
خیلی مهم است که این تفاوت را حس کنیم: اشیاء باید مسوولیت های خودشان را داشته باشند. اونها فقط باید قادر باشند کارهای خودشان را انجام بدهند و نه چیزی بیشتر
در واقع property های یک شئ فقط باید تحت تأثیر رفتارهای همان شئ تغییر کنند. اینکه یک شئ مستقیمأ بتواند روی property های شئ دیگر تأثیر بگذارد بکلی
غلط است. یک شئ باید جزئیاتش را برای خودش حفظ کند و آنچه که بروز می دهد فقط interface اش باشد و یک شئ دیگر فقط به جزئیات آن شئ از طریق این
interface می تواند دسترسی داشته باشد. وقتشه که این تئوری را ازطریق یک کد بازگو کنیم: یک کارخانه اتومبیل می خواهد اتومبیل بسازد ولی فقط در سه رنگ:
قرمز، آبی و سبز. برای اینکه بدونید مسوولیت یعنی چی من اعتراف می کنم مثال اولم مثال خوبی نبود! در ضمن syntax برنامه ربطی به من نداره می تونید
php manual را تحت عنوان Class/object functions مطالعه کنید.

<?php
class Car
{
var
$color;
}

$specificCar = new Car();
$specificCar->color = “yellow\”;
?>

اشتباه! قانون ما این بود که هیچ رنگی غیر از قرمز و آبی و سبز ساخته نشود. خوب معلومه آخر عاقبت اداره کردن مستقیم colour property همینه دیگه! اتومبیل موند رو دستمون.
چون ما یک interface برای مراقبت از مسوولیت ها ایجاد نکردیم. در لیست ۱ مثال بهتری را خواهید یافت.
لیست ۱

<?php
class Car
{
var
$color;
var
$possibleColors = array(“red\”, \”green\”, \”blue\”);

function setColor($color)
{
if (in_array($color, $this->possibleColors)) {
$this->color = $color;
}
}
}

$specificCar = new Car();
$specificCar->setColor(\”yellow\”); //would not alter the object

$specificCar->setColor(\”red\”); //would alter the object
?>

سعی کنید که این کد را درک کنید و اینکه چرا این راه بهتر است، این بار اتومبیل ما یک interface دارد که ما از طریق این interface می توانیم مقادیر properties
را تغییر دهیم، متد setColor مراقب هست که چه اتفاقاتی ممکن است برای properties اتومبیل بیفتد. اگر interface امان را خوب بنویسیم، می توان مطمئن بود که
که اگر به غلط هم مقداردهی شود اتفاق بدی برای properties نخواهد بود و interface مراقب اوضاع خواهد بود. متد setColor اصلاح کننده(modifier) نام دارد و
property شئ اتومبیل را اصلاح می کند. در کنار اصلاح کننده، accessor ها را داریم. accessor برای برگرداندن property بجای اصلاح آن بکار می رود.
لیست ۲ مثالی برای accessor را نشان می دهد.
لیست ۲

<?php
class Car
{
var
$color;

/*
* constructor, code inside this function is executed on object
* initialisation
* note that in PHP 5 the constructor will have to have the name
* __construct(), instead of the class name
* although this way of constructing will still work as long as no
*___construct() is found
*/
function Car()
{
$this->color = “red\”;
}

// Accessor
function getColor()
{
return $this->color;
}
}
?>

در لیست ۲ متد getColor همان accessor است. accessor ها همچنین می توانند داده را قبل از برگرداندن اداره کنند. همیشه بهتر است که بجای ارجاع مستقیم به
property های داخلی یک شئ از accessor ها استفاده کنیم. حالا می دونم بعضی از شما می پرسید که “من واقعأ نمی تونم property های شئ را مستقیمأ اداره کنم؟”
درسته. وقتی این مقاله نوشته می شد php هنوز فاقد اصلاح کننده هایی مثل private بود. هرچند این موضوع در php5 تغییر خواهد کرد شما می توانید محدودیت های
سر سختی برای قسمت های خصوصی خودتان بگذارید تا خیالتان راحت باشد که بهیچ وجه دستکاری نمی شوند.
خیلی مهم است که رفتار شئ شما بخوبی از طریق interface یا متدها تعریف شده باشد. چون خیلی مهم است که یک interface خوب در موقع استفاده دوباره هم خوب
باشد، باید واضح باشد که یک شئ چکار می کند. همیشه سعی کنید اسامی برای کلاسها انتخاب کنید که کار اون کلاس را بطور خلاصه بیان کند. از نوشتن اسامی بلند نترسید
در مجموع کپسوله کردن یعنی:
اشیاء جزئیات را برای خودشون نگه دارند
یک شئ فقط باید چیزی را ارائه کند که لازم است
یک شئ مسوولیت های خودش را دارئ
یک شئ باید interface واضحی داشته باشد

آشنایی با ماژول Mysqli در PHP 5

آذر ۱۲م, ۱۳۸۷

یکی از ویژگی های جالبی که در php 5 ارائه شده است یک Extension جدید به نام ext/mysqli می باشد که همانند ext/mysql سابق به عنوان یک رابط برای کار با پایگاه داده mysql از آن استفاده می شود. برای برنامه های کاربردی در مقیاس بزرگتر ماژول جدید MySQLi به کاربران اجازه می دهد که از ویژگی های جدید MySQL 4.1 در برنامه های خود استفاده کنند که بازدهی بیشتری را نسبت به نسخه های قبلی MySQL فراهم می کند.

از اواسط دهه ۹۰ تاکنون ext/mysql نقش خود را به عنوان یک پل رابط میان PHP و MySQL به خوبی ایفا کرده است. اگرچه ext/mysql نقاط ضعف کمی داشته است ولی توانسته است که همگام با تغییرات PHP و MySQL پیش رود.

اما وقتی که PHP 5 و MySQL 4.1 پا به عرصه نهادند ext/mysql نشان داد که برای سازگاری با پیشرفت های زیاد این دو نسخه، فقدان هایی را دارد.یکی از این نفاط ضعف مربوط به برقراری ارتباط پایدار و دایمی با پایگاه داده (mysql_pconnect()) بود. ویژگی ها و امکاناتی توسط MySQL ارائه شد که ext/mysql هنوز قادر به سازگاری با آنها نبود. برای رفع این مشکلات Georg Richter شروع به ساخت یک extension جدید برای PHP 5 کرد که با ویژگی های ارائه شده در MySQL 4.1 و نسخه های بالاتر همگام باشد.

مهمترین ویژگی های ارائه شده توسط ext/mysqli

ارائه یک واسط روالی (Procedural Interface) که بسیار شبیه واسط ext/mysql می باشد
ارائه یک واسط شی گرا(Object-Oriented Interface) که در مقایسه با واسط روالی از انعطاف پذیری بیشتری برخوردار است و کار با آن راحت تر است(با توجه به امکانات شی گرایی در PHP 5)
پشتیبانی از پروتکل باینری جدید MySQL که در نسخه ۴٫۱ عرضه شد.(این پروتکل جدید در مقایسه با قبلی از بازدهی بیشتری برخوردار است و امکانات گسترده ای همچون Prepared Statement را پشتیبانی می کند.)
پشتیبانی از تمام ویژگی های مجموعه کتابخانه کاربری MySQL C که شامل قابلیت تنظیم گزینه های پیشرفته اتصال از طریق mysqli_init() و توابع وابسته می شود.

به دو دلیل توصیه می شود که به این ماژول جدید switch کنید و از این به بعد با این ماژول کار کنید:

سرعت بیشتر
امنیت بیشتر

حرف i در انتهای ext/mysqli به معنای ,improved, interface, ingenious, incompatible incomplete می باشد!

نحوه کار با ext/mysqli

*قبل از کدنویسی توجه داشته باشید که برای استفاده از این ماژول، شما باید PHP 5 و MySQL 4.1 را نصب کرده باشید.کدهای این مقاله از پایگاه داده World استفاده می کنند که به صورت رایگان از آدرس http://www.mysql.com/documentation/index.html قابل دریافت می باشد

برنامه ساده زیر ابتدا به پایگاه داده متصل می شود و با ارسال یک پرس و جو(Query) به Server ، دریافت نتایج و نمایش آنها و سپس بستن اتصال به کار خود خاتمه می دهد:

<?php

/* Connect to a MySQL server */
$link = mysqli_connect(
‘localhost’, /* The host to connect to */
‘user’, /* The user to connect as */
‘password’, /* The password to use */
‘world’); /* The default database to query */

if (!$link) {
printf(“Can’t connect to MySQL Server. Errorcode: %s\n\”, mysqli_connect_error());
exit;
}

/* Send a query to the server */
if ($result = mysqli_query($link, ‘SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5′)) {

print(\”Very large cities are:\n\”);

/* Fetch the results of the query */
while( $row = mysqli_fetch_assoc($result) ){
printf(\”%s (%s)\n\”, $row['Name'], $row['Population']);
}

/* Destroy the result set and free the memory used for it */
mysqli_free_result($result);
}

/* Close the connection */
mysqli_close($link);
?>

بعد از اجرای اسکریپت بالا باید خروجی را به صورت زیر مشاهده کنید:

Very large cities are:

Mumbai (Bombay) (10500000)
Seoul (9981619)
São Paulo (9968485)
Shanghai (9696300)
Jakarta (9604900)

همانطور که در کد مشاهده می کنید در اینجا هیچ تفاوت خاصی بین ext/mysql و ext/mysqli مشاهده نمی شود جز افزوده شدن حرف i به آخر توابع!

حال اگر از واسط شی گرا استفاده کنید و برنامه بالا را مجددا بازنویسی کنید به انعطاف پذیری بیشتر و راحتی کار با این واسط جدید پی می برید:

<?php

/* Connect to a MySQL server */
$mysqli = new mysqli(‘localhost’, ‘user’, ‘password’, ‘world’);

if (mysqli_connect_errno()) {
printf(“Can’t connect to MySQL Server. Errorcode: %s\n\”, mysqli_connect_error());
exit;
}

/* Send a query to the server */
if ($result = $mysqli->query(‘SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5′)) {

print(\”Very large cities are:\n\”);

/* Fetch the results of the query */
while( $row = $result->fetch_assoc() ){
printf(\”%s (%s)\n\”, $row['Name'], $row['Population']);
}

/* Destroy the result set and free the memory used for it */
$result->close();
}

/* Close the connection */
$mysqli->close();
?>

همانطور که مشاهده می کنید اطلاعات مربوط به اتصال در اشیای $mysqli و $result ثبت می شود و برای اجرای دستورات نیازی به مشخص کردن این اطلاعات نداریم. همچنین وقتی در بین نتایج پرس و جو به صورت سطر به سطر توسط تابع fetch_assoc() حرکت می کنیم دیگر نیازی به ساخت یک handle برای کار با رکوردها نداریم.

استفاده از ویژگی Prepared Statements در پرس و جوها

مزیت Prepared Statements این است که به کاربران امکان ساخت query های بسیار ایمن تر، با بازدهی بیشتر و راحت تر را می دهد. به دو صورت می توان از این ویژگی بهره برد: bound parameter prepared statements و bound result prepared statements

bound parameter prepared statements این امکان را به ما می دهد که برای Query های خود قالب (Template) درست کنیم و آنها را در Server ذخیره کنیم. وقتی نیاز به اجرای Query داشتیم اطلاعات لازم را برای پر کردن Query به Server می فرستیم و سپس Query کامل را اجرا می کنیم. این کار دو مزیت دارد:

اول اینکه زمان کمتری صرف تجزیه و تحلیل Query در هنگام اجرا می شود. و دوم اینکه از حملات تزریقی SQL(SQL injection attacks) جلوگیری می شود.

در زیر یک مثال کامل از به کارگیری این ویژگی را در پرس و جوها مشاهده می کنید:

<?php
$mysqli
= new mysqli(‘localhost’, ‘user’, ‘password’, ‘world’);

/* check connection */
if (mysqli_connect_errno()) {
printf(“Connect failed: %s\n\”, mysqli_connect_error());
exit();
}

$stmt = $mysqli->prepare(\”INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)\”);
$stmt->bind_param(‘sssd’, $code, $language, $official, $percent);

$code = ‘DEU’;
$language = ‘Bavarian’;
$official = \”F\”;
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf(\”%d Row inserted.\n\”, $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query(\”DELETE FROM CountryLanguage WHERE Language=’Bavarian’\”);
printf(\”%d Row deleted.\n\”, $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

توجه کنید که تابع bind_param() یک رشته کوتاه را به عنوان اولین پارامتر خود می گیرد. این پارامتر String Format می باشد و نوع متغیرهای ارسالی را مشخص می کند. در مثال بالا sssd مشخص می کند که $code و $language و $official از نوع String می باشند و $percent از نوع float یا Double می باشد. مشخص کردن این نوع داده ها باعث می شود که ext/mysqli بداند که چگونه داده ها را برای فرستادن کدگذاری کند و این کار باعث بازدهی بالا می شود.جدول زیر نوع داده های قابل قبول را نشان می دهد:

BIND TYPE
COLUMN TYPE

i
All INT types

d
DOUBLE and FLOAT

b
BLOBs

s
All other types

اگر با ASP.NET هم آشنایی دارید، در زیر می توانید نحوه به کارگیری این ویژگی را درASP.NET هم مشاهده کنید و با PHP 5 مقایسه کنید:

Dim cnn As New SQLConnection(\”server=LOCALHOST;User id=SA;password=;database=Northwind\”)
Dim InsertCommand As SqlCommand = New SqlCommand()
InsertCommand.Connection = cnn
Dim sql As String
sql = \”INSERT INTO categories (categoryName) VALUES (@newCatName)\”

InsertCommand.CommandText = sql

InsertCommand.Parameters.Add(\”@newCatName\”, SqlDbType.NVarChar, 250).Value = \”Category Name\”

Bound result prepared statements این امکان را می دهد که مقدار فیلدهای دریافتی از پایگاه داده را به متغیر های دلخواه نسبت دهیم(چیزی شبیه تابع list که عناصر یک آرایه را به متغیر های دلخواه نسبت می دهد.)

مثال زیر استفاده از این ویژگی را نشان می دهد:

<?php
$mysqli
= new mysqli(“localhost\”, \”user\”, \”password\”, \”world\”);

if (mysqli_connect_errno()) {
printf(\”Connect failed: %s\n\”, mysqli_connect_error());
exit();
}

/* prepare statement */
if ($stmt = $mysqli->prepare(\”SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5\”)) {

$stmt->bind_param(\”s\”, $code);
$code = \”C%\”;

$stmt->execute();

/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);

/* fetch values */
while ($stmt->fetch()) {
printf(\”%s %s\n\”, $col1, $col2);
}

/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();

?>

ساختن لینکدونی با تعداد دفعات کلیک

آذر ۱۲م, ۱۳۸۷

برای نوشتن این لینکدونی با PHP به کدها و طی کردن مراحل زیر نیاز داریم:

* ساختن جدول لینکهامون در یک دیتابیس (که ما اینجا از MySQL استفاده می کنیم)، شامل فیلدهای: «آدرس لینک»، «متن لینک»، «توضیحات لینک (Tooltip)»، «تعداد کلیک‌ها» و «تاریخ اضافه شدن لینک»
* صفحه‌ای که بتونیم لینکهامون رو از اون طریق وارد دیتابیس کنیم
* کدی برای شمردن تعداد کلیک‌ها
* کدی برای نمایش دادن تعدادی از آخرین لینکهای وارد شده در صفحه‌ی اصلی

برای اینکه مقاله‌ی جامعی باشه سعی می‌کنم تمام مراحل رو تا اونجایی که بشه به طور کامل توضیح بدم.
برای مرحله اول به کد زیر احتیاج داریم که می تونید اون رو خیلی راحت در دیتابیس‌تون Import کنید و جدولتون رو بسازید.

CREATE TABLE links (
id int(11) NOT NULL auto_increment,
link text NOT NULL,
description text NOT NULL,
tooltip text,
hits int(5) NOT NULL default ‘۰′,
date date NOT NULL default ‘۰۰۰۰-۰۰-۰۰′,
PRIMARY KEY (id)
) TYPE=MyISAM

خب، الان جدول‌مون رو ساختیم و کافیه که از طریق یه فرم خیلی ساده، لینک‌هامون رو همراه با توضیحاتشون واردش کنیم. برای این کار، یه صفحه با نام «links_entry.php» می‌سازیم که Action فرم توش رو هم همین صفحه قرار می‌دیم. این هم کد فرم همراه با کدی که اطلاعات رو از فرم می‌گیره و وارد دیتابیس می‌کنه

<form method=\”post”>
Link: <input name=\”link” type=\”text” size=\”50″>
Description: <input name=\”description” type=\”text” size=\”50″>
Tooltip: <input name=\”tooltip” type=\”text” size=\”50″>
<input type=\”submit” value=\”Submit”>
</form>
<?
$link
= $_POST[“link”];
$description = addslashes($_POST[“description”]);
$tooltip = addslashes($_POST[“tooltip”]);
if (isset(
$link)) {
db_connect();
$sql = “INSERT INTO `links`
(
link, description, tooltip, date)
values
(’$link’ , ‘$description’ , ‘$tooltip’, now());
if (@
mysql_query($sql))
echo
“link Added!<br />;
else {
echo
“Error!. mysql_error();
exit;
}
}
?>

تا حالا مرحله‌ی ۱ و ۲ رو انجام دادیم. اگه تعداد کلیک‌ روی هرکدوم از لینک‌ها برامون مهم نباشه می تونیم با یه حلقه‌ی ساده، آدرس لینک‌ها و توضیحاتشون رو از دیتابیس بیرون بکشیم و فقط اونها رو نمایش بدیم. ولی هدف ما فقط این نیست!
برای داشتن آمار دفعات کلیک‌ها ما به یه صفحه واسطه احتیاج داریم که در واقع با کلیک شدن روی هر لینک، اون صفحه لینک رو دریافت کنه و به تعداد هیت‌های اون توی جدول ما یکی اضافه کنه و بعد به آدرس لینک اصلی Redirect کنه. کار سختی انجام نمی‌ده کلا!
اسم اون رو به عنوان مثال «link_redirect.php» می‌ذاریم و این زیر می بینیم چه کدهایی توش قرار میگیره.

<?
$url
= urldecode($_GET[“url”]);
db_connect();
$query=“SELECT * FROM `links`
WHERE link = ‘$url’”;
$results = mysql_query($query);
$result = mysql_fetch_array($results);
$hits = $result[“hits”];
$hits = $hits + 1 ;

$updatequery = “UPDATE `links` SET `hits`=’$hits’
WHERE
`link`=’$url’”;
$result = mysql_query($updatequery);

header(“Location:$url”);
?>

تو خط اول، URLمون که قبلا Encode شده (بعدا می‌گم چطوری)، Decode میشه. این عمل Encode و Decode کردن هم واسه اینکه که چون ما داریم یک URL رو به عنوان متغیر بین صفحاتمون پاس می‌کنیم و احتمال اینکه یک کاراکتر معنی دار توش باشه هست. با این Encode کردن مثلا اگه کاراکتر Space توی اسم یه فایل استفاده شده باشه به معادل Hexش یعنی %۲۰ تبدیل میشه و از این قبیل…!

http://www.mohsentaleb.com/index 1.htm
Changes to…

http://www.mohsentaleb.com/index%201.htm

همونطور که واضحه، در خطوط سوم تا هفتم، آخرین تعداد هیت‌های یک لینک رو از جدول می‌خونیم. در خط هشتم اونو یکی اضافه می کنیم، تو خط ۹ تا ۱۱ مقدار جدید هیت‌ها رو وارد جدول می‌کنیم و در آخر با فرستادن یک Header، صفحه رو به آدرس لینک اصلی Redirect می‌کنیم. خیلی ساده!
پس ما الان یه صفحه‌ی واسطه داریم که آدرس تمام لینک‌های لینکدونی‌مون تحت یک متغیر با اسم url$ باید بهش پاس بشه و خودش دیگه بقیه‌ی کارها رو انجام می‌ده…

مثلا اگه ما بخوایم به سایت یاهو لینک بدیم، بجای اینکه توی لینکدونیمون داشته باشیم

<a href=\"http://www.yahoo.com\">Yahoo.com</a>

داریم:

<a href=\"link_redirect.php?url= http://www.yahoo.com\">Yahoo.com</a>

خب، به عنوان مرحله‌ی آخر، باید کدی بنویسیم که بیاد هر کدوم از لینکهامون رو از دیتابیس بیرون بکشه و به صورت قالبی دربیاره که لینکها فقط به عنوان یه متغیر به اون صفحه‌ی «link_redirect.php» پاس بشن که تعداد کلیک‌هاشون هم شمارش بشه.
اینم کدش. یه تابع‌ست که در آرگومانش یعنی متغیر number$ می تونید تعداد لینکهای جدیدی رو که قراره در صفحه‌تون نمایش داده بشن مشخص کنید. یخورده اگه با دقت بخونیدش چیز سختی نداره! icon smile ساختن لینکدونی با تعداد دفعات کلیک
<?
function show_links($number) {
db_connect();
$query=“SELECT * FROM `links`
ORDER BY `id` DESC LIMIT ‘$number’”;
$results = mysql_query($query);
$num_results= mysql_num_rows($results);
echo
<div>;

for ($i=0; $i <$num_results; $i++)  {
$row = mysql_fetch_array($results);
if (
$row[“hits”] == ۰)
$hits = کلیک نشده;
else
$hits = $row[“hits”].” کلیک ”;

&  echo <a href=“http://”.$_SERVER[‘HTTP_HOST’]
.dirname($_SERVER[‘PHP_SELF’]).
“/linkref.php?url=”.
urlencode(stripslashes($row[“link”])).
” title=\\”
.stripslashes($row[“tooltip”]).
&#8226; ”.$hits.“\”>”.
stripslashes($row[“description”]).</a>;
echo
<br>n”;
}
echo
</div>;
}
?>

تموم شد!
پ.ن. برای اینکه کدها زیاد شلوغ نشن و برای تأکید بیشتر رو اصل کد، قسمتهای مربوط به فارسی کردن (Align و Font و …) رو حذف کردم که خودتون بهش اضافه می کنین احتمالا!

استفاده از mysql بخش پایانی

آذر ۱۲م, ۱۳۸۷

خب اکنون وقت آن رسیده که با یک برنامه عملی چیزهایی را که یاد گرفتیم به کار ببندیم تا مطالب بیشتر جا بیفتد.ما در اینجا یک برنامه خواهیم نوشت که مشخصات یک کاربر را گرفته و او را ثبت نام می کند و …

خب در مرحله اول من باید جدول خود را طراحی کنم.جدول من باید حاوی نام, نام خانوادگی,email, شغل و یک فیلد دیگر باشد که مشخص کند آیا کاربر مایل است اخبار جدید سایت برای او ارسال شود یا نه.اما آیا این ها کافی است؟من همیشه یک فیلد به نام ID به جدول خود اضافه می کنم.این فیلد که یک فیلد عددی است را معمولا به عنوان کلید اصلی جدول تعریف می کنم.در ادامه فواید این فیلد اضافه را خواهید دید.

خب من قبل از هر چیزی باید به پایگاه داده ام وصل شوم پس می نویسم:

<?php

$conn=mysql_connect(“localhost\”,\”root\”,\”pass\”) or

die(\”Could not connect;\”.mysql_error());

?>

اگر در این مرحله مشکلی پیش بیاید بوسیله تابع die() از اجرای باقی برنامه جلوگیری کرده و پیغام مقتضی را روی صفحه نمایش نشان می دهم نقش تابع mysql_error() این است که پیغام خطای mysql را روی صفحه نمایش دهد و من بوسیله عملگر . از این تایع برای کامل کردن پیغام خطای اتصال استفاده کرده ام.

اکنون من یک بانک اطلا عاتی می سازم تا درون آن جدول یا جداول مورد نیازم را ایجاد کنم.

<?php

$conn = mysql_pconnect(“localhost\”, \”root\”, \”pass\”)

or die(\”Could not connect: \” . mysql_error());

if (mysql_create_db(\”my_db\”)) {

print (\”Database created successfully\n\”);

} else {

printf (\”Error creating database: %s\n\”, mysql_error());

}

?>

*توجه کنید میزبان شما معمولا نرم افزاری مثل phpmyadmin را در اختیار شما میگذارد تا مدیریت خود را روی mysql اعمال کنید.

*فراموش نکنید من فقط یک بار از mysql_create_db() استفاده می کنم تا یک بانک اطلاعاتی بسازم و بعد از آن چون کارهایم را روی آن انجام می دهم دیگر احتیاجی به استفاده از این تابع نیست!

اکنون من بانک اطلاعاتی را که ساختم به عنوان بانک اطلاعاتی جاری مشخص می کنم تا باقی اعملا روی آن انجام شود.

<?php

$conn = mysql_pconnect(“localhost\”, \”root\”, \”pass\”)

or die(\”Could not connect: \” . mysql_error());

$db=mysql_select_db(\”my_db\”) or die(\”Could not select      database:\”.mysql_error());

?>

خب برنامه من اکنون آماده است تا فرامینی به زبان sql را بگیرد و برای پردازش به mysql بدهد.برای

ارسال فرامین به mysql برای پردازش از mysql_query() استفاده می شود به مثال توجه کنید.

<?php

$conn = mysql_pconnect(“localhost\”, \”root\”, \”triadpass\”)

or die(\”Could not connect: \” . mysql_error());

$db=mysql_select_db(\”my_db\”) or die(\”Could not select database:\”.mysql_error());

$query=’CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT ,’

. ‘ `name` VARCHAR( 15 ) NOT NULL ,’

. ‘ `family` VARCHAR( 20 ) NOT NULL ,’

. ‘ `email` VARCHAR( 20 ) NOT NULL ,’

. ‘ `job` VARCHAR( 20 ) ,’

. ‘ `newspost` TINYINT NOT NULL ,’

. ‘ PRIMARY KEY ( `id` ) );’

. ‘ ‘;

if(mysql_query($query)){

print \”Table successfuly created\”;}

else print \”Error in create table\”;

?>

من تا به حال یک بانک اطلاعاتی به همراه یک جدول درون آن را ساخته ام.توجه کنید شما ابزار های زیادی را در اینترنت می توانید پیدا کنید که این کار را بسیا ساده تر و مطمئن تر برای شما انجام دهند مثل phpmyadmin که خود بوسیله php نوشته شده و در آدرس www.phpmyadmin.net میتوانید آخرین نسخه آن را دانلود واستفاده کنید.در اکثر مواقع میزبان شما به عنوان یکی از خذماتش یک برنامه مدیریت بانک اطلاعاتی را برای شما تدارک دیده است.

از این به بعد بحث ما کمی کاربردی تر خواهد شد.

در اولین مرحله من می خواهم فرمی داشته باشم که کاربر مشخصات خود را درآن ثبت کند و پس از ارسال در جدول بانک اطلاعاتی من ذخیره شود.ابتدا فرم را طراحی می کنیم:

<html>

<form name=\”form1\” method=\”post\” action=\”<?=$_SERVER['PHP_SELF']?>\”>

<p>Name:

<input type=\”text\” name=\”name\”>

Family:

<input type=\”text\” name=\”family\”>

Email:

<input type=\”text\” name=\”email\”>

Job:

<input type=\”text\” name=\”job\”>

</p>

<p>Do you want to recived the site news via email? <font color=\”#006699\”>Yes</font>

<input type=\”checkbox\” name=\”newspost\” value=\”checkbox\”>

</p>

<p>

<center><input type=\”submit\” name=\”Submit\” value=\”Submit\”></center>

</p>

</form>

</html>

توجه کنید نام فیلد های شما بسیار مهم است زیرا این نام به عنوان متغییر به برنامه پردازش فرم ارسال می شود.اگر به خط دوم توجه کید به این عبارت بر خواهید خورد

این عبارت از یک ارایه به نام $_SERVER[] استفاده می کند.این آرایه شامل اطلاعاتی از قبیل هدرهاومسیرهاو….است که می توانید در مرجع کامل php موجود در php.net با عنوان

Predefined Variables این آرایه وبسیاری دیگر را پیدا کنید.به هر حال من از عنصر PHP_SELF در اینجا استفاده کردم که وظیفه آن باز گرداندن مسیرکد جاری است.

اکنون به کد کامل این فایل توجه کنید:

<?php

$name=$_POST['name'];

$family=$_POST['family'];

$email=$_POST['email'];

$job=$_POST['job'];

$newspost=$_POST['newspost'];

if(!empty($newspost)){

$newspost=1;

}

if(isset($name) && empty($name)==false && isset($family) && empty($family)==false&&

isset($email) && empty($email)==false && isset($job) && empty($job)==false){

$conn = mysql_pconnect(“localhost\”, \”root\”, \”triadpass\”)

or die(\”Could not connect: \” . mysql_error());

$db=mysql_select_db(\”my_db\”) or die(\”Could not select database:\”.mysql_error());

$query=\”INSERT INTO users VALUES(”,’$name’,'$family’,'$email’,'$job’,'$newspost’)\”;

$result=mysql_query($query) or die(\”Could not do query!\”);

}

else

print \”Complete <b>ALL</b>for adding your self\”;

?>

<html>

<form name=\”form1\” method=\”post\” action=\”<?=$_SERVER['PHP_SELF']?>\”>

<p>Name:

<input type=\”text\” name=\”name\”>

Family:

<input type=\”text\” name=\”family\”>

Email:

<input type=\”text\” name=\”email\”>

Job:

<input type=\”text\” name=\”job\”>

</p>

<p>Do you want to recived the site news via email? <font color=\”#006699\”>Yes</font>

<input type=\”checkbox\” name=\”newspost\” value=\”checkbox\”>

</p>

<p>

<center><input type=\”submit\” name=\”Submit\” value=\”Submit\”></center>

</p>

</form>

</html>

توجه کنید که من قبل از هر چیزی از $_POST[]برای قرار دادم متغییر های ارسال شده توسط فرم در متغییر های قابل استفاده در php است

(در حقیقت امذ متغییر های ارسال شده توسط فرم را درون یک آرایه می گذارد تا php از آن استفاده کند)در نسخه های قدیمی این امر اجباری نبود اما در نسخه های جدید این امر اجباری شده که بیشترین دلیل آن به خاطر مسائل امنیتی است.

*از نسخه۴٫۲٫۰ این امر اجباری شده است که به جای register_globald از آرایه های $HTTP_*_VARS[] استفاده شود.با این حال شما با دست کاری در فایل php.ini می توانید این موضوع را تغییر دهید که این کار بدلیل مسائل انیتی اکیدا توصیه نمی شود.مقاله ای در این زمینه را در آدرس /studyinscarlet.txtwww.securereality.com.au

مشاهده کنید.

اما در اینجا مسئله ای که پیش می آید این است که نوشتن $HTTP_POST_VARS[]کمی سخت است بنابراین برای این آرایه ها اسامی مستعاری در نظر گرفته شد مثل$_POST[] برای$HTTP_POST_VARS[] یا…

خب من در ادامه بوسیله توابع empty() و isset() از پر بودن و موجود بودن متغییرهایم اطمینان حاصل کرده ام.اما اگر توجه کرده باشید من به دو روش از تابع empty() استفاده کرده ام.

۱-empty($varname) == false

2-!empty($varname)

هر دو این روش ها درست است و من فقط برای یاد دادن به شما از هر دوی آن ها استفاده کرده ام.

تابع empty() یک تابع Boolean است یعنی مقدار بازگشتی آن یا true است یا false

من در روش اول گفته ام مقدار بازگشتی تابع empty() برابر false باشد که به معنای خالی بودن فیلد است

روش دوم هم همین است تنها تفاوت آن این است که من از عملگر نفی (!) استفاده کرده ام.

تابع isset() هم چک می کند که آیا متغیری به این نام تعریف شده است یا نه.

پس از اینکه من از پر بودن فیلد ها و وجود متغییر ها اطمینان حاصل کردم چک می کنم که آیا کاربر می خواهم اخبار سایت برای او ارسال شود یا نه.من برای نه مقدار ۰ و برای بله مقدار ۱ را در نظر گرفته ام که در ادامه با نحوی استفاده از آن ها آشنا خواهیم شد.

حالا که من از مرحله تست کردن متغییر ها بدون خطا گذشته ام وارد مرحله کار با بانک اطلا عاتی میشوم .

من یک اتصال برقرار کرده ام.بانک اطلا عاتی خود را انتخاب کرده ام و دستورات sql را که می خواهم اجرا شود در متغییری به نام $queryریخته ام.سپس بوسیله تابع mysql_query() آن ها را به mysql داده ام تا اجرا کند.

شما اکنون می توانید از یک فرم برای ذخیره اطلاعات استفاده کنید.من توابع مزتبط با این درس را برای شما مینویسم.اما بدون تمرین و به مشکل برخورد کردن چیزی یاد نخواهید گرفت.در صورتی که سوال یا مشکلی داشتید بوسیله houtanal at NOSPAM yahoo dot com آن را مطرح کنید.

در درس آینده بازیابی اطلاعات از چدرل و نمایش آنها به همراه جستجو در رکورد ها را به شما یاد خواهم داد.

تابع mysql_create_db()

این تابع یک بانک اطلاعاتی در پایگاه داده شما ایجاد می کند

mysql_create_db()
Create a MySQL database (PHP 3, PHP 4 )
bool mysql_create_db ( string database_name [, resource link_identifier ] )
Example:
<?php
$link
= mysql_pconnect(“localhost\”, \”mysql_user\”, \”mysql_password\”)
or die(\”Could not connect: \” . mysql_error());
if (mysql_create_db(\”my_db\”)) {
print (\”Database created successfully\n\”);
} else {
printf (\”Error creating database: %s\n\”, mysql_error());
}
?>

تابع isset()

این تابع از تعریف شدن و وجود متغییر اطمینان حاصل می کند.

isset()
Determine whether a variable is set (PHP 3, PHP 4 )
bool isset ( mixed var [, mixed var [, ...]] )
example:
<?php
$var
= ;
// This will evaluate to &true; so the text will be printed.
if (isset($var)) {
print
“This var is set set so I will print.\”;
}
// In the next examples we’ll use var_dump to output
// the return value of isset().
$a = \”test\”;
$b = \”anothertest\”;
var_dump( isset($a) );      // TRUE
var_dump( isset ($a, $b) ); // TRUE
unset ($a);
var_dump( isset ($a) );     // FALSE
var_dump( isset ($a, $b) ); // FALSE
$foo = NULL;
var_dump( isset ($foo) );   // FALSE
?>

تابع empty()

بررسی می کند آیا مقدار متغیر خالی است یا نه در صورت پر بودن مقدار true و در غیر این صورت false را بر می گرداند

empty()
Determine whether a variable is empty (PHP 3, PHP 4 )
bool empty ( mixed var )

example:
<?php
$var
= 0;
// Evaluates to true because $var is empty
if (empty($var)) {
echo
‘$var is either 0, empty, or not set at all’;
}
// Evaluates as true because $var is set
if (isset($var)) {
echo
‘$var is set even though it is empty’;
}
?>

توابع مرتبط بیشتر برای مطالعه:

Mysql_drop_db(),mysql_change_user(),mysql_db_name(),mysql_db_query()
unset(),define(),array_key_exist(),count(),strlen()

استفاده از mysql بخش نخست

آذر ۱۲م, ۱۳۸۷

نوشته های زیر ترجمه آزادی از مرجع کامل php موجود در php.net/docs.php و همچنین برگزیده ای منابع زیر است

کتب:

۱٫ php & mysql web development(sams)******

بهترین کتابی که من در این زمینه دیده ام

۲٫ php Developers cookbook(sams)****

همان طور که از نامش پیداست برای برنامه نویسان نوشته شده است و در کل

کتاب بسیار جالبی است

۳٫ MySQL and PHP Database Applications(M&T Books)***

بیشتر به بحث در رابطه با بانک اطلاعاتی mysql به همراه php می پردازد. در نوع خود کتاب بسیار خوبی است

۴٫ MySQL&mSQL(O’reilly)***

این کتاب بیشتر به بحث در رابطه با ابنک های اطلاعاتی می پردازد تا php

این کتاب به طور موازی mysql و msql را و کاربرد های آنها را آموزش میدهد

۵٫ Oreilly-PHP Pocket Reference(**)

به نظر من کتاب بسیار خوبی برای شروع است اما برای ادامه نه!

۶٫ مرجع کامل php4 ترجمع گروه مهندسی ساحر****

من اکثر کتاب های ترجمه شده توسط این گروه را دارم در کل ترجمه این گروه روان و قابل فهم است اما در مورد کتاب اینکه کتاب بسیار کاملی است ولی من ترجیح میدهم بسیاری از مطالب را در کتاب دیگری بخوانم(به خصوص مبحث شی گرایی را)

سایت ها:

php.net******(Complete Reference)

(Project Center)******Sourceforge.net

(Main php Spenser)******www.zend.com

(It is little yet but it is wonderful)****iranphp.net

(Quick php Guide)***www.netkadeh.com

(Scripts Reference)*****www.hotscripts.com

* = کیفیت از نظر شخصی من

در این سلسله مقالات طریقه کار با بانک اطلاعاتی mysql را phpبحث می کنم فرض من براین است که شما اصول بانک های اطلاعاتی ودستور زبان SQL وهمچنین برنامه نویسی با php را بلدید.یکی از خصوصیات ممتاز php را میتوان توانایی کار با اکثر بانک های اطلاعاتی مثل sql server ویا mysql وبسیاری از دیتابیس های دیگر ذکر کرد.php برای بانک اطلاعاتی mysql توابع خاصی را درنظر گرفته است که در اینجا به معرفی متداول ترین و کاربردی ترین آنها با ذکر مثال وکد نمونه می پردازم برای شرع تعدادی از توابع را معرفی وپس ازاتمام معرفی توابع در ادامه تکنیک های خاص استفاده از آنها را ذکر خواهم کرد.در طول معرفی توابع از تعدادی مثال استفاده خواهد شد اما برای اینکه واقعا چیزی یاد بگیرید تنها باید از فکر خودتان استفاده کنید و بنا به کاربرد هایی که برای توابع ذکر میشود برنامه هایی را نوشته واجرا کنید.

حتما توجه کنید که این لیست فقط مانند یک فهرست عمل می کند و برای آگاهی بیشتر از توابع ذکر شده باید به مستندات php مراجعه کنید . البته در ادامه پرکاربرد ترین و عمومی ترین آن ها را توضیح خواهم داد.این مطالب را می توانید در مستندات php به زبان اصلی بخوانید هدف از این مطالب آشنایی شما با برخی توابع کاربردی است که در قسمت های آتی تکنیک های استفاده از آن ها را به شما یاد خواهم داد و در انتها با هم یک پروژه را انجام میدهیم.برخی از مطالب و توابعی را هم که در اینجا ذکر نکرده ام را (مثل حلقه foreach) در ادامه و در طی کار به شما خواهم گفت.

توابع مورد کاربرد در php نسخه چهار و سی وسه()

[break]

Php 4.3.3 functions for working with mysql

*=توابعی که در این بخش راجع به آن ها صحبت خواهم کرد

**=قسمت هایی که در صورت ترجمه به اصل مطلب صدمه می خورد

*mysql_affected_rows – تعداد رکورد های تحت تاثیر قرار گرفته در آخرین پرس و جوی انجام داده را می گیرد

mysql_change_user – کاربر فعال را در ارتباط جاری با بانک اطلاعاتی را عوض میکند عوض می کند

mysql_client_encoding –  تنظیمات کاراکتری پیش فرض را از ارتباط جاری را باز میگرداند

*mysql_close – ارتباع جاری با پایگاه داده  را قطع میکند

*mysql_connect – یک ارتباط جدید با پایگاه داده برقرار می کند

mysql_create_db – یک بانک اطلاعاتی میسازد

mysql_data_seek – نشانگر (پیوینتر) داخلی مجموعه جواب را حرکت می دهد

mysql_db_name – اطلاعات جواب پرس و جو را می گیرد

mysql_db_query – پرس و جو را ارسال می کند

mysql_drop_db – بانک اطلاعاتی را حذف میکند

mysql_errno – شماره خطای ایجاد شده در آخرین عملیات را باز می گرداند

mysql_error – متن خطای ایجاد شده در آخرین عملیات را باز میگرداند

mysql_escape_string –یک رشته را برای کار با بانک اطلاعاتی تطبیق می کند

*mysql_fetch_array – یک مجموعه جواب بازگشتی را در آرایه ای انجمنی یا اندیسی یا هر دو می ریزد

*mysql_fetch_assoc – یک مجموعه جواب بازگشتی را در آرایه ای انجمنی می ریزد

mysql_fetch_field – اطلاعات یک ستون را از یک مجموعه جواب میگیرد و یک شی را باز میگرداند

mysql_fetch_lengths – طول هر کدام از جواب های خروجی را باز می گرداند

*mysql_fetch_object – یک مجموعه جواب را در یک شی می ریزد

*mysql_fetch_row – یک مجموعه جواب را به صورت یک آرایه شمارشی در می آورد

mysql_field_flags – نمایه فیلد معرفی شده در مجموعه جواب را باز می گرداند

mysql_field_len – طول فیلد مشخص شده را باز میگرداند

mysql_field_name – نام فیلد مشخص شده در مجموعه جواب را باز می گرداند

mysql_field_seek – نشانه گر جواب را در فیلد مبدا مشخص شده قرار می دهد

mysql_field_table – نام جدولی را که فیلد در آن قرار دارد را باز می گرداند

mysql_field_type – نوع فیلد موجود در مجموعه جواب را باز می گرداند

mysql_free_result – حافظه را از مجموعه جواب خالی می کند

mysql_get_client_info – اطلاعات خدمات گیرنده پایگاه داده را بدست می آورد

mysql_get_host_info – اطلاعات میزبان  پایگاه داده را بدست می آورد

mysql_get_proto_info – پروتکل(قوانین) مورد استفاده در پایگاه داده را میگیرد  نسخه

mysql_get_server_info – اطلاعات خدمات دهنده  پایگاه داده را بدست می آورد

mysql_info – اطلاعاتی در مورد جدیدترین پرسش و پاسخ را باز می گرداند

*mysql_insert_id – شناسه آخرین فیلد اضافه شده را باز می گرداند

*mysql_list_dbs – بانک های اطلاعاتی موجود را نشان می دهد

*mysql_list_fields – ستون های جدول را نشان می دهد

mysql_list_processes – پردازش های انجام شده را نشان می دهد

*mysql_list_tables – لیست جدول های یک بانک اطلاعاتی را نشان می دهد

*mysql_num_fields – تعداد فیلد های یک مجموعه جواب را باز می گرداند

*mysql_num_rows – تعداد سطرهای یک مجموعه جواب را باز می گرداند

*mysql_pconnect – یک اتصال دائمی با پایگاه داده بر قرار می کند

*mysql_ping – یک ارتباط را پینگ می کند و در صورت برقرار نبودن ارتباط آنرا برقرار میسازد

*mysql_query – یک پرس و جو را ارسال میکند

mysql_real_escape_string کاراکتر های ویژه را در یک رشته برای استفاده از پایگاه داده بهینه میکند و در این عمل از تنظیمات کاراکتری موجود در پایگاه داده استفاده می کند.

*mysql_result – اطلاعات مجموعه جواب را باز میگرداند

*mysql_select_db – یک بانک اطلاعاتی را نتخاب می کند

mysql_stat – وضعیت سیستم جاری را باز می گرداند

mysql_tablename – نام جدول فیلد را باز میگرداند

**mysql_thread_id –جاری را باز می گرداند thread شناسه

mysql_unbuffered_query – یک پرس و جو را بدون واسطه به پایگاه داده ارسال می کند

در نسخه پنجم php که هنوز در مرحله بتا است توابع بسیار قدرتمند دیگری نیز اضافه شده است که معمولا به صورت Mysqli_* می باشند.در کل php 5 خیلی به سمت شی گرایی رفته است بنابراین توابع مورد استفاده در آن نیز تا حد امکان سعی در اضافه نمودن هرچه بیشتر امکانات شی گرایی دارند.پس از پایان این دروس توایع نسخه پنجم را نیز بررسی خواهیم کرد که البته بعلت تغییرات ناچیز یاد گیری و استفاده از آنها چندان مشکل نخواهد بود.

توجه کنید لازم نیست شما تک تک این توابع را حفظ کنید بلکه با دانلود کردن مرجع کامل php از سایت php.net می توانید هر زمان که لازم داشتید توضیحات مربوط به آن را بخوانید من توصیه می کنم که فایل chm را دانلود کنید زیرا استفاده از آن سریع تر و راحت تر است

در اینجا کاربردی ترین توابع را در نسخه جاری php(4.3.3) بحث می کنم

* تابع mysql_ping توجه کنید این تابع تنها کاری که می کند بررسی اتصال به موتور mysql است و معمولا در اسکریپت های تست که برای تست کردن آمادگی سرور بکار می رود استفاده می شود.این تابع یک اتصال به mysql را ping می کند و در صورت موفقیت و بازگشت جواب true و در غیر اینصورتfalse را باز می گرداند.در صورت قطع بودن ارتباط سعی میکند آنرا بر قرار سازد.

mysql_ping()
Ping a server connection or reconnect if there is no connection (PHP 4 >= 4.3.0)
bool mysql_ping ( [resource link_identifier ] )
Example:
<?php
$conn
=mysql_connect($db_host, $db_user, $db_password);
$db=mysql_select_db($db_name);
if(
mysql_ping($conn)){
echo
“your database is online\”,
} else {
echo \”your database is offline\”,
}
mysql_close($conn);
?>

[break]

* تابع mysql_connect که وظیفه برقراری ارتباط با بانک اطلاعاتی را برعهده دارد و معمولا اولین خط اسکریپت کار با mysql را تشکیل میدهد زیرا تا زمانی که این تابع مقدار true را بازنگرداند شما اصلا به موتور mysql متصل نیستید تا بتوانبد کاری را انجام دهید!توجه کنید پس از پایان اسکریپت یا فراخوانی تابع mysql_close این اتصال قطع خواهد شد.

mysql_connect()
Open a connection to a MySQL Server (PHP 3, PHP 4 )
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags ]]]]] )
Example:
<?php
$conn
= mysql_connect(“localhost\”,\”mysql username\”,\”mysql _password\”) or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\”your database name\”,$conn) or die(Could not select database:.mysql_error());
$query = mysql_query (\”select  * from tablename\”);
mysql_close ($conn);
?>

* تابع mysql_pconnect که وظیفه برقراری ارتباط دائمی با بانک اطلاعاتی را داراست و بعد از پایان اسکریپت و یا فراخوانی تابعmysql_close ارتباط قطع نمی شود.کاربرد این تابع در مواقعی است که شما می خواهید در زمان صرفه جویی کنید زیرا این تابع باعث می شود در فراخوانی های متعدد از همین ارتباط برای تبادل داده استفاده شود و ارتباط جدیدی بر قرار نگردد. معمولا این تابع زمانی استفاده می شد که چندین صفحه اتصال هایی با آرگومان ها ی مشابه را نیاز داشته باشند.

توجه کنید برای استفاده ازاین تابع شما حتما باید phpرا به عنوان ماژول نصب کنید نه CGI این یکی از راه های سریع کردن و بهینه کردن کد است اما توجه کنید که این امر می تواند باعث مشکل نیز بشود زیرا سبب ایجاد اتصالات بیهوده و بیکار که اصطلاحا آنها را idle می نامند می گردد توجه کنید این اتصالات به هر حال منابع سرور شما را مصرف خواهند کرد بنابراین کاربرد غلط آن می تواند موجب مشکلاتی شود.

mysql_pconnect()
Open a persistent connection to a MySQL server (PHP 3, PHP 4 )
resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]] )
Example:
<?php
$conn
=mysql_pconnect(“localhost\”,\”mysql_username\”,\”mysql_password\”) or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db (\”your database name\”,$conn) or die(Could not select database:.mysql_error());
$Query = mysql_query (\”select  * from tablename\”);
mysql_close ($conn);
?>
P = persistent = دائمی

* تابع mysql_close که باعث بسته شدن اتصال غیر دائمی به پایگاه داده می شود.

mysql_close()
Close MySQL connection (PHP 3, PHP 4 )
bool mysql_close ( [resource link_identifier ] )
Example:
<?php
$conn
= mysql_connect (“localhost\”,\”mysql username\”,\”mysql_ password\”) or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db (\”your database name\”,$conn) or die(Could not select database:.mysql_error());
$Query = mysql_query(\”select  * from tablename\”);
mysql_close ($conn);
?>

* تابع mysql_select_db که بوسیله این تابع از اتصال جاری یک پایگاه داده را انتخاب می کنیم تا دستورات بعدی ما رو آن پایگاه داده اعمال شود.

mysql_select_db()
Select a MySQL database (PHP 3, PHP 4 )
bool mysql_select_db ( string database_name [, resource link_identifier ] )
Example:
<?php
$conn
= mysql_connect(“localhost\”,\” mysql_user \”,\”mysql_ password\”) or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\”your database name\”,$conn) or die(Could not select database:.mysql_error());
$query = (\”select  * from tablename\”);
$result = mysql_query ($query);
mysql_close ($conn);
?>

تابع mysql_query که جزو مهترین توابع است زیرا این تابع دستورات sql شما را اجرا می کند این تابع معمولا با توابعmysql_fetch_* به همراه حلقه ها کار اصلی را در رابطه با پایگاه داده انجام میدهند

mysql_query()
Send a MySQL query (PHP 3, PHP 4 )
resource mysql_query ( string query [, resource link_identifier] )
Example:
<?php
$conn
= mysql_connect("localhost\",\" mysql_user \",\"mysql_ password\") or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\"your database name\",$conn) or die(Could not select database:.mysql_error());
$query = (\"insert into tablename values(1,2)\");
$result = mysql_query($query);
mysql_close($conn);
?>

· تابع mysql_result که برای یک رکورد از پردازش انجام شده توسط mysql_query() کاربرد دارد همان طور که قبلا گفتم برای خواندن تمامی رکورد ها باید از توابع mysql_fetch_* به همراه حلقه ها استفاده کرد.آرگومان اول مجموعه جواب اجرا شده بوسیله تابع mysql_query وآرکومان دوم شماره رکوردی که می خواهید بخوانید و آرگومان سوم فیلدی است که میخواهید بخوانید که در شورت معرفی نکردن آرگومان سوم اولین فیلد خوانده خواهد شد.

mysql_result()
Get result data (PHP 3, PHP 4 )
mixed mysql_result ( resource result, int row [, mixed field ] )
Example:
<?php
$conn
=mysql_connect(“localhost\”,\” mysql_user \”,\” mysql_password \”);
$db=mysql_select_db(\”test\”);
$query=\”select * from test\”;
$result=mysql_query($query);
if($result)   /*for testing result answer*/{
$record1=mysql_result($result,0,’name’);
echo \”Rcord 1 is:\”,$record1;
echo \”<p>\”;
$record2=mysql_result($result,1,’name’);
echo \”Rcord 2 is:\”,$record2;
}
?>

تابع mysql_affected_rows که تعداد سطرهایی را که توسط آخرین دستور delete یاreplace, یا insert یا ,update تحت تاثیر قرار گرفته اند را باز می گرداند

mysql_affected_rows()
Get number of affected rows in previous MySQL operation (PHP 3, PHP 4 )
int mysql_affected_rows ( [resource link_identifier ] )
Example:
<?php
/* connect to database */
mysql_pconnect(“localhost\”, \”mysql_user\”, \”mysql_password\”) or
die(\”Could not connect: \” . mysql_error());
mysql_select_db(\”mydb\”);
/* this should return the correct numbers of deleted records */
mysql_query(\”DELETE FROM mytable WHERE id < 10\”);
printf (\”Records deleted: %d\n\”, mysql_affected_rows());
/* without a where clause in a delete statement, it should return 0 */
mysql_query(\”DELETE FROM mytable\”);
printf (\”Records deleted: %d\n\”, mysql_affected_rows());
?>

تابع mysql_num_rows این تابع عملکردی مشابه تابع mysql_affected_rows دارد با این تفاوت که این تابع تعداد رکورد های مجمومه جواب بازگردانده شده از یک جستجوی select را بدست می آورد.از این تابع می توان برای بدست آوردن رکورهای یک جدول استفاده کرد.

mysql_num_rows()
Get number of rows in result (PHP 3, PHP 4 )
int mysql_num_rows ( resource result )
Example:
<?php
$conn
= mysql_connect(“localhost\”, \”mysql_user\”, \”mysql_password\”);
mysql_select_db(\”database\”, $conn);
$result = mysql_query(\”SELECT * FROM table\”, $link);
$num_rows = mysql_num_rows($result);
echo \”$num_rows Rows\n\”;
?>

تابع mysql_free_result که وظیفه آزاد سازی حافظه مصرف شده بوسیله نتایج بدست آمده از query را داراست.این تابع در اسکریپت های طولانی که اعمال زیادی را انجام می دهند و حافظه زیادی را مصرف می کنند کاربرد دارد. ولی در اسکریپت های عادی به آن نیازی نیست زیرا درphp پس از پایان اسکریپت به طور خورکار حافظه اختصاص داده شده به query آزاد می شود.

mysql_free_result()
Free result memory (PHP 3, PHP 4 )
bool mysql_free_result ( resource result )
Example:
<?php
$conn
= mysql_connect(“localhost\”,\”mysql username\”,\”mysql _password\”) or die(Could not connect to database deamon:.mysql_error());
$db = mysql_select_db(\”your database name\”,$conn) or die(Could not select database:.mysql_error());
$query = mysql_query (\”select  * from tablename\”);
mysql_free_result ($query);
mysql_close ($conn);
?>

تابعmysql_fetch_array . همان طور قبلا بارها گفتم برای خواندن تمامی سطرهای یک جدول از توابع mysq_fetch_* به همراه حلقه ها استفاده میشود این توابع وظیفه دارند حاصل یک query را در یک آرایه یا مجموعه از اشیا بریزند تا بتوان به کمک حلقه ها تک تک آن ها را خواند.تابع mysql_fetch_array مجموعه جواب یک query را در یک آرایه می ریزد که بوسیله آرگومان دوم می توان طریقه ذخیره و دسترسی رادر آرایه(نوع آرایه) معیین کرد.

در اینجا لغات کلیدی را که در مثال های آتی استفاده می کنم را توضیح میدهم انها به عنوان ثابت در php تعریف شده اند .

ثابت

توضیحات

MYSQL_ASSOC

Columns are returned into the array having the fieldname as the array index.

بوسیله این ثابت می تونید از نام فیلدهای خود برای دسترسی به اطلاعات آن ها استفاده کنید

MYSQL_NUM

Columns are returned into the array having a numerical index to the fields. This index starts with 0, the first field in the result.

بوسیله این ثابت می توانید از شماره اندیس آرایه برای دسترسی به اطلاعات فیلد ها استفاده کنید

MYSQL_BOTH

Columns are returned into the array having both a numerical index and the fieldname as the array index.

بوسیله این ثابت می توانید از نام فیلد با اندیس آن در آرایه برای دسترسی به اطلاعات آن استفاده کنید

mysql_fetch_array()
Fetch a result row as an associative array, a numeric array, or both. (PHP 3, PHP 4 )
array mysql_fetch_array ( resource result [, int result_type ] )
1)Example for MYSQL_NUM:
<?php
mysql_connect
(“localhost\”, \”mysql_user\”, \”mysql_password\”) or
die(\”Could not connect: \” . mysql_error());
mysql_select_db(\”mydb\”);
$result = mysql_query(\”SELECT id, name FROM mytable\”);
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf (\”ID: %s  Name: %s\”, $row[0], $row[1]);
}
mysql_free_result($result); ?>

2)Example for MYSQL_ASSOC:
<?php
mysql_connect(\”localhost\”, \”mysql_user\”, \”mysql_password\”) or
die(\”Could not connect: \” . mysql_error());
mysql_select_db(\”mydb\”);
$result = mysql_query(\”SELECT id, name FROM mytable\”);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf (\”ID: %s  Name: %s\”, $row[\"id\"], $row[\"name\"]);
}
mysql_free_result($result);
?>
3)Example for MYSQL_BOTH:
<?php
mysql_connect(\”localhost\”, \”mysql_user\”, \”mysql_password\”) or
die(\”Could not connect: \” . mysql_error());
mysql_select_db(\”mydb\”);
$result = mysql_query(\”SELECT id, name FROM mytable\”);
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf (\”ID: %s  Name: %s\”, $row[0], $row[\"name\"]);
}   mysql_free_result($result);
?>

توجه کنید که در صورت معرفی نکردن ثابت به طور پیش فرض از MYSQL_NUM استفاده میشود.

در ادامه تنها دو تابع از سری توابع mysql_fetch_* را معرفی میکنم زیرا تابع mysql_fetch_array تقریبا تمام نیاز های شما را بر طرف می کند اما در قسمت مباحث پیشرفته توابع mysql_fetch_field و mysql_fetch_lengths را نیزمعرفی خواهم کرد. توجه کنید شما هم اکنون هم میتوانید بدون مشکل یک برنامه کامل با php & mysql بنویسید .

· تابع mysql_fetch_row که عملکردی کاملا مشابه mysql_fetch_array به همراه ثابت MYSQL_NUM دارد.

· تابع mysql_fetch_assoc که عملکردی کاملا مشابه mysql_fetch_array به همراه ثابت MYSQL_ASSOC دارد.

· تابع mysql_fetch_object

این تابع رکورد های بازگردانده شده بوسیله یک دستور select را به صورت مجموعه ای از اشیا باز می گرداند که در پایان پس از اتمام رکورد ها بوسیله بازگرداندن false اتمام رکورد ها را اعلام می کند.در صورتی که به برنامه نویسی شی گرا علاقه دارید این تابع را دوست خواهید داشت.

mysql_fetch_object()
Fetch a result row as an object (PHP 3, PHP 4 )
object mysql_fetch_object ( resource result )
<?php
mysql_connect
(“hostname\”, \”user\”, \”password\”);
mysql_select_db(\”mydb\”);
$result = mysql_query(\”select * from mytable\”);
while ($row = mysql_fetch_object($result)) {
echo $row->user_id;
echo $row->fullname;
}
?>

و آخرین تابع که یک تابع کاربردی است به نام mysql_insert_id
این تایع باعث بازگشت ID آخرین فیلد ایجاد شده بوسیله دستور insert می گردد.
*در جدول هایی که به طور ذاتی نمی توان برا ی آنها یک کلید اصلی (Primary key) تعریف کرد معمول است که یک فیلد به نام ID که دارای خاصیت AUTO_INCREMENT است تعریف می کنند که یک فیلد عددی است و برای فهمیدن تعداد رکور های جدول نیز کاربرد دارد.

mysql_insert_id()
Get the ID generated from the previous INSERT operation (PHP 3, PHP 4 )
int mysql_insert_id ( [resource link_identifier ] )
Example:
<?php
mysql_connect
(“localhost\”, \”mysql_user\”, \”mysql_password\”) or
die(\”Could not connect: \” . mysql_error());
mysql_select_db(\”mydb\”);
mysql_query(\”INSERT INTO mytable (name) values (\”houtan’)\”);
printf (\”Last inserted record has id %d\n\”, mysql_insert_id());
?>

خب توابعی که فکر می کردم برای شروع کار با mysql لازم میشود را گفتم اما همان طور که قبلا گفتم توابع زیادی در php برای کار با mysql تعبیه شده است در قسمت مباحث پیشرفته توابعی را به شما خواهم گفت که توانایی های جالب و بعضا قدرتمندی دارند اما شما هم اکنون هم می توانید یک برنامه کامل و حرفه ای را با استفاده از این توابع بنویسید که در ادامه یک برنامه برای تمرین با هم خواهیم نوشت اما به یاد داشته باشید تا زمانی که خودتان برنامه ننویسی و به مشکل برنخورید چیز زیادی در عمل یاد نخواهید گرفت در ضمن آخرین نکته اینکه اگر دارید تمرین میکنید و هیچ مشکلی در برنامه هایی که میخواهید بنویسی ندارید و می بینید همه چیز را بلدید فکر کنم باید در نحوه تمرین کردن خود تجدید نظر کنید.

شروعی ساده با MySQL پایگاه داده

آذر ۱۲م, ۱۳۸۷

در این مقاله سعی شده است که اصول و مبانی کار با MySQL به صورتی ساده و قابل
فهم برای کسانی که تازه شروع به کار با پایگاه‌های داده را کرده‌اند، گفته شود.

PHP به صورت از پیش تعریف شده، اکثر پایگاه‌های داده را پشتیبانی می‌کند‌: dBase,
FilePro, mSQL, MySQL,Oracle, PostgreSQL,Sybase.اگر شما بخواهید از پایگاه‌ های
داده‌ای که
به صورت از پیش تعریف شده پشتیبانی نمی شوند، استفاده کنید (مانند Access و یا
SQL Server) باید از توابع PHP ODBC (Open DataBase Connectivity) به همراه راه‌اندازهای
پایگاه داده (ODBC Drivers) استفاده کنید.
MySQL یکی از انواع سرویس دهنده‌های پایگاه داده است که با وجود اینکه نسبت به
سایر‌DBMS های موجود زیاد قدرتمند نمیباشد، اما به علت قیمت و عملکرد مناسب آن،
مورد استفاده گسترده قرار می‌گیرد.

طریقه اتصال به MySQL

قبل از شروع هر کاری باید به ‌MySQL متصل شویم. برای این کار از دستور


<?
$Conn
=mysql_connect($Location,$Username,$Password); ?>

استفاده می‌کنیم. تابع mysql_connect دارای سه آرگومان می‌باشد. آرگومان اول ،
میزبان (Host) را مشخص می‌کند. دو آرگومان بعدی، نام کاربری و کد رمز را برای اتصال
به پایگاه داده، ارسال می‌کنند. در صورتی که اتصال با شکست مواجه شود، پیغام خطایی
درbrowser نشان داده می‌شود.
با استفاده از دستور


<? mysql_select_db($database)?>

بانک اطلاعاتی مورد نظر انتخاب خواهد شد و از این پس کارهای شما همه بر روی این
بانک انجام خواهد گرفت. در صورتی که بانک مورد نظر پیدا نشد، پیغام خطایی نشان
داده می‌شود.

ایجاد یک بانک اطلاعاتی در MySQL


<? if (mysql_creat_db($database,$Conn)
{ print(
“The database,$database,was { successfully created!<BR>n”);
else
{ print(
" The database,$database, could not be created! <BR>\n”);}

?>

پس از اتصال به MySQL شما می‌توانید با استفاده از دستور


<? mysql_creat_db($database,$Conn); ?>

یک بانک اطلاعاتی جدید ایجاد کنید. این دستور شامل دو آرگومان : نام بانک اطلاعاتی
و نام لینک مورد نظربه پایگاه داده می‌‌باشد. در صورتی که عمل ایجاد با موفقیت
انجام شده باشد، پیغامی مبنی بر این موضوع نمایش داده می‌شود و در غیر اینصورت،
به کاربر اعلام می‌شود که عملیات نتیجه نداشته است.

انجام کارهای مختلف بر روی بانک اطلاعاتی در MySQL

برای انجام کارهای مختلف بر روی بانک اطلاعاتی ازدستورات SQL استفاده می‌کنیم.
روند استخراج اطلاعات از یک پایگاه داده به این صورت است که ابتدا یک query به
زبان SQL نوشته می‌شود وسپس این query با استفاده ازدستور


mysql_db_query($database,$Query);

عملیات لازم را بر روی بانک اطلاعاتی انتخاب شده، انجام می‌دهد.
فرم کلی به صورت زیر است:


<?$Query=”text for the query goes here in SQL format";
if (mysql_db_query($database,$Query))
}
print( “The query was successfully executed!<BR>\n”);
{
else
}
print(“The query could not be executed!<BR>\n”);
{ ?>


· ایجاد یک جدول

برای ایجاد یک جدول ، این query را می نویسیم:


<?
$Query
=”CREATE table $Tablename(id INT PRIMARY KEY ,
Firstname char(12), Lastname char(15));
?>

با استفاده ازاین query، جدول جدیدی ایجاد می‌شود که شامل یک فیلد به نام id (
که Primary keyاست) و فیلدی به نام Firstname از نوع کاراکتری با طول ۱۲ و همچنین
فیلدی به نام Lastname با طول ۱۵ می باشد.

· ارسال داده‌ها به بانک اطلاعاتی

برای ارسال داده‌ها به بانک اطلاعاتی این q uery را می‌ نویسیم:

<?$Query=“INSERT into $Tablename(‘value1’, ‘value2’, ‘value3’,);?>

توجه داشته باشید که تعداد مقادیری که در این q uery مشخص
می‌شوند، باید با تعداد ستونهای جدول و همچنین نوع آن برابر باشد. در غیراینصورت
query کارنمی‌کند.

· بازیابی اطلاعات و نمایش آن

به قطعه کد زیر توجه کنید:


<?
$query
= "SELECT * FROM $Tablename“;
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
while($row = mysql_fetch_array($result))
{
echo \"You have $numrows user(s) in the database”;
echo \"ID number : $row[id]”;
echo \"firstname: $row[firstname]”;
echo \"Lastname: $row[lastname]”;
}
?>


در خط اول، queryای نوشته شده است که تمام رکوردهای موجود درTable را انتخاب می‌کند
و سپس در خط دوم، این query برروی بانک اطلاعاتی اجرا می‌شود و در خط سوم تعداد
رکوردهای موجود درTable ، در متغییر numrows ذخیره می‌گردد و سپس با استفاده از
حلقهً while ( که تعداد loop آن به اندازه رکوردهای Table است) رکوردها، خوانده
شده و نمایش داده می‌شود.

· تغییر اطلاعات موجود در بانک اطلاعاتی
برای این کار کافی است که از queryای استفاده کنیم که در آن دستورUPDATE به کار
برده شده باشد.بطور مثال:


<?$Query=“UPDATE $Tablename SET firstname=’mina’ WHERE
firstname
=’maryam’”; ?>

این query ، اسامی موجود درTable مورد نظر را در صورتی که برابر با mina باشد،
به maryam تغییر می‌دهد.

نکته:
· بعد از اتمام کار، به وسیله دستور


<?mysql_close($Conn);?>

اتصال بهMySQL را قطع کنید. این دستور شامل یک
آرگومان است، که همان متغیراشاره گر،به MySQL می‌باشد.

· بیشترین اشتباهات و خطاهای به وجود آمده، مربوط به نحوه
نوشتن queryها می‌ باشد. چنانچه در دستورات PHP ‌، هیچ
نوع اشکال منطقی‌ای مشاهده نکردید، q uery مورد نظر را
بررسی کنید. به احتمال زیاد مشکل حل خواهد شد.

· شما می‌ توانید به جای دستور


<?mysql_db_query( );

از دستور


<?mysql_query( );?>

استفاده کنید. البته هر کدام از این دستورات، کاربردهای خاص خود را دارند که توصیه
می‌شود برای آگاهی،h elp مربوطه را در PHP ، مطالعه بفرمایید.

· توجه داشته باشید که باز و بسته شدن‌های متعدد Database موجب به وجود آمدن
حفره‌هایی می‌شود که امنیت اطلاعات را به خطر می‌اندازد ( برای آگاهی بیشتر، می‌توانید
از منابعی در مورد Security، استفاده کنید.) لذا توصیه می‌شود با دسته‌بندی مناسب
عملیات مورد نیاز روی D atabase،تعداد دفعات باز و بسته شدن D atabase را به حداقل
برسانید.

· یک نکته ساده و در عین حال جالب(مخصوص مبتدی‌‌‌ها):

یک Database و یا یک Table را نمی‌شود بیش از یک باربه وجود آورد.!! بنابراین
در صورتی که هنگام به وجود آوردن Database و یا Tableای ، مدام با Error برخورد
می‌کنید و هیچ نوع توجیه‌ای برای آن نمی‌یابید، پیشنهاد می‌شود که با بررسی Mysql_Front
از وجود نداشتن Database و یا Tableمورد نظر مطمئن شوید.

UPLOAD کردن MySQL

آذر ۱۲م, ۱۳۸۷

با توجه به اینکه Upload کردن اطلاعات در MySQL یکى از مواردى بود که در انجمن
زیاد سؤال پرسیده مىشد من روشى که خودم براى Upload کردن اطلاعات استفاده مىکنم
را براى شما شرح مىدهم
ابتدا توسط mysqldump اطلاعات مربوطه را در یک فایل txt ذخیره سازى مىکنیم


Shell > mysqldump --opt DBname TBname > (c:\data.txt or /home/user/data.txt)

نکته:

۱ – براى ذخیره سازى تمامى table هاى یک DB باید اسم database مورد نظر را بدون
اسم table ها ذکر کنید
۲ – براى ذخیره سازى چندین database باید اسم DB ها را پشت سر هم ذکر کنید


Shell > mysqldump --opt --databases DB1 DB2 > (c:\data.txt or /home/user/data.txt)

3 – شما مىتوانید تمامىdatabase ها را بصورت ذیر ذخیره سازى کنید


Shell > mysqldump --opt --all-databases > (c:\data.txt or /home/user/data.txt)

حال اطلاعات مربوط به table مورد نظر را در یک فایل txt ذخیره سازى کرده‌ ایم
انرا بر روى host مورد نظر FTP مىکنیم
سپس با یک دستور ساده اطلاعات را وارد MySQL مىکنیم


Shell > mysql database < data.sql

نکته :

براى استفاده از username & password جهت استفاده از MySQL باید بصورت زیر
عمل کنید


Shell > Mysql –h host -u user -p database < backup-file.sql

نکته :

چنانچه شما براى انجام این کار بر روى host دسترسى به Shell ندارید مىتوانید از
این راه استفاده کنید
از یک PHP استفاده مىکنید بصورت زیر :


<?php
shell_exec
(“Mysql –h host -u user -p database < backup-file.sql”);
?>

این روش ساده ای بود که من براى upload کردن اطلاعات استفاده مىکنم

نمایش چند صفحه ای اطلاعات در PHP

آذر ۱۲م, ۱۳۸۷

با توجه به مطالب مطرح شده در انجمن این سایت و جالب بودن بحث صفحه به صفحه نمایش
دادن اطلاعات نتیجه شده از جستجو در DataBase تصمیم گرفتم که مقاله ای در این خصوص
تهیه کنم و امیدوارم که این مطالب مورد استفاده دوستان قرار بگیرد .

در این مقاله از MySQL استفاده شده اما این روش را می توان با هر DataBase بکار
برد .
جزء LIMIT :

جزء LIMIT در عبارت Select کلید حل مشکل ماست ، به وسیله این جزء است که ما می
توانیم سطرهای مورد نظر خود از DataBase را در Query خود داشته باشیم .

LIMIT به دو شکل به کار می رود با یک آرگومان و یا با دو آرگومان ،این آرگومانها
عدد هستند ، اگر LIMIT با یک آرگومان استفاده شود تعداد جواب به آن عدد محدود می
شود :

SELECT * FROM table LIMIT 5
عبارت Select در این حالت ۵ سطر اول Table را در جواب بر می گرداند ،اما اگر LIMIT
با دو آرگومان استفاده شود آرگومان اول مشخص کننده سطر آغازین است و آرگومان دوم
تعداد سطرهایی را که باید برگردانده شوند را مشخص می کند ، البته باید به این نکته
توجه کرد که در SQL سطرها از صفر (۰) شروع می شوند نه از یک (۱) .
SELECT * FROM table LIMIT 5, 5

این عبارت SQL سطرهای ۶ تا ۱۰ از DataBase را برمی گرداند .

کار با جزء LIMIT مشکل نیست ولی برای اینکه به هدف مطرح شده در این مقاله نیل
کنیم لازم است که چگونگی عملکرد آن را درک کنید .
گام اول متغیر $start :

در اینجا می دانیم که از چه چیزی باید برای بدست آوردن سطرهای مورد نظر خود از
DataBase استفاده استفاده کنیم . اما سوال این است که چگونه متوجه می شویم که از
کجا باید LIMIT کنیم یا به عبارت دیگر از کدام سطر باید شروع کنیم ؟ پاسخ خیلی
روشن است ما از یک متغیر به نام $start استفده می کنیم و این متغیر را از صفحه
ای به صفحه دیگر می فرستیم .
حال که روش کار مشخص شده شروع به نوشتن کد در PHP می کنیم :


<?php
$query
= "SELECT * FROM table LIMIT \" . $start . \", 10\";

?>

این شکل query ماست و این query 10 سطر ازtable را از جایی که مساوی مقدار start
باشد را select می کند . اما برای مشخص کردن مقدار start دو راه وجود دارد(در هنگامی
که اولین ۱۰ سطر را بازیافت می کنیم ) یا آن را در URL می نویسیم و یا با شرطی
چک می کنیم که اگر قبلا مقداری به آن داده نشده ما مقدار آن را صفر می کنیم لازم
است برای این کار از کدی شبیه به کد زیر استفاده می کنیم :


<?php
if(!isset($start)) $start = 0;
?>

حالا وقتی کسی صفحه ما را مشاهده کند مقدار $start به صورت خودکار صفر خواهد شد
.