parsgreen.com
article

نمایش زنده آمار و اطلاعات با آژاکس (Ajax)

ajax-live-file

یکی از قابلیت های منحصر به فرد برنامه نویسی ترکیبی آژاکس (ترکیبی از جاوا اسکریپت و xml)، امکان پردازش زنده آمار و اطلاعات و ارسال و دریافت آنها در لحظه است، شاید تا به حال نمونه ای از این نوع کدها و برنامه های مبتنی بر آژاکس (Ajax) را دیده باشید، مثلا در برخی سیستم های نمایش آمار بازدیدکنندگان، قسمتی تحت عنوان نمایش زنده آمار وجود دارد که در هر لحظه، اطلاعات خوبی از اینکه کاربرانتان مثلا از چه کشورهایی هستند، به دنبال چه مطالبی می گردند و در حال دیدن کدام صفحه از سایت یا وبلاگ شما هستند را نشان می دهد که می تواند در کمک به شناخت بهتر نیازهای آنها و ایجاد محتوایی مفید تر و خیلی چیزهای دیگر به کار آید، جالب است اگر بدانید این نمایش زنده آمار، معمولا با آژاکس یا فِریم وُرک (Framework) های مبتنی بر آن قابل دست یافتن است، متاسفانه در وب و مخصوصا در وب فارسی، تا به امروز منبع خوبی برای اینگونه مسائل ارائه نشده است، به همین دلیل در این مطلب می خواهیم روش پایه ای انجام این کار را در حد امکان آموزش دهیم.

چگونه با آژاکس (Ajax) آمار و اطلاعات را به طور زنده نمایش دهیم؟


شاید اولین سوالی که به ذهن می رسد این باشد که چگونه با آژاکس (Ajax) آمار و اطلاعات را به طور زنده نمایش دهیم؟ پاسخ این است که آژاکس از قابلیتی برخوردار است که می توان به کمک آن در پس زمینه و بدون بارگذاری مجدد صفحه، درخواست هایی به سرور ارسال کرد و پاسخ آن را نیز دریافت کرده و نشان داد، از طرفی شروع توابع در آژاکس که خود مبتنی بر برنامه نویسی جاوا اسکریپت (Javascript) است با یک رویداد آغاز می شود، این رویداد می تواند کلیک کاربر بر روی یک دکمه (onclick) یا بارگذاری (onload) صفحه و یا هر رویداد استاندارد تعریف شده در جاوا اسکریپت باشد (مثلا ممکن است ما به محض بارگذاری یک صفحه شروع به ارسال و دریافت زنده اطلاعات با آژاکس کنیم)، پس از اینکه موتور آژاکسی ما به حرکت می افتد می توان در داخل همان موتور (که در واقع تابعی به زبان جاوا اسکریپت و xml است)، طبق شرایط خاصی با ایجاد وقفه های کوتاه، درخواست به سرور را تکرار کرد و نتیجه را نشان داد و مجددا تا زمانی که مورد نیاز است، این فعل و انفعال را ادامه داد، این کار به صورت ساده سبب می شود که بتوانیم اطلاعات ذخیره شده در دیتابیس یا فایل های php و یا حتی فایل های متنی را به طور زنده دریافت کنیم و نتایج را نمایش دهیم.

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


