پنجشنبه ۰۴ اردیبهشت ۱۴۰۴

Thursday, April 24, 2025 GMT +3:30

ارسال و دریافت اطلاعات با متد GET و POST در ای جکس (Ajax)

ajax-asynchronous

به طور کلی ارسال و دریافت اطلاعات در بستر وب با دو متد GET و POST صورت می گیرد که جزئی از استانداردهای تعریف شده پروتکل HTTP هستند و توسط مرورگرها و سرورهای مختلف پشتیبانی می شوند، متد GET معمولا برای ارسال پارامترهای قابل روئیت در آدرس URL درخواستی و دریافت پاسخ از سرور کاربرد دارد، از متد POST نیز به طور معمول در کدنویسی HTML در هنگام کار با فرم ها (تگ form) و ارسال اطلاعات به صورت غیرقابل روئیت استفاده می شود، در ای جکس GET و POST کارکردی مشابه دارند با این تفاوت که در هر دو متد درخواست در پس زمینه ارسال شده و خللی در پیمایش صفحه کاربر ایجاد نمی شود، درک این دو شیوه با توجه به استفاده در بدنه اصلی یک درخواست مبتنی بر ای جکس (Ajax) جهت طی ادامه روند آموزش های این بخش اهمیت زیادی دارد.

متد GET و POST در ای جکس (Ajax)


همانطور که پیش از این گفتیم درخواست های مبتنی بر ای جکس (Ajax) از چند قسمت اصلی تشکیل شده اند (آبجکت XMLHttpRequest، متد open، متد send، متد onreadystatechange و readyState)، آبجکت XMLHttpRequest ساز و کار مورد نیاز را برای ارسال و دریافت اطلاعات بر بستر Ajax فراهم می کند، متد open یک فایل را در سرور با یکی از متدهای GET یا POST فراخوانی کرده و پارامترهای مورد نیاز در قسمت send ارسال می شوند، متد onreadystatechange نیز در کنار متد readyState وضعیت های مختلف را در طی این فرآیند بررسی می کند، با ذکر این ساختار کلی این قسمت از آموزش را به متد open و send اختصاص می دهیم که خود از متدهای GET و POST در پروتکل HTTP استفاده می کنند، به طور خلاصه:
- open و send توابعی در Ajax هستند که برای فراخوانی یک فایل از سرور و ارسال پارامتر به آن از آنها استفاده می کنیم (این توابع را در اصطلاح برنامه نویسی شی گرا، متد می گویند).
- متد open برای فراخوانی فایل از سرور از یکی از شیوه های تعریف شده در پروتکل HTTP استفاده می کند، در پروتکل HTTP دو متد GET و POST برای ارسال و دریافت اطلاعات بین کاربر (Client) و سرور (Server) تعریف شده که جزء استانداردهای این پروتکل هستند.

پارامترهای متد open و send در ای جکس (Ajax)


هر درخواست مبتنی بر ای جکس (Ajax) در نهایت باید یک فایل را از سرور فراخوانی کند، این فراخوانی می تواند با ارسال مقادیر یا بدون ارسال مقادیر باشد، ای جکس برای این نیاز از دو متد open و send استفاده می کند که درخواست ها با این دو متد از طریق استاندارد HTTP و متدهای GET و POST در این استاندارد ارسال و نتیجه دریافت می شود، در نمونه کدهای زیر بخش مربوط به متد open و send از یک درخواست مبتنی بر ای جکس را بررسی می کنیم:
xmlHttp.open("GET", "index.php?action=add&id=22", true);
xmlHttp.send(null);

