قصد داریم روشی دیگر برای ارسال و دریافت اطلاعات فرم ها با تابع fsockopen را معرفی کنیم . در آموزش های قبل در مورد ارسال و دریافت اطلاعات فرم با php و متد های $_GET و $_POST آشنا شدید . هر دوی این متد ها برای ارسال داده از یک صفحه به صفحه دیگر استفاده می شوند . اما با استفاده از POST می توانید اطلاعات را به روش پنهانی در درخواست های HTTP ارسال کنید و متد GET نیز داده ها را از طریق URL ارسال می کرد , درصورتی که اطلاعات مهم مثل پسوردها را با این متدها ارسال کنیم , این روش ها بسیار ناامن خواهد بود .
در اینجا قصد داریم در مورد تابع fsockopen در php صحبت کنیم .
با تابع fsockopen می توانیم داده هایی را که از یک صفحه به صفحه دیگر با متد POST به صورت خیلی ایمن ارسال کنیم به طوری که هیچ کسی نمی توانید با جاواسکریپت آن را هک کند !
1 |
$socket = fsockopen($host, 80, $errno, $errstr, 15); |
درباره تابع fsockopen :
تابع fsockopen یک سرور دقیقا بر روی همان پورتی که تعیین کردیم باز می کند . در اینحا پورت ما ۸۰ و هاست www.netparadis.com است .بعد منتظر می ماند که ما چه کاری باهاش انجام بدیم !
کد php زیر چک می کند که آیا http در سرور فعال است یا نه, اگر غیرفعال بود یک پیام خطا ارسال می کنیم و در همانجا اسکریپت را به پایان می رسانیم .
1 2 3 4 5 |
if (!$socket) { //If connection gets fail then it will display the error number & message and will stops the script from continue working echo ' error: ' . $errno . ' ' . $errstr; die; } |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
اما اگر کانکشنی برای اتصال پیدا کرد , ادامه کدها را اجرا می کنیم .در اینجا ما اطلاعات هدر (header) را همراه داده های فرم به صفحه second.php با استفاده از تابع fwrite ارسال می کنیم.
1 2 |
//Sends header data to the web server fwrite($socket, $http); |
کد زیر داده های ذخیره شده را به صورت یک آرایه برگشت می دهد .
1 2 3 |
while (!feof($socket)) { $contents[] = fgets($socket, 4096); } |
داده ها برگشت داده شده شامل بعضی اطلاعات هدر و داده های ارسال شده خواهد بود . داده های دریافتی از فرم در ایندکس ۸ام آرایه خواهد بود .
1 2 3 |
if (isset($contents[8])) { echo $contents[8] == '' ? '' : $contents[8]; } |
در کد بالا داده ها را در صفحه چاپ کردیم که شما می توانید آنها را هرطور که میخواهید مثل اعتبار سنجی , ذخیره در دیتابیس و .. استفاده کنید.
فایل های استفاده شده در مثال آموزش دریافت اطلاعات فرم با تابع fsockopen
فایل file.php :
در این صفحه , مقادیر وارد شده در textbox ها به همین صفحه ارسال می شود ,در اینجا با استفاده از تابع fsockopen , مقادیر به صفحه second.php برای انجام عملیات بر روی این داده ها ارسال خواهند شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<html> <head> <title>POST data using fsockopen() Function</title> <meta content="noindex, nofollow" name="robots"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <?php if (isset($_POST['submit'])) { $data = $_POST['emp_name']; $host = "www.formget.com"; $path = "/tutorial/fsockopen/second.php"; $post_data = 'name=' . $data; $socket = fsockopen($host, 80, $errno, $errstr, 15); //Checks if the connection was fine if (!$socket) { //If connection gets fail then it will display the error number & message and will stops the script from continue working echo ' error: ' . $errno . ' ' . $errstr; die; } else { //This tells the web server what version of HTTP protocol we are using and the file to which we are sending request $http = "POST $path HTTP/1.1\r\n"; //This is the url or IP of which the request is coming from $http .= "Host: $host\r\n"; //The user agent being used to send the request $http .= "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "\r\n"; //The content type, this is important and much look like the following if sending POST data. //If this is not provided the server may not process the POST data $http .= "Content-Type: application/x-www-form-urlencoded\r\n"; //Lets the web server know the total length/size of are posted content //It is not always required but some servers will refuse requests if not provided $http .= "Content-length: " . strlen($post_data) . "\r\n"; //Tells the server whether header request is completed and the rest if content / POST data $http .= "Connection: close\r\n\r\n"; //Add data to be sent $http .= $post_data . "\r\n\r\n"; //Sends header data to the web server fwrite($socket, $http); //Waits for the web server to send the full response. On every line returned we append it onto the $contents //variable which will store the whole returned request once completed. while (!feof($socket)) { $contents[] = fgets($socket, 4096); } //Close are request or the connection will stay open until script has completed. fclose($socket); } } ?> <div id="main"> <h1>POST data using fsockopen() Function</h1> <div id="login"> <h2> fsockopen() Function </h2> <hr/> <form action="first.php" method="POST"> <center><span style="color: green;"><?php if (isset($contents[8])) { echo $contents[8] == '' ? '' : $contents[8]; } ?></span></center> <br/> <br/> <label>Enter Name :</label> <input type="text" name="emp_name" required="required" placeholder="Please Enter Name"/><br /><br /> <input type="submit" value="Click Here" name="submit"/><br /> </form> <br/> </div> </div> </body> </html> |
فایل second.php :
ما به جای استفاده مستقیم از متد POST از تابع fsockopen برای امنیت بیشتر در ارسال داده ها بهره بریم . حالا در این صفحه ما مقادیر ارسال شده را با دستور echo نمایش می دهیم.
1 2 3 4 5 |
<?php //$_POST['name'] is Post with the help of fsockopen(). if (isset($_POST['name'])) { echo 'Welcome '.$_POST['name']; }?> |
در این صفحه می توانید با دریافت اطلاعات فرم هرگونه عملیاتی مثل ذخیره , احراز هویت و استفاده از آن در کویری sql و.. را انجام دهید
فایل style.css :
کد های css زیر برای شکیل شدن فرم ما استفاده شده است .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/*---------------------------------------------- css settings for HTML div exactCenter ------------------------------------------------*/ @import url(http://fonts.googleapis.com/css?family=Raleway); #main{ width:960px; margin:50px auto; font-family: 'Raleway', sans-serif; } h2{ background-color: #FEFFED; text-align:center; border-radius: 10px 10px 0 0; margin: -10px -40px; padding: 15px; } hr{ border:0; border-bottom:1px solid #ccc; margin: 10px -40px; margin-bottom: 30px; } #login{ width:300px; float: left; border-radius: 10px; font-family:raleway; border: 2px solid #ccc; padding: 10px 40px 25px; margin-top: 70px; } input[type=text],input[type=email]{ width:99.5%; padding: 10px; margin-top: 8px; border: 1px solid #ccc; padding-left: 5px; font-size: 16px; font-family:raleway; } input[type=submit]{ width: 100%; background-color:#FFBC00; color: white; border: 2px solid #FFCB00; padding: 10px; font-size:20px; cursor:pointer; border-radius: 5px; margin-bottom: -12px; } span { color: red; } #note{ float: right; margin-top: 28px; width: 43%; margin-right: 298px; text-align: justify; } |
جمع بندی :
بعد از خواندن مقاله آموزش دریافت اطلاعات فرم با تابع fsockopen مطمینم سعی خواهید کرد این روش را در پروژه هایی که می نوسید پیاده سازی خواهید کرد . استفاده از تابع fsockopen به جای روش های معمولی که همه استفاده می کنند می تواند بسیار جالب و خیلی امن باشد . امیدوارم از این آموزش هم لذت برده باشید .
هر گونه مشکلی در پیاده سازی کدها داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
با سلامی دوباره خدمت شما
شرمنده من زیاد مزاحمتون میشم
چطوری میشه داده های فرم و به دیتابیس ارسال کرد؟
هر جا رفتم کداشون مشکل داشت!
اگر ممکنه یک سسری کده تست شده بدید!
باتشکر
سلام . قسمت اول آموزش اتصال به دیتابیس با mysqli در مورد با این سوال شماست.
همچنین بهتره php را مقدماتی به بالا بلد باشید تا این سوالات رو خودتون بتونید جواب بدید.
موفق باشید
سلام اقای شفیعی
من میخوام به جای این که از کلاینت برای من پیغام بیادش از سمت سرور به کاربر پیام ارسال کنم مثلا اگر در جدولی در پایگاه داده کاربر تغیراتی ایجاد شد مثلا اگر براش پیام اومد اون پیام رو برای کاربر ارسال کنم یا حتی همین چتروم های ساده . من قبلا با ajax هر ۱۰ ثانیه این رو پیاده کردم اما مشکل اینه وقتی کاربرا زیاد بشن دیگه سایت داغون میشه و اون صفحه که باید اطلاعات رو بررسی کنه جواب نمیده . حالا برای این که زیاد به سرور فشار نیاد میشه از همین socket در php برای ارسال پسام به کاربر استفاده کرد؟
سوال دیگه این که من یک اسکریپت دانلود کردم که یک صفحه داشت که منتظر میموند تا یک کاربر یک صفحه رو باز کنه و وقتی اون صفحه رو کاربر باز میکرد یک ارتباطی بین این دو بوجود میومد ( البته فقط من از روی متنش خوندم و خودم نتونستم کامل درکش کنم) وبعدش من خودم باز هم اون صفحه رو باز کردم (که کاربر باید بازش میکرد) اما ارور میداد و میگفت سرور قطع شده … چطور میشه چندین درخواست رو به این شکل کنترل کرد ؟
با تشکر از سایت خوبتون
سلام . مورد اولی برای درصورتی جوابگو هستش که سایت شما یک چت رومی باشه که هر لحظه برای آپدیت مقدار به دیتابیس وصل بشه و یک مقداری رو چک کنه و خروجی رو به کاربر نشون میده . در صورتی چت روم ندارید توصیه میشه بر روی هاست های اشتراکی این مورد رو انجام ندید چونکه بنابر چیزی که تجربه داشتید باعث فول شدن مموری و منابع سیستمی سرور میشه .
ولی موردی که در صورت وجود یک پیام جدید ، اون رو به کاربر ارسال کنه بهتره کد ها رو در یک فایل جداگانه قرار بدید و به جای هر ۱۰ ثانیه ، حدود ۶۰ ثانیه درخواست چک رو با اجکس ارسال کنید و فقط تاییدیه یا همون مقدار عددی تعداد پیام را برای هر کاربر نشون بدید تا اینکه منابع سخت افزاری در صورت وجود کاربر زیاد درگیر نشه . بعد اینکه کاربر بر روی قسمت ناتیفیکیشن کلیک کرد اون موقع می تونید محتویات پیام رو برای اون شخص بخوانید و نشون بدید . برای بحث سوکت میتونید از websocket استفاده کنید که کمی بحث تخصصی تری رو میطلبه
مورد دوم اطلاع ندارم از چه روشی استفاده شده تا اینکه کد ها رو ببینم و بگم دقیقا چجور روشی پیاده سازی شده . در صورت تمایل اسکریپت رو قرار بدید تا بررسی کنم
موفق باشید