PDA

View Full Version : آموزش: کار با Stored Procedure



mbf5923
دوشنبه 05 تیر 1391, 22:14 عصر
این بحث PROCEDURE یک موضوع بسیار مهم هست که بسیاری از مشکلات امنیتی رو مرتفع میکنه اگه دوستان از یاد گیری اون وحشت نکنن.
برای دوستانی که بلد نیستن(البته همه بلدن صرفا برای یادآوری):
فرض کنید یک جدول(table) در بانک اطلاعاتیتون (Database) دارین که حاوی نام و نام خانوادگی و شماره تلفن یه سری افراد هستش و شما احتیاج دارید که یک شماره خاص رو در این جدول جستجو کنید ونتیجه رو به کاربر نمایش بدین:
فرض رو بر این بگیریم که ساختار جدول ما به این شکل باشه:


CREATE TABLE IF NOT EXISTS `members` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(15) COLLATE utf8_persian_ci DEFAULT NULL,
`Family` varchar(15) COLLATE utf8_persian_ci DEFAULT NULL,
`TelNumber` int(10) DEFAULT NULL,
PRIMARY KEY (`Id`),
KEY `TelNumber` (`TelNumber`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=1 ;



خوب حالا یه سری اطلاعات هم وارد این جدول میکینم فرض کنیم اطلاعات زیر


INSERT INTO `members` (`Id`, `Name`, `Family`, `TelNumber`) VALUES
(1, 'محمد', 'محدی', 123654),
(2, 'علی', 'علوی', 789654),
(3, 'حسن', 'حسنی', 159753),
(4, 'حسین', 'حسینی', 1258745),
(5, 'رضا', 'رضایی', 74568),
(6, 'احمد', 'احمدی', 112457);

حالا ما قصد داریم یکی از شماره های وارد شده رو جستجو کنیم و اطلاعات مربوط به صاحب اون شماره رو ببینیم.
خوب اینجا همه به فکر دستورات php و select از داخل اون میوفتن(خودم رو عرض میکنم) به شکل زیر:


<meta charset=utf-8 />
<?php
$host_name = "localhost";
$user_name = "root";
$pass = "";
$db_name = "telbook";


$dblink =mysql_connect($host_name,$user_name,$pass);
if(!$dblink)
{
print 'Error : Con not Connected To This Data Base Please Try again';
}
$con = mysql_select_db($db_name,$dblink);
mysql_query("SET NAMES 'utf8'");
if(!$con)
{
print 'Error : Con not Connected To This Data Base Please Try again';
}

//Connect To Table And Select
$query = "select name,family from members where TelNumber=159753";
$result = mysql_query($query,$dblink);
//Echo Result
while($fe = mysql_fetch_assoc($result))
echo $fe["name"].' '.$fe["family"] ;
mysql_close();


?>
و اما روش stored procedure که این همه گفتیم اون رو بگیم مثل یک تابع هستش با این تفاوت که توی یک صفحه php نوشته نمیشه توی دیتابیس mysql نوشته میشه.
مثلا برای مثال فوق ما قراره یه شماره به اون بدیم و نام و نام خانوادگی رو تحویل بگیریم پس یک ورودی و دو خروجی باید برای تابع در نظر بگیریم.
روش کار به این صورت هست که وارد table مورد نظر در phpmyadmin میشیم و گزینه aql رو انتخاب میکنیم و کد زیر رو در اون وارد میکنیم:


DELIMITER $$
DROP PROCEDURE IF EXISTS `telbook`.`Find`$$
CREATE PROCEDURE `telbook`.`Find`
(
IN Tell INT,
OUT FirstName VARCHAR(15),
OUT LastName VARCHAR(15)
)
BEGIN
SELECT Name, Family
INTO FirstName, LastName
FROM members
WHERE TelNumber = Tell;
END $$
DELIMITER ;
خوب تا اینجای کار stored procedure ما آماده است همونطور که میبینید این stored procedure یک ورودی با نام Tell از نوع Int دریافت میکنه (چون توی جدولمون فیلد شماره تلفن از نوع Int بود) و دو تا خروجی با نام های FirstName و LastName برمیگردونه.
توی Select هم همیونطور که میبینید ابتدا نام فیلدهای مورد نظر از جدولمون رو مینویسیم و بعد اونها رو داخل خروجی ها قرار میدیم و بعد هم شرطمون که برابر بودن فیلد TelNumber با ورودی Tell هستش.
و اما توی php مثل کارهای قبل دقیقا عمل میکنیم با این تفاوت که Select اونجا پیاده سازی نمیشه و فقط این stored procedure فراخوانی میشه به ترتیب زیر:


<meta charset=utf-8 />
<?php
$host_name = "localhost";
$user_name = "root";
$pass = "";
$db_name = "telbook";


$dblink =mysql_connect($host_name,$user_name,$pass);
if(!$dblink)
{
print 'Error : Con not Connected To This Data Base Please Try again';
}
$con = mysql_select_db($db_name,$dblink);
mysql_query("SET NAMES 'utf8'");
if(!$con)
{
print 'Error : Con not Connected To This Data Base Please Try again';
}

//Connect To Table And Call Stored Procedure
$query = "CALL Find(159753, @FirstName, @LastName)";
$result = mysql_query($query,$dblink);
$result = mysql_query('SELECT @FirstName, @LastName',$dblink);
//Echo Result
while($fe = mysql_fetch_assoc($result))
echo $fe["@FirstName"].' '.$fe["@LastName"] ;
mysql_close();


?>
فقط در اینجا ما نیاز هست که یکبار Stored Procedure رو فراخوانی کنیم:


$query = "CALL Find(159753, @FirstName, @LastName)";
و بعد مقادیرش رو دریافت کنیم:


$result = mysql_query('SELECT @FirstName, @LastName',$dblink);
به همین سادگی.
سوالی بود در خدمتم

ayub_coder
دوشنبه 05 تیر 1391, 22:30 عصر
اگه خواستیم همه ی مقادیر رو برگردونیم چطور؟

mbf5923
دوشنبه 05 تیر 1391, 22:44 عصر
در این صورت Stored Procedure ما ورودی نداره مثلا Stored Procedure بالا به صورت زیر نوشته میشه

DELIMITER $$
DROP PROCEDURE IF EXISTS `telbook`.`Find`$$
CREATE PROCEDURE `telbook`.`Find`()
BEGIN
SELECT *
FROM members;
END $$
DELIMITER ;
و در اینجا کلید های آرایه همون نام فیلدهای دیتابیسمون هستن

farzan_l
یک شنبه 13 اسفند 1391, 11:27 صبح
سلام
لطفا میشه کارباstored procdureرا با C#‎‎هم بفر مایین مثلا وارد کردن جندتا اطلاعات تو دیتابیس ویا پاک کردن آنها آز داخل دیتابیس.
ممنون