var params = "action=add&id=22";
xmlHttp.open("POST", "index.php", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send(params);
همان طور که در نمونه کدهای بالا مشخص است، زمانی که متد GET در قسمت open استفاده می شود، پارامترها از طریق آدرس URL به سرور ارسال می شوند و قسمت send مقدار null یا خالی دارد، اما در حالت استفاده از POST باید تنظیماتی اعمال شود که از جمله استفاده از متد setRequestHeader است، این متد در ای جکس برای تنظیم سربرگ (Header) های HTTP در یک درخواست استفاده می شود، در مثال بالا نیز سربرگ Content-type با مقادیر application/x-www-form-urlencoded تنظیم شده است، این دستور به مرورگر تفهیم می کند که اطلاعات را مانند یک فرم ساده HTML ارسال کند، پارامترها در حالت استفاده از متد POST، هم می توانند از طریق آدرس URL (مشابه متد GET) و هم در بخش send ارسال شوند که هر کدام برای شرایط خاصی مناسب هستند که در ادامه در این رابطه بیشتر خواهیم گفت، پارامتر سوم متد open نیز برای تعیین غیر همزمانی (هم روند یا Asynchronous) بودن یا نبودن درخواست است، در صورتی که این مقدار true باشد در پیمایش صفحه کاربر خللی ایجاد نمی شود اما اگر این مقدار را false تنظیم کنیم، تا زمانی که فرآیند درخواست ای جکس به پایان نرسیده، کاربر نمی تواند در صفحه پیمایش کند.

GET یا POST، کدام متد را استفاده کنیم؟!


GET و POST هر کدام با هدف خاصی در HTTP تعریف شده اند، متد GET برای ارسال پارامترها در آدرس URL به کار می رود و از POST برای ارسال بسته های اطلاعات به صورت غیر قابل روئیت استفاده می شود.
کجا از GET استفاده کنیم؟
- متد GET معمولا برای ارسال پارامترهای دستوری در آدرس URL استفاده می شود، به طور مثال می توانیم شماره ID کاربر یا کلمه جستجو شده را در این متد ارسال کنیم.
- در صورتی که اطلاعات ارسال شده حالت عمومی داشته باشند استفاده از GET مانعی ندارد، به طور مثال ارسال اطلاعات حساس مانند رمز عبور از این طریق توصیه نمی شود چرا که در آدرس URL و به صورت آشکار قابل روئیت خواهد بود.
- در مواردی که نیاز به ذخیره سازی موقت (Cache) اطلاعات باشد GET گزینه مناسبی است (البته این حالت را می توان با برنامه نویسی جاوا اسکریپت به نحو دلخواه تغییر داد).
- متد GET در ای جکس سریعتر از متد POST است و برای موارد عمومی که صرفا نیاز به فراخوانی یک فایل از سرور با Ajax است، گزینه مناسبی است، متد POST در ای جکس به صورت دو مرحله ای عمل می کند (ابتدا سربرگ های HTTP و سپس اطلاعات ارسال می شوند).
جهت آشنایی بیشتر در مثال زیر اطلاعات فرضی را توسط متد GET برای یک فایل PHP با نام ajax-get.php ارسال و پاسخ را در بلاکی با آی دی result خروجی می دهیم:

فایل ajax-get.php


<?php
@$site = $_GET['site'];
@$domain = $_GET['domain'];
echo "نام سایت: $site<br>";
echo "آدرس دامنه: $domain<br>";
echo "متد استفاده شده: GET<br>";
?>

کد HTML درخواست و تنظیمات Ajax


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال و دریافت اطلاعات با متد GET</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
    font-family: Tahoma, Geneva, sans-serif;
    direction: rtl;
    font-size: 12px;
}
</style>
<script type="text/javascript">
function ajaxCallFile(id) {
    var xmlHttp;
    
    try {
        //Opera, Firefox, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        //Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("متاسفانه مرورگر شما از ای جکس پشتیبانی نمی کند");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            document.getElementById(id).innerHTML = xmlHttp.responseText;
            document.getElementById('button-1').innerHTML = 'ارسال درخواست ای جکس';
            document.getElementById('button-1').disabled = false;
        } else {
            document.getElementById('button-1').innerHTML = 'لطفا چند لحظه صبر کنید...';
            document.getElementById('button-1').disabled = true;
        }
    }
    
    xmlHttp.open("GET", "ajax-get.php?site=Webgoo&domain=https://webgoo.ir", true);
    xmlHttp.send(null);
}
</script>
</head>
<body>
<noscript>
جاوا اسکریپت در مرورگر شما غیر فعال است!<br>
</noscript>

