PDA

View Full Version : سوال: view state در php



alismith
پنج شنبه 12 خرداد 1390, 15:29 عصر
سلام دوستان
من یه سوال درباره نحوه حفظ اطلاعاتی که در فرم به وسیله کاربر پر میشه دارم و می خوام بدونم که چطوری باید این استراتژی رو پیاده کرد که اگه یک فیلد از فیلدهای موجود در فرم توسط کاربر به اشتباه پر شد یا خالی موند و ما خواستیم پیغام خطا چاپ کنیم مقادیر فرم که توسط کاربر پر شده باقی بمانند
توجه داشته باشید می خوام بدونم این کار توسط خود php و بدون استفاده از Ajax و Json چگونه انجام پذیر هستش و یه چی دیگه اگه صفحه مقصد همون صفحه جاری باشه چطور باید عمل کرد و اگه در یه صفحه دیگه بود و با action آدرس دهی کرده باشیم چطور.
اگر ممکنه، هر روشی را که منطقی می دانید و معرفی می کنید لطفا با یک مثال کامل باشه


با تشکر

colors
پنج شنبه 12 خرداد 1390, 16:59 عصر
درود
(قبلا بحث شده بود )
پیشنهاد میکنم با استفاده از روش زیر بعد از رفرش شدن صفحه ( در صورتی که مقادیر را به صورت اشتباه وارد کرده باشه و بازم برگرده به فرم ) مقادیری را که کاربر در فرم وارد کرده همچنان وجود داشته باشه.
بیشتر با توابع کار میکنیم که کنترل کد برایمان ساده باشد.
کد زیر را در نظر بگیرید

<html>
<head>
<title>
Persisting user data
</title>
</head>

<body>
<h1>Persisting user data</h1>
<?php
$errors_array = array();

if(isset($_REQUEST["welcome_already_seen"])){
check_data();
if(count($errors_array) != 0){
show_errors();
show_welcome();
} else {
handle_data();
}
}
else {
show_welcome();
}

function check_data()
{
global $errors_array;

if($_REQUEST["first"] == "") {
$errors_array[] = "<font color='red'>Enter your first name</font>";
}
if($_REQUEST["last"] == "") {
$errors_array[] = "<font color='red'>Enter your last name</font>";
}
}

function show_errors()
{
global $errors_array;

foreach ($errors_array as $err){
echo $err, "";
}
}

function handle_data()
{
echo "Here is your first name: ";
echo $_REQUEST["first"];
echo "Here is your first name: ";
echo $_REQUEST["last"];
}

function show_welcome()
{
$first_name = isset($_REQUEST["first"]) ? $_REQUEST["first"] : "";
$last_name = isset($_REQUEST["last"]) ? $_REQUEST["last"] : "";
echo "<form method='post'>";
echo "Enter your first name: ";
echo "<input name='first' type='text' value='", $first_name, "'>";
echo "";
echo "";
echo "Enter your last name: ";
echo "<input name='last' type='text' value='", $last_name, "'>";
echo "";
echo "";
echo "<input type='submit' value='Submit'>";
echo "<input type=hidden name='welcome_already_seen'
value='already_seen'>";
echo "</form>";
}
?>
</body>
</html>



اول متغیر $errors_array برابر یک آرایه قرار دادیم.
بعد توسط خط


