PDA

View Full Version : آموزش: جمع بندی موضوعات و مباحث مربوط به PHP و MSSQL



Unique
جمعه 17 خرداد 1392, 12:32 عصر
علت اینکه این پست آموزشی را میزنم به این دلیل هست که مدتیه همینطور سوالاتی در مورد اتصال به MSSQL Server توی انجمن php پرسیده میشه و خودم و دوستان یا جواب نمیدیم یا به همه میگیم برین جستجو کنید توی انجمن و گوگل حتما پیدا میکنید.

به هر حال پیرو یکی از پست های اخیر خواستم تجربیاتم را در اختیار دوستان بگذارم.

نکته : به نظر من و خیلی از برنامه نویسان php استفاده از MSSQL خط قرمز محسوب میشه و کلا باید ازش در محیط لینوکس و php دوری کرد ، لازم هم نیست به من اعتماد کنید و خودتون میتونید توی انجمن های معتبر PHP بپرسید و جستجو کنید.

به طور کلی چندین روش برای اتصال به MSSQL وجود داره که من 5 روش معمول را میگم و یکی را که توصیه میکنم توضیحات و کدش را میگذارم.

روش اول : تا نسخه 5.3 خود php یک Extension به نام mssql داشت که هنوز مستنداتش هم توی سایت php.net موجوده ولی دیگه پشتیبانی نمیشه ، حالا اگه خیلی علاقه دارین میتونید از نسخه های قدیمی تر php استفاده کنید و از این extension استفاده کنید. البته قرار نیست مثلا همه امکانات SQL 2012 را هم پشتیبانی کنه و ممکنه خیلی bug داشته باشه. مستنداتش هم اینجاست (http://www.php.net/manual/en/book.mssql.php)

روش دوم : مایکروسافت مثل اینکه خودش متوجه شده اگه دست به کار نشه توی php واقعا کسی با مشکلات driver های فعلی سراغ mssql نمیره و خلاصه آستین ها را بالا زدند یا سفارشش را دادند. خودش اومده یک extension برای php درست کرده که به نسخه 3 هم رسیده و اینطور که پیداست خیلی امکانات خوبی داره و mssql را به خوبی پشتیبانی میکنه. مشکلش اینه که فقط روی windows قابل استفاده هست و برای لینوکس تا زمان نوشتن این پست وجود نداره. این سایتش و همه اطلاعات مربوط (http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx)ه برای علاقه مندان.

توجه : سه روش بعدی در مورد PDO هست.

روش سوم : یکی از Driver های PDO اسمش PDO_DBLIB هست که امکان اتصال و استفاده از MSSQL و Sybase را از طریق کتابخونه FreeTDS فراهم میکنه. این Extension از نسخه 5.3 PHP به بعد برای ویتدوز پشتیبانی نمیشه (وجود نداره) و وفقط روی لینوکس قابل استفاده هستش. نکنه اینکه DB-LIB قدیمیه ، Thread un-safe هست و هزار مشکل دیگه که در زمان کار کردن بهش بر میخورین.

روش چهارم : یکی دیگه از driver های PDO اسمش PDO_SQLSRV هستش که شما باید همون extension که توی روش دوم اشاره کردم را بگیرید و با توجه به non thread safe یا thread safe بودن نسخه php با کپی کردن dll های مربوطه و اعمال تغییرات توی php.ini اون را نصب کنید. نکته اینکه فقط روی ویندوز هم جواب میده. اینجا طریقه نصب را بهتر توضیح داده (http://www.php.net/manual/en/ref.pdo-sqlsrv.php)

روش پنجم : این روش که هم روی ویندوز و هم روی لینوکس جواب میده (بدیهی هست که باید ODBC روی سیستم عامل نصب باشه به همراه Extension مربوطه) از طریق PDO_ODBC هستش.

بهتره از Driver های جدید مایکروسافت استفاده کنید که خیلی قابلیت داره و برای هر دو سیستم عامل هم طراحی شده از اینجا نسخه ویندوزی (http://www.microsoft.com/en-us/download/details.aspx?id=36434) را بگیرین و از اینجا نسخه لینوکسی (http://www.microsoft.com/en-us/download/details.aspx?id=28160) را.

اما کد :


try{
$hostname = "host,port";
$dbname = "database_name";
$username = "username";
$pw = "password";

$pdo = new PDO ("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname; Uid=$username;Pwd=$pw;");

} catch (PDOException $e) {
echo "Failed : " . $e->getMessage() . "\n";
exit;
}

$query = $pdo->prepare("select field_name from table");
$query->execute();

for($i=0; $row = $query->fetch(); $i++){
echo ($i + 1)." - ".$row['field_name']."<br/>";
}


نکته مهم : یکی از مشکلات اصلی دوستان درست set نکردن host$ هستش. متوجه باشین دادن ip یا ادرس FQDN (مثل mssql.mydomain.com) ممکنه خطای timeout بده اونجاست که شما باید به دو نکته توجه کنید.پورت پیش فرض 1443 هست اما اگه شما چند تا instance داشته باشین اونوقت پورت ها به صورت رندوم اختصاص داده میشه و باید توی host$ از instance name استفاده کنید یا پورت بدین ، اینطوری :



$hostname = "xxx.xxx.xxx.xxx,6688"; // port version
$hostname = "xxx.xxx.xxx.xxx\SQLEXPRESS"; // instance version

پس حتما از مسئول هاست بپرسین تنظیماتشون چیه و اگه خودتون نصب میکنید از instance name استفاده کنید. (توی SQL server Configuration Manager هست)

امیدوارم مفید باشه.
پیروز باشید.

hakim110
چهارشنبه 29 مرداد 1393, 10:03 صبح
سلام متون فارسي در اجراي كوري ها خالي برميگرده چطور اين مشكل رو حل كنم من از PDO استفاده ميكنم:ناراحت:

Unique
چهارشنبه 29 مرداد 1393, 19:30 عصر
بیشتر توضیح بدین ، متوجه نشدم.

سوداگر
پنج شنبه 30 مرداد 1393, 00:40 صبح
احتمال زیاد به خاطر اینه که لغات موجود در دیتابیس با لغاتی که در کوئری هستند از نظر شما مثل هم هست ولی از نظر کامپیوتر و utf-8 خیر... مثلا حروف ی با ي فرق داره و یا ک فارسی با ک عربی. در این مورد موقع query زدن باید چند حالت بوجود اومده رو درنظر بگیرید.