<button id="button-1" type="button" onclick="ajaxCallFile('result')">ارسال درخواست ای جکس</button>
<div id="result"></div>
<hr>
پس از کلیک بر روی دکمه بالا، تابع جاوا اسکریپتی فراخوانی شده و درخواست ای جکس به فایل PHP در سرور ارسال می شود، سپس نتیجه دریافت و در بلاک نمایش داده خواهد شد، در این مثال از متد GET استفاده شده است.
</body>
</html>
پیش نمایش
متد POST در ای جکس شباهت زیادی به GET دارد، با این تفاوت که در این شیوه درخواست، مانند تگ form در HTML سربرگ های HTTP یا HTTP Headers نیز به مرورگر ارسال می شوند، از طرفی xmlHttp.send به جای مقادیر null، پارامترهایی با مقادیر رشته ای دارد.
کجا از POST استفاده کنیم؟
- در ای جکس هرکجا نیاز به ارسال اطلاعات حساس مانند نام کاربری، کلمه عبور، مشخصات حساب بانکی و... باشد، بهتر است از POST استفاده کنیم، چرا که اطلاعات در این شیوه در آدرس URL قابل روئیت نیست.
- برای ارسال اطلاعات حجیم (به طور مثال اطلاعات یک فرم HTML) از POST استفاده می شود، متد GET از نظر میزان اطلاعات مجاز با محدودیت های بیشتری در مقایسه با POST روبرو است.
جهت آشنایی بیشتر در مثال زیر اطلاعات فرضی را توسط متد POST برای یک فایل PHP با نام ajax-post.php ارسال و پاسخ را در بلاکی با آی دی result خروجی می دهیم:

فایل ajax-post.php


<?php
@$site = $_POST['site'];
@$domain = $_POST['domain'];
echo "نام سایت: $site<br>";
echo "آدرس دامنه: $domain<br>";
echo "متد استفاده شده: POST<br>";
?>

کد HTML درخواست و تنظیمات Ajax


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال و دریافت اطلاعات با متد POST</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
    font-family: Tahoma, Geneva, sans-serif;
    direction: rtl;
    font-size: 12px;
}
</style>
<script type="text/javascript">
function ajaxCallFile(id) {
    var xmlHttp;
    
    try {
        //Opera, Firefox, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        //Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("متاسفانه مرورگر شما از ای جکس پشتیبانی نمی کند");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            document.getElementById(id).innerHTML = xmlHttp.responseText;
            document.getElementById('button-1').innerHTML = 'ارسال درخواست ای جکس';
            document.getElementById('button-1').disabled = false;
        } else {
            document.getElementById('button-1').innerHTML = 'لطفا چند لحظه صبر کنید...';
            document.getElementById('button-1').disabled = true;
        }
    }
    
    xmlHttp.open("POST", "ajax-post.php", true);
    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlHttp.send('site=Webgoo&domain=https://webgoo.ir');
}
</script>
</head>
<body>
<noscript>
جاوا اسکریپت در مرورگر شما غیر فعال است!<br>
</noscript>

