PDA

View Full Version : ارتباط با sql server 2000



azygole
جمعه 07 دی 1386, 20:20 عصر
با سلام . من تازه شروع به کار با php کرده ام و می خواهم با sql server 2000 ارتباط برقرار کنم . من database ی به نام test ساخته ام که username و password آن sa می باشد . نام دستگاه را azadeh گذاشته ام و کد زیر را ایجاد نمو ده ام :
<html>

<head>
<title>Begin work with PHP</title>
</head>

<body>

<?php

$hostname = "azadeh";
$username = "sa";
$password = "sa";
$dbName = "test";

MSSQL_CONNECT($hostname,$username,$password);

?>


</body>

</html>
اما متاسفانه خطای زیر را در Internet Explorer دریافت می کنم :
Fatal error: Call to undefined function: mssql_connect() in c:\inetpub\wwwroot\Begin_work_with_PHP.php on line 19
می دانم که به احتمال زیاد سئوال من تکراری است اما خواهشمندم مرا راهنمایی نمائید . با تشکر فراوان .:لبخندساده:

musiox
شنبه 08 دی 1386, 14:10 عصر
توسعه MSSQL رو باید نصبش کنی . از COM هم می تونی استفاده کنی.

azygole
شنبه 08 دی 1386, 15:02 عصر
بخشید . میشه راهنمایی کنید که از کجا می تونم downloadش کنم ؟ من mssql رو search می کنم چیزهای خیلی مختلفی رو میاره . اگه یه راهنمایی کوچیک بفرمائید خیلی ممنون میشم .

musiox
شنبه 08 دی 1386, 21:53 عصر
اینجا طریقه نصبش و بقیه چیزاش هست...
http://ir2.php.net/manual/en/ref.mssql.php
من خودم از COM استفاده می کنم.

moohssenn
شنبه 08 دی 1386, 23:32 عصر
باید در php.ini بخش مربوط به extention مربوط به mssql را باز کنید . به صورت پیش فرض بسته است .

azygole
یک شنبه 09 دی 1386, 19:10 عصر
سلام . من از اولش extention رو در php.ini برداشتم اما این خطا که گفتم رو میده . بعد اینکه من Microsoft SQL Server 2000 رو نصب دارم . نکنه منظورتون از توسعه mssql همون Microsoft SQL Server2000 هست ؟ حالا چه کار کنم که مشکلم حل بشه؟

moohssenn
یک شنبه 09 دی 1386, 23:13 عصر
این کلاسی است که من ازش استفاده میکنم . تا حالا مشکلی نداشته ام

musiox
دوشنبه 10 دی 1386, 14:02 عصر
اول باید یه شی ارتباط درست کنی


$cnn = new COM("ADODB.Connection", NULL, CP_UTF8);

بعد ارتباط رو برقرار کنی


$cnn->open("provider=sqloledb;data source=$server;initial catalog=$database;integrated security=sspi;",$username,$password);

برای اجرای دستورای SQL از متد Execute استفاده می کنیم . که اگه دستور ما قرار باشه که رکورد برگردونه ( SELECT داشته باشه ) , این متد یه شی Recordset بر می گردونه که حاوی رکوردای برگردونده شدس . پارامتر اول متد , دستور SQL و پارامتر دومش تعداد رکورداییه که دستور روی اونا اثر کرده . متغیری رو که می خوایم این تعداد رو برگردونه بعنوان پارامتر دوم بهش می دیم , این پارامتر اختیاریه . یه پارامتر دیگه هم می گیره که اونو خودتون برید از MSDN ببینید چیه .
مثلا :


$result=$cnn->execute("SELECT * FROM table");

یا


$cnn->execute("INSERT table VALUES (1, 'Row #1')");
OR...
$cnn->execute("DELETE FROM authors WHERE au_lname = 'McBadden'");
OR...
$cnn->execute("UPDATE authors SET au_fname = 'Annie' WHERE au_fname = 'Anne'");

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


$recset = new COM("ADODB.Recordset", NULL, CP_UTF8);

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


$recset->ActiveConnection=$cnn;
$recset->CursorType =1;
$recset->CursorLocation = 3;
$recset->LockType = 3;

پراپرتی ActiveConnection , شی ارتباط فعال رو مشخص می کنه که قبلا اونو باز کردیم .

