PDA

View Full Version : سوال: ساخت یک فرم ساده و خطای Undefined index



moslem_f
شنبه 22 تیر 1392, 21:27 عصر
سلام عرض ادب و خسته نباشید یک فرم ساده طراحی کردم در خط 26 و 27 خطا دریافت می کنم این دو سطر مربوط میشن به کد های

$username = $_POST['username'];
$password = $_POST['password'];
و این خطا رو میدن

Notice: Undefined index: username in C:\wamp\www\php10\tamrin_19.php on line 26

Notice: Undefined index: password in C:\wamp\www\php10\tamrin_19.php on line 27
و کل کد هایی که من برای این فرم نوشتم هم در زیر قرار دادم لطفا در صورت امکان راهنمایی بفرمایید این خطا به چه علت رخ داده و برای حل این مشکل باید چه کرد با تشکر.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Expires" content="Fri, Jan 01 1900 00:00:00 GMT">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Lang" content="en">
<meta name="author" content="">
<meta http-equiv="Reply-to" content="@.com">
<meta name="generator" content="PhpED 5.8">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="creation-date" content="01/01/2009">
<meta name="revisit-after" content="15 days">
<title>Untitled</title>
<link rel="stylesheet" type="text/css" href="my.css">
</head>
<body>
<form name="loginform" method="post">
نام کاربری : <input name="username" type="text" /><br />
رمز ورود : <input name="password" type="password" /><br />
<input type="submit" name="submit" value="submit" />
</form>
<?php
$username = $_POST['username'];
$password = $_POST['password'];
/*
var_dump(!empty($username));
var_dump(!empty($password));
var_dump(isset($username));
var_dump(isset($password));
*/
if (!empty($password) AND !empty($username))
{

echo 'نام کاربری وارد شده = '.$username;
echo '<hr />';
echo 'رمز ورود وارد شده برابر است با = '.$password;
}
elseif (isset($password) OR isset($username))
{

echo 'لطفا فیلدهای مورد اشاره را تکمیل نمایید';
}
?>
</body>
</html>



ارادتمند : مسلم فلاح نیت

AliRezaPro
شنبه 22 تیر 1392, 21:53 عصر
باید شرط بزارید که بعد از پست بک شدن شما به مقدار دسترسی داشته باشی

if(isset($_POST['username']))
{
echo $_POST['username'];
}

ابوذر محمودی
شنبه 22 تیر 1392, 21:56 عصر
<?php
if(isset($_POST["submit"]))
{
$username = $_POST['username'];
$password = $_POST['password'];
/*
var_dump(!empty($username));
var_dump(!empty($password));
var_dump(isset($username));
var_dump(isset($password));
*/
if (!empty($password) AND !empty($username))
{

echo 'نام کاربری وارد شده = '.$username;
echo '<hr />';
echo 'رمز ورود وارد شده برابر است با = '.$password;
}
elseif (isset($password) OR isset($username))
{

echo 'لطفا فیلدهای مورد اشاره را تکمیل نمایید';
}
}
?>

ابوذر محمودی
شنبه 22 تیر 1392, 22:18 عصر
$username و پسوردتون با اطلاعات ارسالی توسط متد پست مقدار دهی میشن ، یعنی تا اطلاعاتو نفرستی مقدار دهی نمیشن ، واسه همین پیغام میده چون هیچی بهش ارسال نشده.
شما باید قبلش با isset تست کنی ببینی مقداردهی شدن یا نه.

moslem_f
شنبه 22 تیر 1392, 23:40 عصر
isset نگاه نمی کنه ببینه مقدار دارن یا نه شما زمانی که داخل فرم از سابمیت برای ارسال مقادیر استفاده کرده باشی حتی اگر شرطی مبنی بر ست شدن هم گذاشته باشی باز هم عملی که در براکت ها نوشته شده انجام میشن چون با فشردن دکمه فرم اون متغیر ها ست میشن به خودی خود هر چند مقدار خالی داشته باشه اگر اشتباه گفتم بگید تا بدونم با تشکر.
ارادتمند : مسلم فلاح نیت

moslem_f
یک شنبه 23 تیر 1392, 02:24 صبح
البته این طوری هم میشه


if (isset($_POST['btnsubmit']) AND !empty($_POST['username']) AND !empty($_POST['password']))
{
echo 'نام کاربری وارد شده = '.$_POST['username'].'<hr />'.'رمز ورود وارد شده برابر است با = '.$_POST['password'];
}
elseif(isset($_POST['btnsubmit']))
{
echo 'لطفا فیلدهای مورد اشاره را تکمیل نمایید';
}

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