<button id="button-1" type="button" onclick="ajaxCallFile('result')">ارسال درخواست ای جکس</button>
<div id="result"></div>
<hr>
پس از کلیک بر روی دکمه بالا، تابع جاوا اسکریپتی فراخوانی شده و درخواست ای جکس به فایل PHP در سرور ارسال می شود، سپس نتیجه دریافت و در بلاک نمایش داده خواهد شد، در متد POST از متد setRequestHeader استفاده و پارامترها در قسمت send تنظیم و ارسال می شوند، در این مثال از متد POST استفاده شده است.
</body>
</html>
پیش نمایش
ارسال پارامترها در ای جکس صرفا به روش ثابت مانند نمونه کدهای بالا محدود نمی شود، در آموزش های بعدی خواهیم دید که چگونه می توان به نحو حرفه ای تر و با قابلیت تعاملی بیشتر به صورت پویا از قابلیت های ای جکس در طراحی امکانات و رابط کاربری برنامه های تحت وب استفاده کرد.
دسته بندی: آموزش مقدماتی » Ajax
related مطالب بیشتر:
آموزش ای جکس (Ajax)، تکنیک غیرهمزمانی در وب
نمایش افکت fade in با ای جکس (Ajax)
ذخیره و نمایش اطلاعات فایل با ای جکس (Ajax) و PHP
فریم ورک های ای جکس (Ajax Frameworks)
نمایش پیام در حال بارگذاری با ای جکس (Ajax)
دیدگاه
more ۵۴ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
سعید خسروی
۰۳:۰۳ ۱۴۰۱/۰۴/۱۹
خیلی ممنون خدا خیرتون بده درست شد و مشکلی نداره
فقط یک سوال:
نوشتن متاتگ ها اینطوری نوشته بشه مشکلی داره؟
<meta name="description" content="Free Web tutorials" /‌>
چون وقتی توی سایت خودم از متاتگ هاش خروجی می کردم با الگوی اولیه شما که برای سایت شما درست بود برای سایت من قسمتی از استایل رو هم می آورد! ولی واسه سایت شما مشکلی نداشت! سایت شما بصورت:
<meta name="description" content="Free Web tutorials">
نوشته شده! آیا نوشتنش بصورت سایت خودم مشکلی برای سئو ایجاد نمی کنه؟!
با تشکر
خیر اگر از XHTML یا HTML نسخه 5 استفاده می کنید هیچ مشکلی ندارد، مشکل نمایش موارد اضافه در خروجی از کامل نبودن الگو بود، نوشتن عبارت باقاعده ای که دقیقا نه کم نه زیاد قسمت مد نظر را استخراج کند نیازمند در نظر گرفتن تمام حالت های ممکن است که حالت / (اسلش) در انتها لحاظ نشده بود.
سعید خسروی
۱۸:۱۹ ۱۴۰۱/۰۴/۱۸
با تشکر از شما خیلی عالی بود خدا خیرتون بده ماشاءالله توی کارتون خیلی حرفه ای هستید خدا به خودتون و تموم عزیزانتون سلامتی بده انشاءالله تابعی که گفتید سعی می کنم یادش بگیرم واسه خروجی نهایی:
echo strip_tags(str_replace('" />','',$mata_description));
تابع رو اینطوری کردم چون واسه سایتهایی که میخواستم
" />
رو هم نشون میداد، واسه سایت شما درست بود فقط واسه سایت خودم دیدم با خروجی استایل قالب رو هم می گیره توی الگو اگه
" />
رو بهش اضافه کنیم که از دستور str_replace استفاده نشه چطوری الگو رو تغییر بدیم!
ماشاءالله اونطوری که شما الگو رو نوشتید و جواب داد ذهن من قفل کرد!
خواهش، الگوی قبلی با افزودن عبارت زیر به انتها ویرایش شد:
\/?
لطفا تست کنید اگر مشکلی داشت اصلاح کنیم.
سعید خسروی
۱۵:۳۴ ۱۴۰۱/۰۴/۱۸
ببخشید بازم مزاحم شدم شرمنده
یه سوال دیگه هم داشتم اگه بخواهیم داده داخل
<meta name="description" content="text">
رو که تگ بسته نداره بگیریم چطوری میشه؟
آیا ممکنه؟
با تشکر
با تابع preg_match به صورت نمونه زیر می توانیم محتوای متاتگ description را استخراج کنیم:
<?php
$link = 'https://webgoo.ir';
$_link = file_get_contents($link);
preg_match('/<meta\s+name\s*=\s*"description"\s+content\s*=\s*"(.*?)"\s*\/?>/ims', $_link, $match);
$mata_description = $match[1];
echo $mata_description;
?>
یک تابع اختصاصی هم در PHP برای استخراج متاتگ ها وجود دارد:
get_meta_tags

