PDA

View Full Version : سوال: مشکل در فرم لاگین



navidsa
سه شنبه 22 آذر 1390, 15:03 عصر
سلام خدمت همه من یه فرم لاگین ساختم ولی هی ارور میده
این اولین باری نیست که فرم لاگین میسازم/// ولین این یکی را حداقل ده بار تصصیح کردم ولی همون ارور قبلی

کد صفحه :



<?php

session_start();
$user = $_POST['user'];
$pass = $_POST['pass'];
$link = mysql_connect("localhost","root","");
$link = mysql_select_db('acc');
$query = mysql_query(" select * from `user` where user = $user and pass = $pass ");
$rows = mysql_fetch_array($query);

if($rows > 0)

{
header("location:sx.php");

}

else

{

print"error";
print"$query";
}

?>




این ارور را میده:



Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\login.php on line 9


یه صفحه دیگه هم ساختم برای نمایش اطلاعات :

کدش اینه ::





<html>
<meta charset="utf-8" content="text/html" />


<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table width="763" height="306" border="1" align="center">
<tr>
<td colspan="2" rowspan="4">



<table width="67%" border="1" >
<tr align="center" bold>
<td width="59%">مبلغ</td>
<td width="41%">شماره</td>
</tr>
<?php
$user = "ali";
$link = mysql_connect("localhost","root","");
$db = mysql_select_db('acc');
$query = "select talab where user = $user ";
$result = mysql_query($query);
while ( $row = mysql_fetch_array($result))
{
?>

<tr align="center">
<td><?php echo $row['id']; ?>;</td>
<td><?php echo $row['price']; ?></td>
</tr>

<?php
}
?>
</table>
</td>
<td width="119" height="29" align="center"><a href="bestankar.php">بستانکار</a></td>
</tr>
<tr>
<td height="23" align="center"><a href="sarmayeh.php">سرمایه</a></td>
</tr>
<tr>
<td height="23" align="center"><a href="bedehi.php">بدهی</a></td>
</tr>
<tr>
<td height="219" align="center"><p><a href="profile.php">سایر</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p></td>
</tr>
</table>





ولی باز هم ارور زیر:




Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\bestankar.php on line 25


ممنون میشم کمکم کنید