if(isset($_REQUEST["welcome_already_seen"])){

بررسی میکنیم که فیلد پنهان welcome_already_seen مقداری داشته باشد( که همیشه دارد ) در این صورت تابع
check_data(); فراخوانی میشود که دارای محتویات زیر است

function check_data()
{
global $errors_array;

if($_REQUEST["first"] == "") {
$errors_array[] = "<font color='red'>Enter your first name</font>";
}
if($_REQUEST["last"] == "") {
$errors_array[] = "<font color='red'>Enter your last name</font>";
}



در داخل این تابع بررسی میکنیم که اگر فیلدهای فیلد های first name و last name برابر یک رشته خالی بودند به آرایه ی errors_array عناصری با مقدارهای مناسب برای first name و last name بده

ادامه بررسی خط CODE]if(isset($_REQUEST["welcome_already_seen"])){[/CODE] بعد از اجرای تابع check_data یک شرط تعریف میکنیم که اگر آرایه errors_array عنصری داشت توابع
show_errors و show_welcome فراخوانی شود در غیر این صورت اگر آرایه errors_array هیچ عنصری نداشت تابع handle_data فراخوانی شود.

تحلیل تابع show_errors :
آرایه errors_arrayرا توسط لغت کیدی global مورد دست یابی قرار می دهیم
بعد توسط حلقه foreach روی عناصر آرایه حلقه ایجاد کرده و هربار یکی از عناصر آنرا فرواخوانی میکنیم.

تحلیل تابع show_welcome :
در دو خط اول دو متغیر تعریف کرده و آنها را به ترتیب برابر مقدارهای کادرهای first name و last name قرار میدهیم و توسط عملگر سه تایی بررسی میکنیم که اگر کاربر در فیلدهای first name و last name مقداری وارد کرده بود آنها را برابر متغیر ها قرار بده در غیر این صورت یک رشته خالی را انتساب می دهیم.
و کد زیر که عملکردش واضح است

echo "<form method='post'>";
echo "Enter your first name: ";
echo "<input name='first' type='text' value='", $first_name, "'>";
echo "";
echo "";
echo "Enter your last name: ";
echo "<input name='last' type='text' value='", $last_name, "'>";
echo "";
echo "";
echo "<input type='submit' value='Submit'>";
echo "<input type=hidden name='welcome_already_seen'
value='already_seen'>";
echo "</form>";



اجرا می شود -- دقت کنید که به صفت value فیلدهای first name و last name متغییر های که در اول کد تابع فراخوانی کریدم مقدار می دهیم تا اگر قبلا مقداری وارد کرده بود و صفحه رفرش شد مقدارهای قبلی را حفظ کند

تحلیل تابع handle_data :
این تابع هم عملکرد واضحی داره

echo "Here is your first name: ";
echo $_REQUEST["first"];
echo "Here is your first name: ";
echo $_REQUEST["last"];



دادههای کاربر رو میگیره و نمایش میده


ببخشید که نتونستم زیاد واضح توضیح بدم.
سوالی بود در خدمتم
موفق باشید

alismith
پنج شنبه 12 خرداد 1390, 19:02 عصر
سلام
خیلی ممنون از جوابی که دادید
اما اگه ما مجبور باشیم حتما این اطلاعات رو به یه صفحه دیگه بفرستیم و از action استفاده کنیم چطور باید عمل کنیم ؟ مثلا:



$first_name = isset($_REQUEST["first"]) ? $_REQUEST["first"] : "";
$last_name = isset($_REQUEST["last"]) ? $_REQUEST["last"] : "";


شما اینجا دو تا متغییر رو با مقادیر ارسالی کاربر مقدار دهی کردید و به فیلدهای مربوطه نسبت دادید
اما اگه این کار در یه صفحه دیگه انجام بشه چطور باید این متغییر ها رو به صفحه مبدا پاس بدیم و پیام خطایی که در صفحه مقصد به وجود اومده رو در صفحه مبدا نمایش بدیم؟


با تشکر

colors
پنج شنبه 12 خرداد 1390, 21:48 عصر
درود

بازم میتونید از یه فرم با دو input و صفت type=hidden استفاده کنید و متغییرهای بالارو برابر صفت value آنها قرار بدید.

alismith
جمعه 13 خرداد 1390, 11:05 صبح
سلام دوست عزیز
من منظورم اینکه اگه ما این مقادیر رو با مثلا REQUEST یا POST فرستادیم به صفحه ACTION و این توابع در اون صفحه اجرا شدند و متوجه شدیم که فیلد اول باید دوباره پر بشه و دراین حالت مجبور شدیم به صفحه قبل برگردیم و فرم رو دوباره نمایش بدیم چطور مقدار فیلد دوم که درست پرشده بود رو به صفحه مبدا بفرستیم تا دوباره نمایش داده بشه
کلا یه همچین چیزی امکان پذیر هستش ، منظورم ارسال متغییری که در صفحه مقصد تنظیم و مقدار دهی شده ، و دریافت و نمایش اون در یک تگ html در صفحه مبدا

با تشکر

colors
جمعه 13 خرداد 1390, 11:30 صبح
درود

دوست من کدی که بالا نوشتم این عمل رو انجام میده. تست نکردید؟

alismith
جمعه 13 خرداد 1390, 13:46 عصر
سلام

آقا ممنون از کدی که گذاشتید اما اینجا شما فرم رو تو همین صفحه جاری چک می کنید ، اگه میشه یه مثال با action بذارید که فرم و کدها هر کدوم تو دو تا صفحه جدا از هم باشه



با تشکر

proSPY
سه شنبه 01 شهریور 1390, 18:03 عصر
سلام
هر کاری شدنیه!
از session ها استفاده کنید ، با این توضیح که بعد از ارسال مقادیر ، اونهارو در session قرار بدید ودر صفحه اول اگر خطایی بود در فیلد های مربوطه بریزید.