https://www.php.net/manual/en/function.get-meta-tags.php
سعید خسروی
۱۱:۲۴ ۱۴۰۱/۰۴/۱۸
از لطف و محبت شما بسیار ممنون و سپاسگزارم
درست شد
وبلاگی که برای نمونه گذاشته بودم می تونید لینکش رو پاک کنید تبلیغ براش حساب نشه و یا بعدا نگه چرا وبلاگ من اینجا نوشتید
عید قربان هم بهتون تبریک عرض می کنم
با تشکر فراوان
آدرس وبلاگ حذف شد، متقابلا خدمت شما تبریک عرض می کنیم.
سعید خسروی
۱۰:۴۳ ۱۴۰۱/۰۴/۱۸
با سلام مجدد
ببینید این ادرس
حذف شد
وبلاگ است که دامین داره چون من همه دامین ها رو با هم میزنم مشخص نمی شه کدوم دامین خودش رو داره و کدوم ساب دامین بلاگ بیان است. و ممکنه دامین ها هم اس اس ال داشته باشند و یا نداشته باشند برای همین نمی دونم چیکار باید کرد برای ساب دامین ها ریپلیس میکنم و اون تایتیل رو می گیره
str_replace('http://','https://',$link));
فقط برای دامین هایی که اس اس ال نداره کار نمی کنه و این ارور میده:
308 permanent redirect
وقتی من عنوان وبلاگها رو دریافت می کنم در لحظه ممکنه 20 تا رو با هم چک کنه بصورت خودکار از این صفحه
https://blog.ir/changes
وبلاگهایی که بروز شدن عنوان ها رو می گیره و
$link
تک تک هر کدوم از وبلاگها است
برای جدا کردن وبلاگ ها از سایت های شخصی به نظر می توانید به صورت زیر شرط بگذارید:
<?php
$link = 'http://example.com';
if(strpos($link, 'blog.ir') !== false) {
$_link = Rh::file_get_contents(str_replace('http://', 'https://', $link));
} else {
$_link = Rh::file_get_contents($link);
}
$title = preg_match('/<title>(.*?)<\\/title>/ims', $_link, $match);
if(!empty($title))
$new->title = strip_tags($match[1]);
?>
سعید خسروی
۰۷:۵۷ ۱۴۰۱/۰۴/۱۸
با سلام و خسته نباشید
برای دریافت عنوان وبلاگهای blog.ir از file_get_content استفاده می کنم برای وبلاگهایی که https هستند لینکها رو ریدایرکت میکنم که عنوان رو دریافت کنه، ولی بعضی از وبلاگها دامنه اختصاصی بهشون وصله که اس اس ال ندارن و عنوان رو دریافت نمی کنه و ارور
308 permanent redirect
میده آیا راهی وجود داره که عنوان هر دو نوع وبلاگ رو بدون مشکل دریافت کنه؟
با تشکر
$_link = Rh::file_get_contents(str_replace('http://', 'https://', $link));
$title = preg_match('/<title>(.*?)<\\/title>/ims', $_link, $match);
if( ! empty($title))
$new->title = strip_tags($match[1]);
لطفا آدرس یک وبلاگ را که امکان دریافت عنوان آن وجود ندارد درج کنید تا تست و بررسی ها انجام شود.
meysam
۰۱:۳۷ ۱۴۰۰/۰۲/۱۷
سلام ممنون میشم کمکم کنید
من یه کد ساده میخوام که وقتی اطلاعات به صورت get بهش ارسال شد بررسی کنه ببینه ایا تو دیتابیس و اون تیبل ایا موجود هست یا نه اگه بود ok برگردونه اگه نبود no ممنون میشم اگه کدش رو دارین ارسال کنید.
متد به صورت زیر قراره ارسال بشه :
http://exmple.com/check.php?code='url='.$siteurl
ظاهرا URL شما ایراد دارد و پارامتر code به درستی تنظیم نشده است، احتمالا باید به شکل نمونه زیر باشد:
'http://exmple.com/check.php?code=' . $yourcode . '&url=' . $siteurl
در هر صورت برای اجرای پرس و جوی دیتابیس ابتدا باید از طریق کنترل پنل هاست (cPanel، DirectAdmin و...) پایگاه داده و نام کاربری جهت اتصال ایجاد کرده باشید سپس از کدی مشابه نمونه زیر با توجه به نامگذاری جدول و ستون ها استفاده کنید:
<?php
//دریافت پارامتر ها
@$code = $_GET['code'];
@$site = $_GET['site'];