قبل از هر چیز به یک تابع مبتنی بر آژاکس احتیاج داریم که بتواند درخواست های ما از طریق مرورگر و پاسخ های سرور را مدیریت کند، بدین منظور و همانطور که در بخش آموزش مقدماتی آژاکس، پیش تر گفته ایم، از خاصیت های XMLHttpRequest، innerHTML، document.getElementById، xmlhttp.responseText و متدهای Post یا Get استفاده می کنیم، در تابع زیر این کار را انجام داده ایم:
<script type="text/javascript">
//<![CDATA[
xmlhttp = null;
count = 0;
var d = new Date();
function AjaxLive(){
    InnerHTMLText = "";
    setTimeout('AjaxLive()', 5000);
    xmlhttp = null;
    if (window.XMLHttpRequest){
        // IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else{
        // IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
RndString = d.getFullYear() + "" + d.getMonth() + "" + d.getDate() + ""  + d.getHours() + "" + d.getMinutes() + "" + d.getSeconds() + "" + count++;
    
    xmlhttp.open("GET",'result.php?new=' + RndString,false);
    xmlhttp.send(null);
    if(xmlhttp.responseText != ""){
        InnerHTMLText = xmlhttp.responseText + document.getElementById("showresult").innerHTML;
        document.getElementById("showresult").innerHTML = InnerHTMLText;                
    }
}
//]]>
</script>
توضیح:
- تابع بالا با نام AjaxLive (نامی دلخواه است) وظیفه ارسال و دریافت اطلاعات را به سرور (در اینجا فایل result.php) دارد.
- مقادیر ابتدای تابع برای xmlhttp ، count و var d، مقادیری پیش فرض هستند.
- setTimeout برای ایجاد وقفه در درخواست های آژاکسی به کار می رود، مقدار آن بر حسب میلی ثانیه است (5000 میلی ثانیه معادل 5 ثانیه).
- در اینجا از XMLHttpRequest برای ارسال درخواست آژاکسی استفاده شده است (در بخش آموزش مقدماتی آژاکس گفتیم که دو روش XMLHttpRequest و try و catch در ارسال درخواست آژاکسی کاربرد دارند).
- متغیر RndString برای جلوگیری از کَش (cache) شدن اطلاعات و دریافت تازه ترین آنها است، به طور ساده در این متغیر عددی با محاسبه تاریخ و زمان به صورت داینامیک ایجاد می شود و در هر بار ارسال درخواست با متد Get، پارامتر new، مقادیری جداگانه همراه درخواست آژاکسی می فرستد که این کار موجب جلوگیری از ذخیره یا به اصطلاح کَش شدن می شود.
- xmlhttp.open و متد Get یک درخواست در بستر آژاکس به فایل result.php با پارامتر متغیر new ارسال می کند تا نتایج را با xmlhttp.responseText دریافت کند.
- در قسمت دستور شرطی if بررسی می شود که اگر مقادیر برگردانده شده از xmlhttp.responseText خالی نباشد، مقادیر به خروجی ارسال شود.
- در قسمت خروجی تابع بالا، ابتدا در متغیر InnerHTMLText مقادیر خروجی از  xmlhttp.responseText با محتوای موجود در بلاک div با آی دی showresult جمع می شود (مقادیر موجود در بلاک div با innerHTML به دست می آید).
- سپس کل محتوا (پاسخ جدید و اطلاعات فعلی) از نو، در بلاک div با آی دی showresult با یک دستور innerHTML نشان داده می شوند.

فراخوانی تابع و نمایش اطلاعات در بلاک div


پس از اینکه تابع خود را مبتنی بر آژاکس ساختیم، باید نتایج را درون یک بلاک div با آی دی مشخص (که در کد بالا با نام showresult تنظیم شده است) نشان دهیم، اما قبل از اینکه بتوانیم این کار را انجام دهیم، باید ابتدا موتور آژاکسی خود را استارت زده باشیم! گفتیم که توابع در جاوا اسکریپت معمولا با یک رویداد فراخوانی می شوند، در اینجا ما از رویداد onload در تگ body استفاده می کنیم (رویداد onload با بارگذاری کامل صفحه اجرا می شود).
<body onload="AjaxLive();">
وهمچنین یک بلاک div با آی دی  showresult می سازیم.
<div id="showresult"></div>
اکنون کد ما تقریبا برای استفاده اولیه آماده است، اما بسته به هدف خود می توانیم از قابلیت های بیشتری استفاده کنیم که در ادامه به آنها اشاره می کنیم.

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


اکنون که با نحوه دریافت آمار و اطلاعات به صورت زنده از طریق آژاکس آشنا شدیم، بد نیست ببینیم که چگونه می توان یک فایل متنی یا txt را به این روش مدیریت کرد، یعنی به صورت متناوب بررسی کرد که آیا اطلاعات این فایل به روز شده است یا خیر،  بدین منظور یک تابع دیگر به تابع بالا اضافه می کنیم تا نتیجه به صورت زیر در بیاید.
<script type="text/javascript">
//<![CDATA[
xmlhttp = null;
count = 0;
var d = new Date();
function AjaxClear(StartTimer){
    xmlhttp = null;
    if (window.XMLHttpRequest){
        // IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else{
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
RndString = d.getFullYear() + "" + d.getMonth() + "" + d.getDate() + ""  + d.getHours() + "" + d.getMinutes() + "" + d.getSeconds() + "" + count++;
    
    xmlhttp.open("GET",'delete.php?new=' + RndString,false);
    xmlhttp.send(null);
    if(StartTimer == 1){
        setTimeout('AjaxLive()', 5000);
    }
}
function AjaxLive(){
    InnerHTMLText = "";
    setTimeout('AjaxLive()', 5000);
    xmlhttp = null;
    if (window.XMLHttpRequest){
        // IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else{
        // IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
RndString = d.getFullYear() + "" + d.getMonth() + "" + d.getDate() + ""  + d.getHours() + "" + d.getMinutes() + "" + d.getSeconds() + "" + count++;
    
    xmlhttp.open("GET",'result.txt?new=' + RndString,false);
    xmlhttp.send(null);
    if(xmlhttp.responseText != ""){
        InnerHTMLText = xmlhttp.responseText + document.getElementById("showresult").innerHTML;
        document.getElementById("showresult").innerHTML = InnerHTMLText;
        AjaxClear(0);                
    }
}
//]]>
</script>
توضیح:
- همانطور که می بینید، در اینجا یک تابع دیگر با نام AjaxClear (نامی دلخواه است)، به کد خود اضافه کرده ایم، این تابع وظیفه دارد که فایل delete.php را فراخوانی کند، این فایل برای حذف اطلاعات موجود در فایل دیگری به نام result.txt است که در تابع دوم تنظیم کرده ایم.
- در اینجا نیز از  XMLHttpRequest و متد GET برای ارسال درخواست آژاکسی استفاده شده است که پیش تر توضیح دادیم.
- فایل delete.php به این جهت فراخوانی می شود که اطلاعات جدید فقط دریافت شود نه اطلاعاتی که قبلا دریافت شده است، در غیر اینصورت هر 5 ثانیه، محتوای فعلی فایل result.txt به خروجی بلاک div داده می شود و واضح است که تکرار نتایج خواهیم داشت.
- درون فایل delete.php دستوراتی تعریف خواهیم کرد که با هر بار فراخوانی، محتوای result.txt را پاک می کند.
- اگر دقت کنید، متوجه می شوید که در اینجا در تابع دوم یعنی AjaxLive به جای فایل php فایلی با فرمت txt با نام result.txt را فراخوانی می کنیم.
به طور ساده کد بالا با دو تابع، هر 5 ثانیه یک بار فایل result.txt را بررسی و محتوای آن را (اگر وجود داشته باشد) به بلاک div مقصد منتقل می کند، سپس تابع AjaxClear اجرا شده و محتوای فعلی پاک سازی می شود، همین روند هر 5 ثانیه یک بار تکرار می شود، تا زمانی که کاربر پنجره مرورگر را ببندد.

تنظیمات فایل delete.php


در فایل delete.php باید تنظیماتی را قرار دهیم که با هر بار فراخوانی آن، اطلاعات موجود در فایل result.txt پاک سازی شوند (این کار برای جلوگیری از نمایش محتوای تکراری است)، پس کد را به صورت زیر تنظیم می کنیم.
<?php
$ajaxfile= fopen("result.txt", "w");
fclose($ajaxfile);
?>
ملاحظه می کنید که تنها کافی است با متد w فایل را باز کنید و بنویسید.
استفاده از کد آژاکسی بالا، محدود به فایل های استاتیک نمی شود، می توان به فرض اطلاعات و آمار را از دیتابیس به صورت داینامیک دریافت کرد و یا توابعی پیچیده تر بر مبنای آژاکس نوشت، در کل دنیای زبان های برنامه نویسی مخصوصا برنامه نویسی وب، بسیار توسعه پذیر است که این موضوع تا حدود زیادی به سطح مهارت و علاقه ما و همچنین به وجود منابع آموزشی مناسب بستگی دارد.
sectionدسته بندی: آموزش کاربردی » Ajax
related مطالب بیشتر:
» اعتبار سنجی همزمان فرم با آژاکس (ajax) و php
» نمایش نتایج پایگاه داده و فایل php با آژاکس (ajax)
» لیست داینامیک پیشنهاد کلمات، مبتنی بر آژاکس، php و mysql
» ارسال اطلاعات فرم با آژاکس (ajax) و نمایش پیام در حال پردازش (loading)
» نمایش داینامیک و صفحه به صفحه مطالب با آژاکس
commentنظرات (۲۱ یادداشت برای این مطلب ارسال شده است)
نویسنده: س
زمان: ۱۱:۱۷:۱۹ - تاریخ: ۱۳۹۱/۱۲/۲۲
سلام، ممنون از لطف شما
نویسنده: مازیار
زمان: ۱۶:۵۲:۱۳ - تاریخ: ۱۳۹۲/۰۲/۰۸
ممنون از اموزش خوبی که قرار دادید ولی من با این کد یک مشکل دارم وقتی 5 ثانیه به پایان می رسد و اطلاعات مجدد لود می شود چند لحظه کل مرورگر هنگ می کند البته این مورد در حالت عادی قابل رویت نیست من این کد را برای چت انلاین استفاده کردم و کاربران به خاطر این مکث در تایپ خود دچار مشکل شده اند لطفا راهنمایی کنید
پاسخ: 
این یک مشکل بنیادی است و بستگی به حجم اطلاعات و رفتار مرورگرها دارد، به طور مثال معمولا فایرفاکس درخواست های هم زمان آژاکس را به خوبی مدیریت می کند، از این گذشته برای ایجاد سیستم چت مبتنی بر وب نیاز به توابع پیچیده تری است، برای نمونه باید تابعی داشته باشید که تنها درخواست آژاکس را هنگامی ارسال کند که کاربر در حال تایپ نباشد، مثال:
<script type="text/javascript">
var interval = 1000;
var lastKeypress = null;
var interceptKeypress = function(){
lastKeypress = new Date().getTime();
setTimeout(function(){
var currentTime = new Date().getTime();
if(currentTime - lastKeypress > interval){
sendRequest();
}
},
interval + 100
);
}
sendRequest = function(){
//ارسال درخواست آژاکسی
}
</script>
ضمن اینکه کد حاضر باید تغییراتی کند و به صورت asynchronous (هم زمان) باشد، برای این کار در هنگام استفاده از xmlhttp.open، آرگومان آخر را true قرار دهید، البته برای جلوگیری از بروز خطای
data necessary to complete this operation is not yet available
باید کدها به صورت نمونه زیر ویرایش شوند:
<script type="text/javascript">
xmlhttp.open("GET",'result.txt?new=' + RndString, true);
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
InnerHTMLText = xmlhttp.responseText + document.getElementById("showresult").innerHTML;
document.getElementById("showresult").innerHTML = InnerHTMLText;
AjaxClear(0);
}
}
xmlhttp.send(null);
</script>
در اینجا زمانی از xmlhttp.responseText استفاده می کنیم که درخواست در وضعیت کامل باشد.
نویسنده: رضا
زمان: ۱۳:۴۴:۵۰ - تاریخ: ۱۳۹۲/۰۸/۰۹
سلام ممنون از آموزشتون.
من این کد رو پیاده کردم. اما یه مشکل داره.
هنگامی که برای دومین بار مطلبی رو در result.txt تغییر می دیم مطلب اولیه از بین نمی ره و مطلب دوم بهش اضافه میشه. مثلا اگه بنویسیم xxx و بعدش به yyy تغییرش بدیم. اونوقت نتیجه میده yyyxxxx اما در صورتی که میبایست xxx پاک بشه ولی پاک نمیشه؟؟؟!!!
لطفا راهنماییم کنید
مرسی
پاسخ: 
سلام
این کار به صورت پیش فرض بوده، می توانید قسمت زیر را ویرایش کرده:
InnerHTMLText = xmlhttp.responseText + document.getElementById("showresult").innerHTML;
و به این صورت تغییر دهید:
InnerHTMLText = xmlhttp.responseTextTML;
نویسنده: رضا
زمان: ۱۹:۱۵:۲۰ - تاریخ: ۱۳۹۲/۰۸/۰۹
با سلام و تشکر
من این کد رو با موفقیت پیاده کردم ولی پس از چندین بار تغییر دادن result.txt متاسفانه با مشکل عجیبی روبرو شدم. آی پی من به علت تبادل اطلاعات توسط سرور مسدود شد و پیغام زیر نمایش داده شد.
our connection to this server has been blocked in this server's firewall.
You need to contact the server owner for further information.
Your blocked IP address is 5.233.48.135
This server's hostname is server39.mylittledatacenter.com
من آی پی رو عوض کردم اما دوباره پس از چند بار تبادل اطلاعات دوباره آی پی من مسدود شد.
علت چیست؟؟؟
آیا تبادل زنده آمار و اطلاعات می تواند موجب مسدود شدن آی پی توسط سرور اصلی شود؟؟
با تشکر
پاسخ: 
مسدود شدن IP ارتباط مستقیمی به Ajax ندارد، بلکه تکرار پی در پی درخواست به سرور در یک بازه زمانی خیلی کوتاه می تواند علت بلاک شدن باشد، درخواست های شما به سرور باید طی فواصل زمانی محدود (به فرض هر 1 دقیقه) باشد.
نویسنده: مهدی
زمان: ۰۰:۱۴:۱۶ - تاریخ: ۱۳۹۲/۱۱/۱۶
سلام استاد ممنون از آموزشتون من به یک کد نیاز دارم اونم اینکه بررسی بشه اگر در صفحه دیگری مقدار یک متعیر تغییر کرده است مقدار جدید نمایش داده شود ممنون
پاسخ: 
سلام
سوالتان واضح نیست!
نویسنده: آزاد
زمان: ۰۰:۵۳:۳۹ - تاریخ: ۱۳۹۲/۱۱/۲۰
سلام خسته نباشید...
اگه بخوام چندتا فایل رو به صورت همزمان توی یک فایل فراخوانی کنم به صورت آژاکس باید چه کدی استفاده کنم کدی که شما ارائه کردید فقط برای یک فایل جواب میده به طور مثال من میخوام فایل های a.php و b.php رو به صورت همزمان به صورت زنده نمایش بدم...
ممنون ازتون
پاسخ: 
سلام
باید نحوه کار آژاکس را خوب درک کنید تا بتوانید این کد را متناسب با نیازتان توسعه دهید.
نویسنده: ابوالفضل
زمان: ۱۷:۳۲:۲۸ - تاریخ: ۱۳۹۲/۱۱/۲۸
سلام من از کد زیر استفاده می کنم می خوام اگر تغییراتی ایجاد نشده بود متن پیش فرض نمایش داده شود. کد به خوبی کار می کنه و به محض اینکه متن تغییر کرد تغییر میکنه ولی باز بعد چند ثانیه متن پیش فرض را نمایش می دهد
<script type="text/javascript">
//<![CDATA[
xmlhttp = null;
count = 0;
var d = new Date();
function AjaxLive(){
InnerHTMLText = "";
setTimeout('AjaxLive()', 5000);
xmlhttp = null;
if(window.XMLHttpRequest){
//IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else{
//IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
RndString = d.getFullYear() + "" + d.getMonth() + "" + d.getDate() + "" + d.getHours() + "" + d.getMinutes() + "" + d.getSeconds() + "" + count++;

xmlhttp.open("GET", 'validate.php?new=' + RndString, false);
xmlhttp.send(null);
if(xmlhttp.responseText != ""){
InnerHTMLText = xmlhttp.responseText;
document.getElementById("showresultt").innerHTML = InnerHTMLText;
}
else{
if(document.getElementById("showresultt").innerHTML == ''){
InnerHTMLText = 'متن پیش فرض';
document.getElementById("showresultt").innerHTML = InnerHTMLText;
}
}
}
AjaxLive();
//]]>
</script>
در ضمن نمیشه اون فرمان راه اندازی موتور آژاکس را توی خود همین فایل انجام داد من میخوام کد را در یک فایل جاوا مانند زیر نمایش بدم
<script language="javascript" src="http://www.mysite.com/abzar.php?s=2"></script>
ممنون میشم راهنمایی بفرمایید
پاسخ: 
سلام
کد بالا برای هر دو سوال ویرایش و اصلاح شد!
نویسنده: ابوالفضل
زمان: ۲۳:۲۲:۱۴ - تاریخ: ۱۳۹۲/۱۱/۲۸
سلام خیلی ممنون
یه سوال دیگه هم دارم آیا میشه به جای اینکه خروجی را در :
<div id="showresultt"></div>
در یک متغیر ذخیره کند تا بتوان به شکل زیر ازش استفاده کرد:
document.write("pasookh:" + showresult + "");
من الان نزدیک یک ساعته دارم کل جاوا رو روش پیاده سازی می کنم! اما نشد که نشد...
پاسخ: 
سلام
showresult در واقع آی دی بلاکی است که نتیجه در آن چاپ می شود، نتیجه در xmlhttp.responseText وجود دارد (لطفا به آموزش های مقدماتی آژاکس مراجعه کنید).
نویسنده: ابوالفضل
زمان: ۰۳:۳۵:۲۴ - تاریخ: ۱۳۹۲/۱۱/۳۰
سلام خواهش می کنم بگید من باید چیکار کنم رفتم خوندم اموزش های مقدماتی آژاکس رو یعنی من باید یه تایع ایجاد کنم؟ display اسمش بزارم؟! xmlhttp.responseText را در یک متغیر ذخیره کردم خروجی گرفتم نشد من کار با آژاکس و جاوا رو تازه شروع کردم درکش برام پایینه هر چی هم بلد بودم روی این کد پیاده کردم نشد :(( فقط این مورد دیگه را راهنمایی کنید خواهش می کنم خیلی بهش نیاز دارم...
پاسخ: 
سلام
اگر اشکال دیگری در کدهای شما وجود نداشته باشد، حالت زیر باید پاسخ درخواست آژاکسی را چاپ کند:
<script type="text/javascript">
var showresult = xmlhttp.responseText;
document.write("pasookh:" + showresult + "");
</script>
نکته: با توجه به توضیحات شما به نظر مشکل از موارد دیگری ناشی می شود، به طور مثال ممکن است کدهایتان خطای syntax داشته باشد.
نویسنده: ابوالفضل
زمان: ۱۹:۴۱:۴۳ - تاریخ: ۱۳۹۲/۱۱/۳۰
سلام ممنون راستش من خودمم همین کار رو کرده بودم یک متغیر ایجاد کردم مثل شما ولی نشد حالا چرای اون خیلی جالبه :
من کدها را قبل از
AjaxLive();
که تابع رو فراخوانی می کرد قرار می دادم! در صورتی که باید بعد از
AjaxLive();
قرار می دادم مشکل من فقط همین بود و به خاطرش خیلی چیزهای دیگه از این جاوا یاد گرفتم که الان یعنی کل این کد نویسی رو فهمیدم چی به چیه!
البته این کارم میشه کرد:
	var element = document.getElementById('player');
var id = element.innerHTML;
document.getElementById("player").innerHTML = id;
document.write("<div id='player'></div>");
خیلی ممنونم از سایت خوبتون
نویسنده: ابوالفضل
زمان: ۱۹:۴۸:۰۱ - تاریخ: ۱۳۹۲/۱۱/۳۰
راستی یادم رفت سوال بعدیم رو بپرسم :d
من این کد رو درست کردم همه چیز هم عالیه البته با کمک شما تونستم تا اینجای کار بیام
حال من این کد را در:
<script language="javascript" src="http://www.mysite.com/abzar.php?s=2"></script>

قرار میدم اون قسمت:
xmlhttp.open("GET", 'validate.php?new=' + RndString, false);
هم به :
xmlhttp.open("GET", 'http://mysite.com/validate.php?new=' + RndString, false);
تغییر دادم کد کار نمیکنه ! در آژاکس نمیشه درخواست به صفحات سایت دیگری فرستاد و پاسخ گرفت؟
واسه انجام چنین کاری راهی وجود داد اصلا؟
پاسخ: 
از نظر امنیتی امکان ارسال مسقیم درخواست آژاکسی به سروری دیگر (به سادگی) مهیا نیست، باید درخواست را به سرور خود ارسال کرده و در سرور با استفاده از توابعی مانند curl ادامه مراحل را انجام دهید.
نویسنده: بهنام
زمان: ۲۳:۴۴:۲۶ - تاریخ: ۱۳۹۳/۰۲/۳۱
با سلام
چرا کدها در آژاکس کش میشوند دلیلش چیست؟
نمیشوند مستقیم بجای سال و ماه و روز و ساعت و دقیقه و ... یک عدد فرضی مثلا 999999999999999999 گذاشت؟ یا با عملیات ضرب و اینا هر بار اجرای آژاکس ضرب در دو شود؟
و در ضمن اگه ممکن در مورد کش شونده ها و
AjaxClear()
بیشتر توضیح بدید ممنونم
پاسخ: 
سلام
تا آنجا که اطلاع داریم درخواست های Ajax برای مرورگر مانند یک درخواست معمولی HTTP است، منتها اغلب مرورگرها به صورت پیش فرض تا دقایق کوتاهی صفحات وب را در حافظه موقت نگهداری می کنند (جهت افزایش سرعت)، از آنجایی که اغلب درخواست های آژاکسی در کمتر از دقیقه و به صورت پی در پی رخ می دهند، لذا این حالت مناسب نیست و باید در هر درخواست نتیجه جدید گرفته شود، لذا با افزودن یک پارامتر به انتهای آدرس درخواستی از سرور، مرورگر تصور می کند که این صفحه قبلا فراخوانی نشده و لذا نباید cache شود، اینکه این پارامتر چه چیز باشد مهم نیست، اما باید در هر درخواست یک مقدار متفاوت فرستاده شود تا مطمئن شویم آدرس تکراری نباشد، روش سال و ماه و... به این دلیل که همواره یک خروجی جدید خواهیم داشت از این لحاظ مناسب است.
تابع AjaxClear توضیح بیشتری از آنچه در آموزش گفته شده ندارد!
نویسنده: بهنام
زمان: ۲۳:۵۲:۱۰ - تاریخ: ۱۳۹۳/۰۲/۳۱
و راستی
من کد ها رو به این صورت نوشتم
function AjaxClear(SetTime){
AjaxStart();
xmlhttp.open("GET","delete.php",false);
xmlhttp.send(null);
if(SetTime == 1){
setInterval("Ajax();",5000);
}
}
function Ajax(){
AjaxStart();
var InnerHTML = '';
setInterval("Ajax();",5000);
xmlhttp.open("GET","result.txt",false);
xmlhttp.send(null);
if(xmlhttp.responseText != ''){
InnerHTML = document.getElementById('main').innerHTML + xmlhttp.responseText;
document.getElementById('main').innerHTML = InnerHTML;
AjaxClear(0);
}
}
دقیق عمل کرد و هیچ مشکلی پیش نیومد کش ها رو حذف کردم آیا امکان دارد بعد ها مشکلاتی پیش بیاید؟
نکته:
- درون فایل delete.php که همان کد های خودتان هست
- AjaxStart هم همان فراخوانی آژاکس هست
پاسخ: 
حالت cache همیشه وجود ندارد، مرورگرها بر حسب تنظیمات پیش فرض ممکن است این کار را انجام دهند، در هر صورت استفاده نکردن از پارامتر توصیه نمی شود!
نویسنده: بهنام
زمان: ۰۲:۰۱:۳۴ - تاریخ: ۱۳۹۳/۰۳/۰۱
سلام
با کمک سایت مفید شما تونستم چت رومم را همانطور که آرزوم بود بسازم حالا یه مشکل مونده این وسط:
شما با یک فایل مثال زدید که هر بار محتوای درون فایل را خالی می کند و پیام های جدید را نشان میدهد این درست اما اگر بخواهیم بجای فایل با mysql کار کنیم من با mysql را طبق همین نوشتم ولی نمیدونم درون فایل delete.php چه کدی بنویسم؟ اگر دستور مربوط به mysql حرف تمامی ستون ها delete from ... ؛ اینطوری مشکل برطرف می شود و پیام ها را نشان میدهد اما فقط به خودم نشان میدهد اگر با مرورگر دیگه ای برم کاربر دیگه ای نمیتواند پیام ها را ببیند اما اگر کد های درون delete.php را خالی بگذارم و هیچ کدی ننویسم- مثلا 10 پیام در پایگاه داده هستش ؛ هر 10 تا پیام همینطور هی تکرار میشوند و همه کاربرا پیام را میبینند و برای آن ها هم تکرار می شود راه حل delete.php چیست؟
لطفا یک راه حال پیشنهاد بدید نهایت سپاس را دارم
پاسخ: 
سلام
در پاسخ های قبلی گفتیم که باید تجربه لازم را داشته باشید، تعریف ساختار یک برنامه چت نیاز به رعایت نکات زیادی دارد که نمی توان همه آنها را اینجا خلاصه کرد، به طور مثال ده ها کاربر هم زمان در حال استفاده از اطلاعات دیتابیسی هستند که باید مقادیر ستون های آن مطابق با عملکرد تمام کاربران مدیریت شود، اینکه چه راه حلی برای این کار پیدا کنید تنها با صرف وقت، فکر کردن و نوشتن طرح تئوری روی کاغذ امکانپذیر است!، اما چیزی که در این لحظه به ذهن می رسد، می توانید اطلاعات را هنگامی حذف کنید که آخرین کاربر از چت روم مورد نظر خارج یا آفلاین می شود، یعنی زمانی که هیچ کاربری در روم نبود یا به فرض مدت یک روز از تاریخ مطالب گذشت، آنها را با اجرای فایل delete.php حذف کنید، برای نمایش اطلاعات نیز یک ستون در نظر بگیرید، هر کاربری که ردیف مورد نظر را دریافت کرد، نام او را در ستون فرضی به صورت یک رشته قابل تبدیل به آرایه اضافه کنید، به فرض:
Ali|Reza|Pedram
با این حالت می توانید در کدهای PHP، نام کاربر را با مقادیر value آرایه مقایسه کنید، اگر وجود داشت، آن ردیف را به خروجی ارسال نکنید یا روش ساده تر این است که یک سشن آی دی برای کاربران در نظر بگیرید که مقادیر آن آخرین id از ستون پیام هایی باشد که برای کاربر ارسال می شود، به این ترتیب در هر درخواست، شماره های بعدی را تنها در پاسخ ارسال کنید.
در کل برای طراحی بهترین و بهینه ترین حالت باید خوب فکر کنید و البته بر ابزار کار (برنامه نویسی PHP و MySQL + Ajax و JavaScript) مسلط باشید.
نویسنده: بهنام
زمان: ۱۴:۵۹:۲۰ - تاریخ: ۱۳۹۳/۰۳/۰۱
بله فهمیدم بسیار ممنونم
اگر دستور آژاکس ما POST باشد این کش را چطوری باید بفرستیم آیا به این صورت امکان پذیر است؟
xmlhttp.open("POST","result.txt",true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send("new=" + MyRand());
پاسخ: 
بله، در قسمت اول هم می توانید این کار را انجام دهید و در نهایت فرقی نمی کند، منظور این قسمت است:
xmlhttp.open("POST","result.txt?new=" + MyRand(),true);
paged صفحه 1 از 2




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

5 × 4
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...