امیـرحسین
سه شنبه 22 آذر 1390, 15:32 عصر
جونم SQL Injection! یه نگاهی به این تابع حیاتی بنداز حتما: mysql_real_escape_string (http://www.php.net/manual/en/function.mysql-real-escape-string.php)
مشکل اینه که تابع mysql_query وقتی به خطا بخوره، FALSE برمیگردونه. قبل از اینکه query$ رو بخوای Fetch کنی، چک کن که FALSE نباشه. اگه FALSE بود مثلا خطاش رو چاپ کن که مشکل رو پیدا کنی.

navidsa
سه شنبه 22 آذر 1390, 15:41 عصر
اقا خواهش می کنم درستشون کنم / کشت منو و درست نشد /// از شما میخواهم یه کاری کنید که این کار کنه //
اگر میخواهید دیتابیس را هم براتون بفرستم

امیـرحسین
سه شنبه 22 آذر 1390, 16:31 عصر
اینو ببین:

<?php
session_start();
if($link = mysql_connect("localhost","root","")) {
mysql_select_db('acc');
$user = mysql_real_escape_string($_POST['user']);
$pass = mysql_real_escape_string($_POST['pass']);
$query = mysql_query("select * from `user` where user=$user and pass=$pass");
if($query){
$rows = mysql_fetch_array($query);
if($rows){
header("location:sx.php");
} else {
echo 'Wrong User or Pass';
}
} else {
echo 'Error: '.mysql_error();
}
} else {
echo 'Connection problem';
}
?>
کدت اصولا مشکل داره. اگه میخوای برای محیط واقعی استفاده کنی باید مشکلاتش رو برطرف کنی....

navidsa
سه شنبه 22 آذر 1390, 17:28 عصر
اقا درست شد//
از شما خواهش میکنم دومی را هم برام درست کنید///
یه پیج هست که 2 تا اطلاعات را از دیتبایس user جدول talab میگیره
یکی id و یکی price هست از شما ممنون میشم اینم برام درست کنید اخه خیلی کارم گیره /// توی بالا کدش را گذاشتم

MMSHFE
سه شنبه 22 آذر 1390, 17:45 عصر
با سلام، کد زیر رو امتحان کنید (با اجازه دوست خوبم جناب امیر حسین کدشون رو کمی دستکاری کردم) :


session_start();
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('acc') or die('Database does not exist');
$user = isset($_POST['user']) ? mysql_real_escape_string($_POST['user']) : '';
$pass = isset($_POST['pass']) ? mysql_real_escape_string($_POST['pass']) : '';
$query = mysql_query("SELECT * FROM `user` WHERE (`user`='{$user}' AND `pass`='{$pass}')");
if($query && mysql_num_rows($query) > 0) {
$row = mysql_fetch_assoc($query);
$_SESSION['login'] = $row['id'];
header('location: sx.php');
exit();
}
else {
if(isset($_SESSION['login'])) {
unset($_SESSION['login']);
}
echo 'Wrong User or Pass.<br/>'."\n";
echo '<a href="login.php">Try again!</a><br/>'."\n";
}

ببخشید که توی کد HTML نوشتم چون ادیتور PHP سایت خیلی بد نشون میده و تگهای BR رو هم حذف میکنه.
نکاتی که بهتره توجه ویژه ای بهشون داشته باشین:
1- اصول نوشتن دستورات SQL رو رعایت کنید. برای مثال، اسامی جداول، فیلدها و... رو توی گیومه برگشته (`) که کنار عدد 1 و بالای کلید TAB قرار داره، بگذارین و همچنین مقادیر رو توی گیومه تک بگذارین. این مورد خیلی مهمه. برای مثال، چون شما اون رو رعایت نکردین، قسمت AND و... که بعد از user$ گذاشتین هم جزو مقدار برای فیلد user چک خواهد شد و باعث میشه کل کوئری شما اشتباه بشه. ضمناً شرط WHERE رو داخل پرانتز بگذارین. این کار کمی (فقط کمی) امنیت رو درمقابل SQL Injection بالاتر میبره.
2- برای سهولت بیشتر، از ساختار or die برای کنترل خطا استفاده کنید.
3- حتی الأمکان پیغامهای خطای MySQL رو به کاربر نشون ندین چون ممکنه ازطریق اونها کمی با ساختار دیتابیس شما آشنایی پیدا کنه.
4- عادت کنید بعد از اینکه مطمئن شدین کوئری درسته، با mysql_num_rows ببینید آیا رکوردی هم برگردونده شده یا نه چون ممکنه کوئری درست باشه ولی هیچی بر نگردونه (هیچ رکوردی در شرایط WHERE صدق نکنه).
5- برای مدیریت بهتر حافظه، از mysql_fetch_assoc بجای mysql_fetch_array استفاده کنید.
6- اصلاً از Session استفاده ای نکرده بودین که من یک نمونه از استفاده از اون رو براتون توی کد گذاشتم.
7- بهتره وقتی به کاربر پیغام نام کاربری و رمز عبور اشتباه رو نشون میدین، یک لینک هم برای بازگشت به صفحه فرم در اختیارش بگذارین.
8- متغیرهای داخل رشته های محصور در گیومه جفت رو توی آکولاد قرار بدین. بخصوص درمورد آرایه ها این مورد رو حتماً رعایت کنید.
9- اگه قرار نیست توی رشته خودتون از متغیرها استفاده کنید، اون رو توی گیومه تک بگذارین. اینکار به دلیل اینکه رشته های داخل گیومه تک پردازش نمیشن، سرعت صفحاتتون رو زیاد میکنه.
10- عادت کنید بعد از توابع header برای جابجایی بین صفحات، از exit استفاده کنید تا اگه به هر دلیل تابع header نتونست اجرا بشه، بقیه اسکریپت هم اجرا نشه.
11- قبل از استفاده از مقادیری مثل آرایه های POST_$ و GET_$ با کمک isset مطمئن بشین که برای صفحه ارسال شده باشن.
اگه موردی از قلم افتاده، عذر میخوام و تقاضا میکنم بقیه دوستان اگه کاستی در توضیحاتم میبینند، تکمیلش کنن. شرمنده قصد جسارت ندارم. فقط احساس کردم ابتدای راه برنامه نویسی وب هستین و این توضیحات رو سودمند دونستم.
موفق باشید.

navidsa
سه شنبه 22 آذر 1390, 19:34 عصر
با تشکر از شما mmmshfe گرامی که حتی اسمتون را هم نمیدونم
خواهش میکنم دومی را هم کمکم کنید درست بشه ممنون میشم
ثواب داره

navidsa
پنج شنبه 24 آذر 1390, 16:35 عصر
خواهشا کمک کنید خیلی نیاز دارم

MMSHFE
جمعه 25 آذر 1390, 11:40 صبح
با سلام، حقیقتش نحوه طراحی صفحاتتون رو نمیدونستم ولی سعی کردم کدتون رو اصلاح کنم:


<!doctype html>
<html dir="rtl">
<head>
<title>Display Information</title>
<meta charset="utf-8"/>
</head>
<body>
<center>
<?php
mysql_connect('localhsot', 'root', '') or die('Connection error');
mysql_select_db('acc') or die('Database does not exist');
mysql_query('SET NAMES \'utf8\'');
$user = '';
if(isser($_GET['user']) && $_GET['user'] != '') {
$user = mysql_real_escape_string($_GET['user']);
}
$result = mysql_query("SELECT * FROM `talab` WHERE (`user`='{$user}'");
if($result && mysql_num_rows($result) > 0) {
?>
<table border="1px" height="306px" style="position: relative; top: 100px;" width="763px">
<tr align="center" valign="middle"><th width="10%">شماره</th><th width="50%">مبلغ</th><th colspan="4">عمليات</th></tr>
<?php
while($row = mysql_fetch_assoc($result)) {
?>
<tr align="center" valign="middle">
<td><?php echo $row['id']; ?></td>
<td><?php echo $row['price']; ?></td>
<td><a href="bestankar.php?id=<?php echo $row['id']; ?>">بستانکار</a></td>
<td><a href="sarmayeh.php?id=<?php echo $row['id']; ?>">سرمايه</a></td>
<td><a href="bedehi.php?id=<?php echo $row['id']; ?>">بدهي</a></td>
<td><a href="profile.php?id=<?php echo $row['id']; ?>">ساير</a></td>
</tr>
<?php
}
?>
</table>
<?php
}
else {
?>
<p style="position: relative; top: 100px;">اطلاعات موجود نيست</p>
<?php
}
?>
</center>
</body>
</html>
ضمناً مشکل اصلی کدتون، دستور SQL بود که نوشته بودین:
'{select talab where user = $user => SELECT * FROM `talab` WHERE `user`='{$user
موفق باشید.

attishpare
شنبه 24 دی 1390, 21:42 عصر
سلام منم مشکل دارم اما اصلا سورس برنامه ام این نسیت:(



<?php
include('include/connect.php');
session_start();
$user=mysql_escape_string($_POST['tuser']);
$pass=mysql_escape_string($_POST['tpass']);
$sql="SELECT * FROM admin WHERE user='$user' and pass='$pass';";
$res=mysql_query($sql)or die(mysql_error());
if(mysql_num_rows($res)==1)
{
$_SESSION['islogin']=1;
header('loginfals.php');
exit();
}else
{
header('manag.php');
exit();
}
?>

به نظر شما اینم درسته؟؟:گریه:

رضا قربانی
شنبه 24 دی 1390, 22:22 عصر
اگه موردی از قلم افتاده، عذر میخوام و تقاضا میکنم بقیه دوستان اگه کاستی در توضیحاتم میبینند، تکمیلش کنن:تشویق:



1- اصول نوشتن دستورات SQL رو رعایت کنید. برای مثال، اسامی جداول، فیلدها و... رو توی گیومه برگشته (`) که کنار عدد 1 و بالای کلید TAB قرار دارهعزیز اسمش امپرسنت هست :لبخند:
به کل بگید در دستورات sql وقتی با بانک سر و کار دارید .



حتی الأمکان پیغامهای خطای MySQL رو به کاربر نشون ندین چون ممکنه ازطریق اونها کمی با ساختار دیتابیس شما آشنایی پیدا کنه.
با این دستور در اول صفحه از نمایش کلیه خطاها جلوگیری می کنید :

error_reporting(0);

MMSHFE
یک شنبه 25 دی 1390, 12:42 عصر
دوست عزیز، کلاً به ' و ` در انگلیسی و علاوه بر اونها به @ و & در کامپیوتر Ampercent گفته میشه.
ضمناً اینکه گفتم خطاهای MySQL رو نشون ندین، منظورم این بود که از mysql_error توی خروجی نهایی استفاده نکنید. این مسئله ربطی به error_reporting نداره.
موفق باشید.