پراپرتی CursorType , نوع کرسر رکوردست را مشخص میکنه و در زمان بسته بودن رکوردست هم می شه خوندش هم توش نوشت ولی در زمان باز بودن اون فقط می شه ازش خوند . که چهار تا مقدار می تونه بگیره :
-1 که برای کرسره مشخص نشده است
0 که پیش فرضشه و بهش forward-only می گن و اگه این مقدار را به پراپرتی اختصاص بدیم , توی رکوردست فقط می تونیم رکوردا رو به جلو پیمایش کنیم . ( بعدا در موردش صحبت می کنم )
1 که بهش keyset میگن .اگه این مقدار رو انتخاب کنین , قادر به دیدن رکوردای اضافه شده توسط کاربرای دیگه ای که به صورت همزمان دارن با اون جدول یا ویویی که شما داری باهاش کار می کنی نیستین.
2 که بهش dynamic می گن . اکه این مقدار رو انتخاب کنین . در کنار اینکه می تونین تغییراتی رو که کاربرای دیگه ایجاد کردن ببینید می تونید رکوردست رو به هر سمتی پیمایش کنید . ( بعدا در موردش صحبت می کنم ).
3 که بهش static می گن . که این مقدار برای پیدا کردن داده ها خوبه و تغییرات همزمان رو هم نمی تونید ببینید.

پراپرتی CursorLocation که مکان سرویس کرسر رو مشخص می کنه و سه تا مقدار می گیره :
1 none , مشخص کننده این که از سرویس کرسر استفاده نمی کند .
2 server-side , پیش فرض .
3 client-side .پراپرتی

پراپرتی LockType که نوع قفل کردن رکوردا رو موقع ویرایش مشخص می کنه. 5 تا مقدار می گیره :
-1 که نوع قفل مشخص نیست .
1 read-only که رکوردای فقط خوندنی رو مشخص می کنه .
2 pessimistic که قفل کردن بدبینانه رکورد به رکورده . که در این نوع پرووایدر برای مطمئن شدن از ویرایش موفق معمولا رکوردا رو توی دیتا بیس بلافاصله بعد از ویرایش قفل می کنه .
3 pessimistic که قفل کردن خوشبینانه رکورد به رکورده . که توی این نوع رکوردا تنها زمان فراخوانی متد update قفل می شن .
4 BatchOptimistic که قفل کردن دسته ای خوشبینانه است . که برای حال بروزرسانی دسته ای استفاده می شه

پراپرتی eof و bof . پرچمای نشان دهنده اول و آخر رکورد ست هستن . که اگه به آخر رکورد ست برسیم eof مقدارش true می شه یعنی بعد از آخرین رکورد . یا اگه به اول رکوردست برسیم bof مقدارش true یعنی قبل از اولین رکورد . در غیر اینصورت مقدارشون برابر false می شه . اگه هر دو شون true باشن یعنی رکوردست رکوردی نداره و خالیه .

پراپرتی bookmark که مکان رکورد جاری توی رکوردست رو مشخص می کنه .

پراپرتی RecordCount که تعداد رکوردای موجود توی رکوردست رو بر می گردونه . برای برگردوندن تعداد رکوردا باید نوع کرسر رو درست تعیین کنید .

پراپرتی fields که حاوی مجموعه فیلد های جدول یا تقاضایی است که بر گردانده شده اند . برای دسترسی به مقدار یک فیلد بصورت زیر عمل می کنیم :


$recset->fields[$index]
OR...
$recset->fields[$name]

برای دسترسی به تعداد فیلدها هم می توان از count استفاده کرد.


$recset->fields->count



برای اجرای دستورای SQL بوسیله رکوردست از متد Open استفاده می کنیم که پنج تا پارامتر داره :
اولیش می تونه یه اسم جدول باشه , یه دستور SQL باشه , فراخوانی یه استر پراسیجر باشه یا یه شی Command باشه .
دومیش ارتباط فعال با دیتا بیسه که اگه از طریق پراپرتی مقدار دهی شده باشه دیگه نیازی بهش نیست .
سومیش نوع کرسره که اینم اگه از طریق پراپرتیش مقدار دهی کرده بایم دیگه نیازی بهش نیست .
چهارمیش نوع قفل است که اینم اگه از طریق پراپرتیش مقدار دهی کرده بایم دیگه نیازی بهش نیست .
آخریشم که یه سری تنظیمات دیگس.

مثلا:


$recset->open("SELECT * FROM table");


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