MMSHFE
یک شنبه 23 تیر 1392, 08:46 صبح
البته یک نکته دیگه هم بد نیست گفته بشه:
empty اگه مقدار صفر یا false یا رشته خالی ارسال بشه، باز هم خالی درنظر میگیره و true بر میگردونه. بهتره اینطوری بنویسید:


if(isset($_POST['btnsubmit']) && $_POST['btnsubmit'] !== '') {
// Do your stuff
}

موفق باشید.

MMSHFE
یک شنبه 23 تیر 1392, 08:53 صبح
البته من برای راحتی کارم، تابع زیر رو نوشتم که توی پروژه های خودم ازش استفاده میکنم:


<?php
function Posted() {
$result = true;
$values = func_get_args();
if(count($values) == 0) {
return false;
}
else {
foreach($values as $value) {
if(!isset($_POST[$value]) || $_POST[$value] === '') {
$result = false;
break;
}
}
}
return $result;
}
?>

مثال از نحوه استفاده:


if(Posted('username', 'password')) {
// do your stuff here
}

moslem_f
یک شنبه 23 تیر 1392, 16:53 عصر
سلام عرض ادب و خسته نباشید جناب شهرکی میشه در مورد این func_get_args() فانکشن بگید کارش چی هست با تشکر.
ارادتمند : مسلم فلاح نیت

moslem_f
دوشنبه 24 تیر 1392, 01:31 صبح
البته یک نکته دیگه هم بد نیست گفته بشه:
empty اگه مقدار صفر یا false یا رشته خالی ارسال بشه، باز هم خالی درنظر میگیره و true بر میگردونه. بهتره اینطوری بنویسید:


if(isset($_POST['btnsubmit']) && $_POST['btnsubmit'] !== '') {
// Do your stuff
}

موفق باشید.


!empty چی جناب شهرکی !empty هم همین کاری که شما عرض کردین رو می کنه درسته به نظرتون بهینه تر نیست یعنی کوتاه تر نیست البته جسارت نباشه منتظر پاسخ شماهستم با تشکر.
ارادتمند : مسلم فلاح نیت

cpuram
دوشنبه 24 تیر 1392, 02:38 صبح
استفاده از NULL از '' خالی نیست؟

moslem_f
دوشنبه 24 تیر 1392, 03:19 صبح
متوجه منظور شما نشدم میشه بیشتر توضیح بدین با تشکر

MMSHFE
دوشنبه 24 تیر 1392, 08:57 صبح
!empty چی جناب شهرکی !empty هم همین کاری که شما عرض کردین رو می کنه درسته به نظرتون بهینه تر نیست یعنی کوتاه تر نیست البته جسارت نباشه منتظر پاسخ شماهستم با تشکر.
ارادتمند : مسلم فلاح نیت
نه empty این کاری که من کردم رو انجام نمیده. شما اگه توی یک فیلد فرم، عدد 0 بگذارین و فرم رو submit کنید، خواهید دید که empty نتیجه true میده (میگه این عنصر خالیه) درحالی که واقعاً خالی نیست.

MMSHFE
دوشنبه 24 تیر 1392, 08:58 صبح
سلام عرض ادب و خسته نباشید جناب شهرکی میشه در مورد این func_get_args() فانکشن بگید کارش چی هست با تشکر.
ارادتمند : مسلم فلاح نیت
پارامترهایی که برای یک تابع ارسال شدن رو بصورت آرایه برمیگردونه. با کمک این تابع، میشه حالت Function Overload رو در PHP شبیه سازی کرد.

MMSHFE
دوشنبه 24 تیر 1392, 08:59 صبح
استفاده از NULL از '' خالی نیست؟
وقتی از === استفاده میکنیم، NULL با '' فرق میکنه. '' یعنی یک رشته خالی، NULL یعنی هیچی. اگه بخوام با مثال بگم، '' یعنی یک بشقاب داریم که توش هیچی نیست، NULL یعنی همون بشقاب رو هم نداریم.

moslem_f
دوشنبه 24 تیر 1392, 12:22 عصر
پارامترهایی که برای یک تابع ارسال شدن رو بصورت آرایه برمیگردونه. با کمک این تابع، میشه حالت Function Overload رو در PHP شبیه سازی کرد.

ممنونم جناب شهرکی اما متاسفانه من تازه وارد هستم و نمیدونم Function Overload چی هست در مورد کدی که شما فرمودین بهتر نیست این طوری نوشته بشه چون به نظرم کوتاه تره یعنی بهینه تره چون اگر بخوایم چک کنیم این variable ست شده بعد مقدار مخالف خالی باشه کاربر اجازه ارسال داشته باشه دو یا چندین باکس داشته باشیم طولانی میشه به نظر شما این کدی که من دادم بهتره یا مشکل داره ؟