function checkDBValueExit($code, $site){
$result = false;

//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn){
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else{
//سازگاری با حروف فارسی
$sql = "SET NAMES 'utf8'";
$query = mysqli_query($conn, $sql);

//ایمن سازی پارامترها
$code = mysqli_real_escape_string($conn, $code);
$site = mysqli_real_escape_string($conn, $site);

//اانتخاب اطلاعات از جدول و ستون ها
$sql = "SELECT id FROM tbl_1_name WHERE code = '$code' AND site = '$site' LIMIT 1";
$query = mysqli_query($conn, $sql);

if(!$query){
echo "Selecting From Table tbl_1_name: Error! " . mysqli_error($conn) . '<br>';
} else{
//تعداد ردیف های انتخاب شده
$count = mysqli_num_rows($query);

//پردازش و خروجی ردیف های اطلاعات
if($count > 0){
$result = 'ok';
} else{
$result = 'no';
}
}
}

//پایان اتصال
mysqli_close($conn);

return $result;
}

echo checkDBValueExit($code, $site);
?>
در این کد باید اطلاعات اتصال شامل نام کاربری و کلمه عبور، نام دیتابیس و جدول جایگزین قسمت های username، password، dbname و tbl_1_name شود، همچنین فرض بر این است که هر دو مقدار code و site باید در جدول مطابق با اطلاعات ارسالی باشند تا ok برگردانده شود، اگر به فرض به site نیازی نیست می توانید قسمت زیر را از پرس و جو حذف کنید:
AND site = '$site'
همچنین ستون id جهت بررسی در پرس و جو استفاده شده است که باید هم نام با ستونی در جدولتان باشد.
mahdi
۱۰:۱۲ ۱۴۰۰/۰۲/۰۵
سلام ، استاد عزیز اگر هدرها رو بصورت زیر ارسال کنیم آیا همشون اعمال میشن یا فقط آخری اعمال میشه؟
load({
.........,
headers : [
"Content-type:application/x-www-form-urlencoded",
"Content-type:application/json",
]
})