move : از این متد برای پیمایش استفاده می شه که دو تا پارامتر داره اولی تعداد رکوردایی که می خوایم پیمایش کنیم و دومی مکان شروع به حرکت که از 1 شروع می شه . اگه مقدار پارامتر اول مثبت باشه به جلو و اگر منفی باشه به عقب حرکت می کنه . اگه وقتی که eof مقدارش true باشه , بخوایم که به جلو کنیم خطا ایجاد می شه و اگه bof مقدارش true باشه و بخوایم که به عقب حرکت کنیم خطا ایجاد می شه . اگه با مقدار پیمایش به گونه ای باشه که بیشتر از تعداد رکوردای توی رکوردست بشه eof مقدارش true میشه و همین قضیه برای حرکت به عقبم وجود داره فقط اونجا bof مقدارش true میشه .

moveFirst , moveLast , moveNext , movePrevious : از این متدا هم برای پیمایش استفاده میشه . که فکر کنم از کاراییشون از اسمشون پیدا باشه . فقط باید حواستون به eof و bof باشه . توی moveNext اگه eof مقدارش true باشه و توی movePrevious اگه eof مقدارش true باشه خطا تولید میشه . moveFirst و moveLast هم وقتی که رکوردست خالی باشه باعث تولید خطا میشن . و ...

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

اینم یه تابع برای برگرداندن رکورد های موجود در رکوردست بصورت آرایه :



function result($recset,$start,$count){

$result=array();

if($start<1||$count<1||($recset->eof&&$recset->bof)){
return $result;
}

$this->recset->move($start-1,1);
$end=$start+$count;
$j=0;
for($start;($start<$end)&&(!$recset->EOF);$start++){
for($i=0;$i<$recset->fields->count;$i++){
$result[$j][$recset->fields[$i]->name]=$this->recset->fields[$i]->value;
}
$recset->movenext();
$j++;
}
return $result;
}

اینم یه مثال کوچیک :


$server="server";
$databse="database";
$username="username";
$password="password";
$table="table";

$cnn = new COM("ADODB.Connection", NULL, CP_UTF8);
$cnn->open("provider=sqloledb;data source=$server;initial catalog=$database;integrated security=sspi;",$username,$password);

$recset = new COM("ADODB.Recordset", NULL, CP_UTF8);
$recset->ActiveConnection=$cnn;
$recset->CursorType =1;
$recset->CursorLocation = 3;
$recset->LockType = 3;
$recset->open("SELECT * FROM $table");

print_r(result($recset));
$cnn->close();

در آخر سر هم برای بستن ارتباط از متد close استفاده می کنیم .

اگه کمی , کاستی , عیبی یا اشکالی داره شرمنده همه ...

azygole
سه شنبه 11 دی 1386, 07:46 صبح
سلام آقای musiox . خیلی ممنون از پیگیری شما و ممنون که چیزی یادم میدین . اما من بالاخره دیشب ارتباط رو برقرار کردم . می دونین اشتباهم کجا بود . من php.ini تو شاخه نصبشو تغییر می دادم اما باید php.ini تو شاخه ویندوزمو درست می کردم بعدش اینکه باید فایل php_mssql.dll رو کنار php.ini توی شاخه ویندوز کپی می کردم . بعد درست شد . واقعاً خیلی خوشحالم که بالاخره کار کرد و تونستم داده های یه جدول رو تو صفحه وب که با php ساختم نمایش بدم . اینو گذاشتم برای افراد مبتدی مثل خودم تا اونا هم یاد بگیرن :)

musiox
سه شنبه 11 دی 1386, 13:59 عصر
نمی دونم odbc بود یا mssql که با یونیکد مشکل داشت یعنی خطا می داد . من واسه همین از COM استفاده می کنم . تا حالا کسی تو این زمینه به مشکل برنخورده ؟ در ضمن COM سرعتش کمتر از تابع های mssql است ولی مزایا و امکاناتش بیشتره .

pooyesh
یک شنبه 03 شهریور 1387, 09:38 صبح
من هم وقتی می خواهم توسط ISS به sql server اتصال برقرار کنم خطای زیر رو میده

Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: TOOBA\TAHA in C:\Inetpub\wwwroot\1.php on line 11

کارهایی گفتید رو انجام دادم ولی مشکل حل نشد
جالب اینجاست با apache جواب می ده و همون کد اتصال با sql server برقرار می کنه

نمونه کد من:
[php[php
if(mssql_connect('po\TAHA','php','123')){
echo"yes";
}else{
echo"no";
}
[php]