حفظ ورودی فیلد هنگام ارسال ناقص فرم php

در نوشته ی حفظ ورودی کاربر هنگام ارسال ناقص فرم php که مقدمه ی این مطلب بود به نیازسنجی این مسئله و توضیح کلی پرداختم که چرا باید ورودی کاربر حفظ شود و اگر بعد از ارسال ناقص یک فرم کلیه فیلد ها خالی شود و کاربر مجبور باشد دوباره همه ی فیلد ها را پر کند چه می شود و چطور باید پیشگیری کنیم را هم به صورت کلی گفتم.

در این نوشته به تشریح آن می پردازم. همانطور که گفتم راه حل برای این مشکل ایجاد فیلدهای فرم ثابت است که در آن از یک دستور شرطی برای استخراج ورودی کاربرد از داخل آرایه ی سوپرگلوبال $_POST استفاده می کنیم و در فیلدهای ورودی متنی و ناحیه ی متنی مخصوص کامنت نمایش می دهیم.

وقتی صفحه برای اولین بار لود می شود نباید چیزی در فیلدهای ورودی نمایش داده شود. ما میخواهیم فقط وقتی یک فیلد خالی ماند یا خطایی وجود داشت محتویات مجدد نمایش داده شوند. در حقیقط عنوانی که برای این مطلب انتخاب کردم اشتباه است، چون ورودی ها حفظ می شوند ، ما فقط میخواهیم آن ها را نمایش دهیم.

در آموزش پردازش فرم php کدی داشتیم برای پردازش فرم که اگر موردی خالی بود آن را به آرایه ی $missing اضافه می کرد ، جهت یاد آوری کد را مجدد درج می کنم

روش اصلی کار به این صورت است:

چنانچه آرایه های $missing و $errors دارای مقدار بود هرکدام از فیلد های درون آن را دوباره نمایش می دهیم.

همانطور که میدانید مقدار پیش فرض یک فیلد متنی با استفاده از خاصیت value در تگ <input> تعیین می شود. بنابراین برای نمایش مقداری که برای فیلد name وارد شده است باید تگ <input> برای name را به این صورت بنویسیم

تشریخ کد بالا : بعد از دستور شرطی که می گوید اگر $missing یا $errors دارای مقدار بود و true ارزیابی شد و این بدین معنی بود که فرم ناقص است کد درون بلاک اجرا شود. کد درون بلاک چیست ؟

ترکیبی از کوتیشن ها و نقطه هاست که ممکن است گیج کننده باشد. اولین چیزی که باید تشخیص دهید این است که تنها یک نقطه ویرگول ; وجود دارد و دقیقا در انتها جای گرفته. بنابر این دستور echo روی کل خط اعمال میشود و این بلاک کد را به انتهای تگ <input> اضافه می کند. یک نقطه هم قبل از تابع htmlentities وجود دارد که یک عملگر الحاقی است که رشته ها را به متغیر ها و توابع وصل می کند.

بقیه ی این بلاک شامل سه قسمت است :

  • ‘value=” ‘ .
  • htmlentities($name)
  • . ‘”‘

اولین قسمت value=” را به صورت متن در خروجی نمایش میدهد و از عملگر نقطه الحاقی برای وصل کردن به قسمت بعدی استفاده می کند

دومین قسمت $name را به تابع htmlentities میدهد که عملکردش را خواهم گفت

سومین قسمت از یک عملگر الحاقی برای وصل کردن به قسمت بعدی که شامل یک کوتیشن دوتایی است استفاده می کند. این کوتیشن دوتایی ” خودش درون دو کوتیشن منفرد ‘ قرار گرفته است.

متغیر $name از کجا سر و کله اش پیدا شده است ؟ این متغیر در حلقه ی foreach که در فایل پردازشگر processmail نوشته اید است که کد آن را در ابتدای این مطلب نوشتم. این متغیر از طریق آرایه $_POST ایجاد شده است و حاوی ورودی ورودی کاربر است. حلقه ی foreach آرایه $_POST را پردازش کرده و هر عنصر را به یک متغیر با نام مشابه نسبت می دهد. با این کار شما اجازه دسترسی به  __$POST[‘name] از طریق یک متغیر آسان $name را می دهد.

این متغیر را به تابع htmlentities داده ایم. عمرکرد این تابع این است که کاراکتر های خاص را به معادل آن در html تبدیل می کند. موردی که ما با آن کار داریم کوتیشن های دوتایی است. فرض کنید که مقدار وارد شده ی کاربر خود شامل ” باشد. اگر از تابع htmlentities استفاده نکنیم و کاربر هم مقداری که حاوی ” است را وارد کرده باشد دچار مشکل می شویم. وق قسمتی از ورودی کاربر حذف می شود.

اما دادن محتویات آرایه $_POST به htmlentities() باعث میشود کوتیشن های دوتایی در میانه رشته به $quot; که یک کاراکتر فرار است تبدیل شود و در هنگام نمایش ورودی کاربر مشکلی وجود نداشته باشد. نکته جالب درباره ی $quot; این است که وقتی فرم ارسال می شود دوباره به کوتیشن مارک دوتایی تبدیل می شود و به عنوان نتیجه نیازی نیست قبل از ارسال ایمیل کار تبدیل مجدد انجام شود.

لازم به ذکر است که این تابع قبل از ورژن php 5.4 از western eruopean ISO-8859-1 برای انکد پیشفرض استفاده می کرد اما از php 5.4 به بعد به utf-8 تغییر کرده است. در php 5.6 به مقدار charset پیشفرض پیکربندی php تغییر کرده است که این تاثیر چندانی ندارد زیرا utf-8 مقدار پیشفرض است. اما اگر نیازمندی خاصی دارید باید خودتان انکد پیشفرض را با دادن آرگومان های دوم و سوم به این تابع مشخص کنید.

خب فیلد name را در صورت خالی بودن فیلد یا ارور پس از لود شدن مجدد فرم نمایش دادیم.

نوبت رسیده است به فیلد email که روشی مشابه دارد. تنها از $email به جای $name استفاده می کنیم.

مورد سوم که اگر فرمی ناقص پر شد باید آن را در مجدد نمایش دهیم تا از دست نرود comment است که کمی با دو مورد قبل متفاوت است

ناحیه متنی کامنت باید اندکی متفاوت اداره شود زیرا تگ <textarea> دارای خاصیت value نیست. شما باید بلاک کد را بین تگ های باز و بسته ناحیه متنی قرار دهید

مهم است تگ های باز و بسته php را در جلوی تگ های باز و بسته ی <textarea> قرار دهیم تا فاصله سفید ناخواسته ایجاد نشود.

نکته : استفاده از این تکنیک مانع میشود تا دکمه reset فرم php فیلدهای که توسط اسکریپت تغییر داده شده اند را پاک کند البته در مقایسه با مشکلی که این روش حل کرده عیبی ندارد. ضمنا کمتر پیش می آید در هنگامی که یک فرم اشتباه پر شده یا خطا داده از reset استفاده شود و reset فرم در اولین مرتبه لود شدن به خوبی باید کار کند

پس کد کلی فرم ما برای حفظ ورودی کاربر هنگام خطا یا خالی ماندن یک فیلد به این شکل شد :

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

12 − نه =