function load(data)
.........
if(data.headers){
var i,h;
for(i=0; i< data.headers.length; i++){
h = data.headers[i].split(":");
xhr.setRequestHeader(h[0],h[1]);
}
}
}
و چطوری چک کنم ببینم همشون اعمال میشن یا نه؟
استاد عزیز دو سه روز پیگیر ایجکس شدم و با ایجکس ساده و فچ و بصورت پرامیس و اکسیوس آشنا شدم و میبینم خیلیاشون اصلا در هیچکدوم از نسخه های ie ساپورت نمیشن بعد من کلا گیر دادم که تا ie9 رو رعایت کنم ، آیا من توهم زدم استاد عزیز و کلا دیگه هیچکس از ie استفاده نمیکنه و باید بیخیالش بشم؟
شایدم چون تازه کارم و یه سری مطلب های آموزشی رو میبینم که برای خیلی وقت پیشه دچار این توهم شدم؟
خیلی ممنون استاد عزیز سلامت و موفق باشی
تا آنجا که اطلاع داریم در درخواست های متداول Ajax معمولا یک Content-type مورد نیاز است مگر اینکه با پروتکل های ارسال ایمیل کار کنید که در آنجا بحث Boundary مطرح می شود و مباحث جداگانه ای دارد، در این نمونه کد احتمالا فقط مورد آخر تنظیم و ارسال می شود (تست نکرده ایم) که می توانید در هنگام ارسال درخواست با زدن دکمه F12 مرورگرها از بخش Console سربرگ ها را بررسی کنید، در مورد بحث IE اگر چند سال پیش سوال را مطرح می کردید شاید هنوز پافشاری می کردیم اما در حال حاضر تعداد کاربران نسخه های مختلف این مرورگر خیلی خیلی پائین و همچنان رو به کاهش است پس برای استفاده از فناوری ها و متدهای جدیدی که در دیگر مرورگرها شامل Edge پشتیبانی می شود تردید نکنید، پشتیبانی از IE می تواند در حد شکل ظاهری و رابط کاربری سایت اصلی باشد اما امکانات و سرویس های خاص می توانند دیگر از IE پشتیبانی نکنند (بهینه این است که پیام هشداری به کاربر نمایش داده شود) چون وب امروز نیاز به فناوری های جدید دارد و تغییراتی نسبت به قبل داشته است.
mahdi
۲۳:۱۶ ۱۴۰۰/۰۲/۰۳
سلام استاد عزیز میخوام برای ایجکس یه تابع برای استفاده مجدد بنویسم ، هدرهارو مثل این پایینی
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
چطوری بهش انتقال بدم؟
یا اینارو باید در همون تابع اصلی بصورت پیشفرض بنویسم؟
البته استاد عزیز شاید سوالم ساده باشه ولی دیگه آخر شبه خیلی خسته شدم گفتم از شما بپرسم خیلی ممنون استاد عزیز ، سلامت و موفق باشی
یک راه که به ذهن می رسد این است که هدرهای مد نظر را در تابع ای جکس به صورت switch و case داشته باشید و یک آرگیومنت هم در نظر بگیرید که به فرض مقدار عددی داشته باشد (آرگیومنت را به عنوان case بررسی کنید)، در هنگام فراخوانی به جای انتقال کل هدر صرفا شماره مورد نظر را تنظیم و هدر برای درخواست جاری ارسال شود.
متین
۱۹:۰۱ ۱۳۹۹/۱۰/۲۷
سلام و خسته نباشید
من بخوام داده ای که از قبل موجوده رو با متد پست به یک فایل ارسال کنم چجور میشه؟ یعنی داده از کاربر دریافت نشه یه اطلاعاتی که الان دستمون هست توی فایل هست و با یک تابع تعریف شده رو پست کنم
اگر اطلاعات به صورت متنی و در یک فایل به فرض txt قرار دارد باید با توابعی مانند file_get_contents در PHP داده ها را دریافت و به متغیری نسبت دهید، در نهایت از تابع cURL استفاده و داده ها را به آدرس مورد نظر با متد POST ارسال کنید، این فایل PHP را با ای جکس یا به صورت مستقیم می توانید فراخوانی کنید.
۱۷:۳۰ ۱۳۹۷/۰۶/۲۰
سپاس
Kylo ren
۱۴:۱۷ ۱۳۹۶/۱۰/۲۴
سلام هر کاری کردم اطلاعاتی رو که با Ajax ارسال می کردم اگرچه با echo خروجی درست بود ولی در دیتابیس به صورت کاراکترهای نامفهوم ذخیره می شد. آخر فرم رو با تارگت iframe در همان صفحه ارسال کردم و برای خود فریم از jquery استفاده کردم. ولی در این حالت دیگه اطلاعات درست منتقل میشه! از تابع بالا هم استفاده کردم ولی فقط حروف نامفهوم رو به علامت سوال تغییر میده. (با روش ajax حروف فارسی و اموجی هارو به صورت åäö نمایش میداد) لطفا بیشتر درباره encode توضیح میدید؟
در استاندارد URL کاراکترهای فارسی در هنگام انتقال از سمت کاربر به سمت سرور تبدیل به علائم خاصی می شوند به طور مثال حرف ب تبدیل به معادل
%D8%A8
می شود، در حال حاضر این مقدار به طور معمول به صورت خودکار بین سمت کاربر و سرور انجام می گیرد و در صورتی که کل فرآیند از یونیکد UTF-8 پیروی کند مشکلی پیش نمی آید، اما گاهی نیاز است که به صورت دستی این مقادیر را تبدیل کنیم (معمولا در حالتی که بخشی از فرآیند به صورت پیش فرض از UTF-8 استفاده نکند)، برای تبدیل نیز از توابع زیر استفاده می شود (تابع پیشنهادی در سوال قبل اصلاح شد):
- urldecode
- rawurldecode
در هر حال با توجه به اینکه طبق گفته شما در دستور echo مشکلی دیده نمی شود، خطایابی بیشتر نیاز به تست عملی کدها دارد، ممکن است حتی یک ایراد کوچک باعث بروز این موارد شود که قابل پیش بینی نباشد و فقط در تست مشخص شود، همچنین باید دید دیتابیس، جداول و ستون ها از utf8_persian_ci استفاده کنند! اطلاعاتی در خصوص حروف فارسی و معادل آنها در MySQL:
http://collation-charts.org/mysql60/mysql604.utf8_persian_ci.html
Kylo ren
۲۰:۵۵ ۱۳۹۶/۱۰/۲۳
با تشکر من از جی کوری از تابع serialize استفاده کردم ولی اطلاعات textarea رو که فارسی هست به صورت کاراکترهای ناشناخته منتقل میکنه چجوری میشه حروف فارسی رو درست منتقل کرد؟ البته textarea من یک texteditor هست با قالب html
تا آنجا که اطلاع داریم متد serialize از تابع encodeURIComponent استفاده می کند که این تابع مقادیر را پیش از انتقال بر اساس استاندارد URL با یونیکد UTF-8 تبدیل می کند، لذا برای دریافت مقادیر در PHP ابتدا باید آنها را Decode کنیم، مثال:
$editor_text = rawurldecode(htmlspecialchars($_POST['editor_text']));
اگر یک نمونه آنلاین یا اسکرین شات از شکل کاراکترها درج می کردید درک مشکل ساده تر بود.
Kylo ren
۰۸:۵۱ ۱۳۹۶/۱۰/۲۳
سلام بر شما ، من یه صفحه ویرایش مطلب دارم که اطلاعات اون به صورت فیلدهای یک فرم هستن ، و برای ثبت تغییرات فرم رو به یک فایل php ارسال می کنم تا توسط اون اعتبارسنجی و ثبت بشه . اما برای اینکه اعتبارسنجی انجام بشه من باید فرم رو ارسال کنم به اون صفحه و در نتیجه تغییرات در فیلدها از بین میرن. میشه لطفا راهنمایی کنید چجوری میتوان این فرم رو به صورت ای جکس اعتبارسنجی کرد به صورتی که مثلا اگر روی دکمه ثبت کلیک کردم بررسی انجام بشه و تغییرات رو ثبت کنه یا خطا رو بنویسه . البته منظورم اجرای اون فایل php بدون رفرش صفحه و نمایش نتیجه اونه . من سعی کردم اما واقعا غیراصولی شد و البته کاراکترهای فارسی رو ثبت نمی کرد! کلا منظورم مانند ویرایش مطالب وردپرس است. لطفا پیشنهادی بدین!
پاسخ کوتاهی برای سوالتان قابل ارائه نیست! باید از مقدمات با Ajax آشنا باشید، در هر صورت نمونه آموزشی در همین خصوص در سایت وجود دارد، برای دسترسی به این آموزش لطفا عبارت "ارسال اطلاعات فرم با ای جکس + وبگو" را در گوگل جستجو کنید، در صورتی که همچنان با مشکل مواجه بودید به صورت موردی مطرح کنید تا بررسی گردد.
محمدی
۱۹:۴۹ ۱۳۹۶/۰۵/۱۵
سلام خواهش میکنم مشکل منو حل کنید هر چی بیشتر می گردم نا امید تر میشم من یه دکمه ای دارم که بعد از کلیک اون، یه جدول پایین همون صفحه نمایش داده میشه ولی بعد از کلیک، صفحه رفرش میشه و کاربر باز باید از بالا اسکرول کنه تا برسه محل جدول
تو رو خدا کمک کنید حلش کنم اینجوری خیلی بده
لطفا آدرس صفحه را جهت بررسی درج کنید یا فایل ها را به صورت فشرده شده به آدرس ایمیل سایت (موجود در بخش تماس) ارسال نمائید.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
4 × 3
20 × 20
=