if(!empty($_POST['username']) AND !empty($_POST['password']))


if(isset($_POST['btnsubmit']) && $_POST['btnsubmit'] !== '') { // Do your stuff}
وقتی من می خوام دو تا باکس یا چندین باکس رو چک کنم که کاربر خالی دکمه ثابمیت رو فشار نداده باشه برای ارسال اطلاعات آیا روش شما طولانی تر از این کد نیست

در مورد این هم

<?php function Posted() { $result = true; $values = func_get_args(); if(count($values) == 0) { return false; } else { foreach($values as $value) { if(!isset($_POST[$value]) || $_POST[$value] === '') { $result = false; break; } } } return $result; }




if(Posted('username', 'password')) { // do your stuff here}
?>



کمی نیاز به توضیح دارم خواهش می کنم در صورت امکان بگید اولین متغیر بابت چی قرار داده شده که یک مقدار بولین گرفته و این که تو شرط گفتین اگر مقدار variable valuses برابر با 0 بود return کن false آیا این false return کردن برابر با همون پیغام خطا در ورود اطلاعات خطا در خالی بودن باکس ها محسوب میشه یا خیر ؟ بعد هم یه حلقه foreach قرار داده شده برای پیشمایش آرایه که values رو فرمودین پارماتر های تابع رو بر می گردونه و زمانی که ما تابعمون آرگونان نداره با این function که دادین func_get_args() این پارامتر های مارو به عنوان آرگومان در نظر می گیره و میاره داخل variable values و foreach values as value خب مقادیر رو در هر بار چرخش میریزه داخل variable value و داخل $_POST[$value] نقش ===' ' چیه و همچنین متغیر $result = false; که مقدار بولین گرفته و همچین break; ممنون میشم توضیح بیشتری بدین تا ما تازه وارد ها از اساتید بزرگی چون شما استفاده ببریم با تشکر.
ارادتمند : مسلم فلاح نیت

در مورد این دوست عزیزمون هم متوجه منظورشون نشدم یعنی چی استفاده از NULL از '' خالی نیست؟میشه بیشتر توضیح بدین چون اصلا متوجه نشدم چیه منظورشون و ذهنمو بد جور در گیر کرده

MMSHFE
دوشنبه 24 تیر 1392, 12:40 عصر
ببینید، هر کدی که کوتاهتر بود، الزاماً بهینه تر نیست. مثلاً اگه توی کادر پسورد الآن شما صفر وارد کنید و فرم رو submit کنید، empty نتیجه true میده و انگار که چیزی ارسال نشده و این یک خطا هست چون شاید یکی دوست داشته باشه رمزش رو صفر بگذاره (فقط درمورد رمز نیست، همه فیلدها این خاصیت رو دارن - مثل مبلغ اعتبار اولیه). ضمناً شما یکبار تابع رو مینویسین و میتونید توی یک فایل جداگانه بگذارین و با ضمیمه کردن اون فایل، هزاران بار توی پروژه ازش استفاده کنید. یعنی اون چیزی که مدام توی کد داره تکرار میشه، این بخش هست:

if(Posted('username', 'password')) {
حالا کد بالایی کوتاهتره یا کد شما؟

if(!empty($_POST['username']) && !empty($_POST['password'])) {
نکته: احتمال خطاهایی که empty ممکنه پیش بیاره و قبلاً توضیح دادم رو نادیده بگیرین و فقط بگین کدوم خلاصه تره؟

MMSHFE
دوشنبه 24 تیر 1392, 12:48 عصر
اما درمورد این تابع:


<?php
function Posted() {
$result = true;
$values = func_get_args();
if(count($values) == 0) {
return false;
}
else {
foreach($values as $value) {
if(!isset($_POST[$value]) || $_POST[$value] === '') {
$result = false;
break;
}
}
}
return $result;
}
?>

این تابع ابتدا پارامترهایی که براش ارسال شدن رو با func_get_args بصورت آرایه در میاره. حالا اگه تعداد خونه های این آرایه صفر بود (هیچ پارامتری ارسال نشده باشه)، false برمیگردونه و از تابع میره بیرون. اما اگه اینطور نباشه، تمام مقادیر آرایه رو یکی یکی چک میکنه که با روش post ارسال شده باشن و ضمناً خالی هم نباشن (دقیقاً یک رشته خالی نباشن و بخاطر استفاده از === بین صفر و false و '' فرق میگذاره). حالا اگه هرکدوم از مقادیری که توسط پارامتر به تابع گفته شده، با post ارسال نشده باشه یا خالی ارسال شده باشه، result$ میشه false و با ;break از حلقه foreach میاد بیرون چون دیگه دلیلی نداره بقیه رو چک کنیم و همین یکی که ارسال نشده یا خالی ارسال شده، برای عدم اعتبار فرم کافیه. در پایان هم result$ برگردونده میشه.
الآن از این تابع میشه اینطوری استفاده کرد (چند مثال) :


if(Posted('username', 'password')) { // code }
if(Posted('username', 'password', 'name', 'family')) { // code }
if(Posted('choice')) { // code }
if(Posted()) { // code }

میبینید که این تابع دیگه به تعداد پارامتر وابسته نیست و برحسب تعداد پارامتر، میتونیم کاربردهای مختلفی ازش بگیریم (مثل همون وضعیت اول که اگه بدون پارامتر صداش زدیم، فوری بیاد بیرون و false برگردونه). به این وضعیت که یک تابع، برحسب پارامترهای ورودی خودش، بتونه پیاده سازیها و نتایج متفاوتی داشته باشه، میگن Function Overloading یعنی سربارگذاری تابع

moslem_f
دوشنبه 24 تیر 1392, 13:11 عصر
ببینید، هر کدی که کوتاهتر بود، الزاماً بهینه تر نیست. مثلاً اگه توی کادر پسورد الآن شما صفر وارد کنید و فرم رو submit کنید، empty نتیجه true میده و انگار که چیزی ارسال نشده و این یک خطا هست چون شاید یکی دوست داشته باشه رمزش رو صفر بگذاره (فقط درمورد رمز نیست، همه فیلدها این خاصیت رو دارن - مثل مبلغ اعتبار اولیه). ضمناً شما یکبار تابع رو مینویسین و میتونید توی یک فایل جداگانه بگذارین و با ضمیمه کردن اون فایل، هزاران بار توی پروژه ازش استفاده کنید. یعنی اون چیزی که مدام توی کد داره تکرار میشه، این بخش هست:

if(Posted('username', 'password')) {
حالا کد بالایی کوتاهتره یا کد شما؟

if(!empty($_POST['username']) && !empty($_POST['password'])) {
نکته: احتمال خطاهایی که empty ممکنه پیش بیاره و قبلاً توضیح دادم رو نادیده بگیرین و فقط بگین کدوم خلاصه تره؟


خب استاد اولی بهینه تره دیگه :D ! الان تازه متوجه منظور شما شدم وقتی رفتم و 0 رو در فیلد وارد کردم دیدم بله از true به true تلقی شد باز هم تازه فهمیدم شما چی عرض می کردین اما هنوز در مورد فانشکنه مشکل دارم باید روش فکر بیشتری بکنم ممنونم و این که الان چرا شما برای فراخانی فانکشن داخل شرط فراخانی کردینش ؟ با تشکر.
این هم برام قابل درک نیست
$_POST[$value] === ''
ارادتمند : مسلم فلاح نیت

moslem_f
دوشنبه 24 تیر 1392, 13:16 عصر
فکر می کنم دلیلش این بوده اگر این فانکشن وجود داشت کد های داخل براکت های شرط رو اجرا کن یا اگر فرمی وجود داشت که چنین نام هایی داشت که با متود پست بود فرم یا اشتباه عرض می کنم ؟

MMSHFE
دوشنبه 24 تیر 1392, 15:31 عصر
نه بحث وجود داشتن تابع نیست. بحث اینه که این تابع، یکسری پارامتر میگیره و اگه به شکل صحیح ارسال شده باشن (با روش post)، نتیجه true و درغیر اینصورت نتیجه false میده و بخاطر همین، از خود تابع بعنوان شرط استفاده کردیم یعنی اگه نتیجه این تابع با پارامترهایی که گفتیم، true بود، دستورات پردازش فرم اجرا بشه و درغیر اینصورت، اگه خواستیم، پیغام خطای مناسب رو نشون بدیم. اون === هم یعنی اگه دقیقاً یک رشته خالی وارد شده باشه. توی PHP وقتی میگیم == فقط مقدار رو چک میکنه و از نظر این عملگر، 0 با 0.0 و false و '' و null یکیه ولی وقتی میگیم === اونوقت این مقادیر با هم فرق دارن چون درسته هم معادل صفر هستن ولی نوعشون فرق میکنه و از اونجا که عملگر === علاوه بر مقدار، نوع متغیرها رو هم بررسی میکنه، درنتیجه فقط وقتی نتیجه true میده که دقیقاً یک رشته خالی وارد شده باشه.