PDA

View Full Version : تکراری نبودن نام کاربری



زینب فاطمی
پنج شنبه 27 آذر 1393, 14:05 عصر
سلام
از کد زیر برای ثبت اطلاعات و تکراری نبودن کاربر استفاده میکنم ولی نام کاربری تکراری رو ثبت میکنه . البته وقتی تو دیتابیس نام کاربری رو unique میدم پیام عدم ثبت میده ولی میخوام بدونم اشکال کار کجاست .


<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include "config.php";
$username=$_POST['username'];
$password=$_POST['password'];

$password=generateHash($password);
$mo=0;
$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
foreach($sth as $row) { $mo = $row['username'];
} if ($mo>=1){ die(" این نام قبلاً ثبت نام شده است. ");
}

$query="insert into user (username,password) values (:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password
)) or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";

function generateHash($password){
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
$salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
return crypt($password,$salt);
}
}
?>

H:Shojaei
پنج شنبه 27 آذر 1393, 14:46 عصر
سلام...
قسمت درج کاربر جدید رو داخل هیچ شرطی نذاشتید خوب معلومه تکراری باشه یا نباشه درج میشه...
باید اون insert رو داخل یه شرط بذارید که چک میکنه یه نام کاربری به این نام وجود داره یا نه اگر اون نام کاربریه وجود نداشت بیاد این رو درج کنه وگر نه پیغام خطا بده...

زینب فاطمی
پنج شنبه 27 آذر 1393, 15:51 عصر
ممنون . یه else گذاشتم درست نشد

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include "config.php";
$username=$_POST['username'];
$password=$_POST['password'];

$password=generateHash($password);
$mo=0;
$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
foreach($sth as $row) { $mo = $row['username'];
} if ($mo>=1){ die(" این نام قبلاً ثبت نام شده است. ");
} else{

$query="insert into user (username,password) values (:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password
)) or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";
}
function generateHash($password){
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
$salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
return crypt($password,$salt);
}
}
?>

Mohammadsgh
پنج شنبه 27 آذر 1393, 16:02 عصر
زیر سلکتتون با متد rowcount چک کنید اگه بزرگتر از 0 بود یعنی وجود داره

زینب فاطمی
پنج شنبه 27 آذر 1393, 16:07 عصر
منظورتون اینه که این نحوه ایراد داره ؟ اینو جایگزین اون قسمت کنم ؟


$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$count = $sth-> rowCount();
if ($count>1){ die(" این نام قبلاً ثبت نام شده است. ");
} else{

زینب فاطمی
پنج شنبه 27 آذر 1393, 18:24 عصر
لطفا یکی جواب بده .

H:Shojaei
پنج شنبه 27 آذر 1393, 18:48 عصر
شما باید قبل این که رکورد جدید وارد کنید یه شرط رو چک کنید ببینید همچین رکوردی وجود داره یا نه حالا چطور؟
یه select با شرط username=$username میزنید بعد rowCount اون رو میگیرید اگه بزرگتر از 1 بود مقدار برگشتی پس همچین نام کاربری قبلا ثبت شده و نباید دیگه ثبت بشه و بهش اخطار میدیم...
اینم روش گرفتن اون rowCount با pdo:
http://php.net/manual/en/pdostatement.rowcount.php

زینب فاطمی
پنج شنبه 27 آذر 1393, 19:19 عصر
خب من تو پست دوم قبل insert شرط گذاشتم و چک کردم پس چرا جواب نداد ؟

$mo=0; $sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username"); $sth->bindvalue(":username",$username); $sth->execute(); foreach($sth as $row) { $mo = $row['username']; } if ($mo>=1){ die(" این نام قبلاً ثبت نام شده است. "); } else{

H:Shojaei
پنج شنبه 27 آذر 1393, 19:41 عصر
آها ببخشید من ندیدم اون رو..
خوب شرطی که گذاشتید اشتباست
کلا $count رو باید چک کنید که 0 هست یا نه از 0 بزرگتره اگه صفر بود یعنی این کاربر قابل ثبته اگه بزرگتر از صفر بود دیگه نباید کاربر درج بشه...


if($count>0)
{
echo'این کاربر ثبت شده';
}
else
{
//insert here
}

زینب فاطمی
پنج شنبه 27 آذر 1393, 20:28 عصر
من که متغیر countندارم ! اون کوئری هم درسته پس چرا عمل نمیکنه ؟ اگر براتون ممکنه تست کنید:
این کد html

<form action="save.php" method="post">
<p>
<label>Username:</label>
<input type="text" required="required" name="username" />
</p>
<p>
<label>Password:</label>
<input type="password" required="required" name="password" />
</p>
<p>
<input type="submit" value="Send" />
</p>
</form>

این کد save.php

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include "config.php";
$username=$_POST['username'];
$password=$_POST['password'];

$password=generateHash($password);

$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
foreach($sth as $row) { $mo = $row['username'];
} if ($mo>=1){ die(" این نام قبلاً ثبت نام شده است. ");
} else{

$query="insert into user (username,password) values (:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password
)) or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";
}
function generateHash($password){
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
$salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
return crypt($password,$salt);
}
}
?>

beh3000
پنج شنبه 27 آذر 1393, 21:03 عصر
کوئری تون رو به این شکل تست کنید



$get = select * from user where user=:user ...
if (count($get)>0)
echo 'user tekrari';
else
{
insert query ...
.
.
.
}

H:Shojaei
پنج شنبه 27 آذر 1393, 21:19 عصر
منظورتون اینه که این نحوه ایراد داره ؟ اینو جایگزین اون قسمت کنم ؟


$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$count = $sth-> rowCount();
if ($count>1){ die(" این نام قبلاً ثبت نام شده است. ");
} else{


این کد درسته فقط شرطش مشکل داره همون که گفتم بذارید این مشکلش حل میشه

beh3000
پنج شنبه 27 آذر 1393, 21:25 عصر
اصلا شما این کار رو بکنید کوئری تون رو شبیهه این بنویسید من شبه کد مینویسم



select * from user where user=:user ...


count برگشته نمیده اگه کاربر وجود داشته باشه یک سطر برمیگردونه اگر هم وجود نداشته باشه هیچی . مقدار برگشتی رو داخل یک متغیر میریزی دیگه مثلا اینجا $sth که باید foreach بزنی

داخل همون foreach die رو بنویسید بدون هیچ شرطی میشه اینجوری




foreach($sth as $row)
die(" این نام قبلاً ثبت نام شده است. ");

زینب فاطمی
پنج شنبه 27 آذر 1393, 21:28 عصر
اینطوری نوشتم دیگه همه رو میگه تکراریه ..



$sth = $db->prepare("SELECT COUNT AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
if (count($sth)>0)
echo 'user tekrari';
else{

beh3000
پنج شنبه 27 آذر 1393, 21:32 عصر
$get = select * from user where user=:user ...
if (count($get)>0)
echo 'user tekrari';
else
{
insert query ...
.
.
.
}


دقت کنید چی نوشتم ...

توی کوئری count رو بردارید * بزارید

H:Shojaei
پنج شنبه 27 آذر 1393, 21:33 عصر
$sth = $db->prepare("SELECT * FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
if (count($sth)>0)
echo 'user tekrari';
else{

زینب فاطمی
پنج شنبه 27 آذر 1393, 21:45 عصر
$sth = $db->prepare("SELECT * FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
if (count($sth)>0)
echo 'user tekrari';
else{

دقت کردم ...همینو زدم هیچی ثبت نمیکنه میزنه تکراریه
وقتی (count($sth)>1 میزنم همه رو ثبت میکنه تکراری هم ثبت میکنه .

beh3000
پنج شنبه 27 آذر 1393, 21:53 عصر
باید fetch کنید



$sth = $db->prepare("select * from user where username=:username");
$sth->execute(array(':username' => $username));
$row = $sth->fetch();
foreach ($row as $item) die ("tekrari ast");
...insert query


یا




$sth = $db->prepare("select * from user where username=:username");
$sth->execute(array(':username' => $username));
$row = $sth->fetch();

if(count($row)>0)
echo 'tekrari';
else{...

زینب فاطمی
پنج شنبه 27 آذر 1393, 22:03 عصر
برای کاربر تکراری پیام درست میده و در مورد کاربر جدید ثبت میشه ولی پیام زیر رو هم میده :
Warning: Invalid argument supplied for foreach() in E:\wamp\www\save-pass.php on line 13

beh3000
پنج شنبه 27 آذر 1393, 22:06 عصر
از اون دوتا کد بالایی که نوشتم پائینی رو تست کن بدون foreach با if تست کن





$sth = $db->prepare("select * from user where username=:username");$sth->execute(array(':username' => $username));$row = $sth->fetch(); if(count($row)>0) echo 'tekrari';else{...

زینب فاطمی
پنج شنبه 27 آذر 1393, 22:20 عصر
تست کردم برای همه پیام تکراری بودن میده چه ثبت شده چه نشده.

beh3000
پنج شنبه 27 آذر 1393, 22:26 عصر
آها برا کاربرای جدید گفتی خطا میده !
Warning: Invalid argument supplied for foreach() in E:\wamp\www\save-pass.php on line 13

کد درج کاربر رو هم بزارید ببینم چه تغییراتی دادید

2undercover
جمعه 28 آذر 1393, 09:02 صبح
علتش یک بی دقتی خیلی ریز هست توی کوئری:

SELECT COUNT AS `username` FROM `user` where username=:username

که در واقع از COUNT باید به این شکل استفاده بشه:

SELECT COUNT(*) AS `username` FROM `user` where username=:username

زینب فاطمی
جمعه 28 آذر 1393, 11:14 صبح
سلام
ممنون . درست نشد.کاربر تکراری ثبت میشه.


$mo=0;
$sth = $db->prepare("SELECT COUNT (*) AS `username` FROM `user` where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
foreach($sth as $row) { $mo = $row['username'];
} if ($mo>=1){ die(" این نام قبلاً ثبت نام شده است. ");
} else{

زینب فاطمی
جمعه 28 آذر 1393, 11:31 صبح
آها برا کاربرای جدید گفتی خطا میده !
Warning: Invalid argument supplied for foreach() in E:\wamp\www\save-pass.php on line 13

کد درج کاربر رو هم بزارید ببینم چه تغییراتی دادید
کد درج کاربر رو تغییر ندادم همونه.

Unique
جمعه 28 آذر 1393, 11:45 صبح
این را امتحان کنید :


error_reporting(E_ALL);
ini_set('display_errors', 'On');
include "config.php";

function generateHash($password){
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
$salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
return crypt($password,$salt);
}
}

$username=$_POST['username'];
$password=$_POST['password'];
$password=generateHash($password);

$sth = $db->prepare("SELECT COUNT(*) as total FROM user where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
$row = $sth->fetch();
if ($row['total'] == 0){
$query="insert into user(username,password) values(:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(":username"=>$username,":password"=>$password)) or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";
}else{
die("این نام قبلاً ثبت نام شده است.");
}

توجه : سایت بعضی مواقع فاصله و کاراکتر هایی در میان کدها اضافه میکنه لطفا فقط copy and paste نکنید و کد را چک کنید.

زینب فاطمی
جمعه 28 آذر 1393, 12:35 عصر
سلام
خیلی ممنون .:تشویق:

درست عمل کرد . خط 24 فقط یه فاصله افتاده بود ارور داد . حالا یه توضیح درباره تغییر کد بدید total چرا گذاشتید ؟

beh3000
جمعه 28 آذر 1393, 13:28 عصر
total یک نام مستعار هست که مقدار خروجی تابع count در اون قرار میگیره ... مواقعی که از تابع استفاده میکنید باید نام مستعار بدید ... در واقع نام ستون خروجیه

hamedarian2009
جمعه 28 آذر 1393, 13:33 عصر
سلام
خیلی ممنون .:تشویق:

درست عمل کرد . خط 24 فقط یه فاصله افتاده بود ارور داد . حالا یه توضیح درباره تغییر کد بدید total چرا گذاشتید ؟

total یک اسم مستعاره یعنی اومده تعداد رکوردهایی که با این سلکت بدست میاد رو میشمره و توی total ذخیره میکنه و که در پایینتر ازش استفاده کرده و گفته اگه مقدار 0 بود یعنی تکراری نیست پس عمل درج انجام بشه وگرنه پیغام بده این نام کاربری قبلا ثبت شده است

زینب فاطمی
جمعه 28 آذر 1393, 15:10 عصر
یه مشکل دیگه : کد درست عمل میکنه زیرش یه لینک بازگشت گذاشتم وقتی کاربر تکراری نباشه نشون میده لینک وفوتر رو ولی اگر کاربر تکراری باشه زیر else آخر به بعد هر چی باشه نشون نمیده

beh3000
جمعه 28 آذر 1393, 15:23 عصر
شما مگه چجوری نوشتین !!! قسمت فوتر باید بیرون if else نوشته بشه

یک شمای کلی از ساختار صفحه تون رو بزارید اینجا

شما احتمالا قسمت else رو بدون بلوک نوشتین ... باید داخل {} بنویسید


if
{
...
}
else
{
...
}


.
.
.
footer



و یا اینکه توی قسمت else شما die نوشتین برا همین همه چیز رو ازون به بعد نابود میکنه و میکشه باید بجاش با دستور echo یک پیغام چاپ کنید


echo 'این کاربر تکراری است';

زینب فاطمی
جمعه 28 آذر 1393, 15:27 عصر
بله میدونم ولی وقتی else اخر اجرا میشه لینک رو نمایش نمیده


<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>PHP Tests</title>
</head><body> <?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include "config.php";

function generateHash($password){
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
$salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
return crypt($password,$salt);
}
}

$username=$_POST['username'];
$password=$_POST['password'];
$password=generateHash($password);

$sth = $db->prepare("SELECT COUNT(*) as total FROM user where username=:username");
$sth->bindvalue(":username",$username);
$sth->execute();
$row = $sth->fetch();
if ($row['total'] == 0){
$query="insert into user(username,password) values(:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password
))
or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";
}else{
die("این نام قبلاً ثبت نام شده است.");
}?><br><a href="index.php"> بازگشت به فرم عضویت </a>
<?php include "footer.php"; ?>

</html></body>

azadehp
جمعه 28 آذر 1393, 15:28 عصر
چجوری میتونم اینجا سوال بذارم ک جواب بدین

زینب فاطمی
جمعه 28 آذر 1393, 15:34 عصر
یعنی چی ؟
درسته با die نوشتم درست میکنم ممنون

beh3000
جمعه 28 آذر 1393, 15:35 عصر
چون که die نوشتین باید با دستور echo پیغام تکراری بودن چاپ کنید ... دستور die اجرای اسکریپت رو متوقف میکنه

echo 'tekrari ast';

beh3000
جمعه 28 آذر 1393, 15:39 عصر
چجوری میتونم اینجا سوال بذارم ک جواب بدین


توی صفحه اصلی سایت برو یکی از تالارها رو انتخاب کن ( تالاری که سوالی در اون مورد داری ) روش کلیک کن ... موضوعاتی که کاربران پرسیدن رو نشون میده بهت ... زیر اون قسمت دکمه ایجاد تاپیک جدید هست اونجا سوالتو مطرح کن

زینب فاطمی
جمعه 28 آذر 1393, 17:24 عصر
فقط مشکل از die نیست . حلقه رو اینطوری نوشتم درست شد .

if ($row['total'] > 0){
echo("این نام قبلاً ثبت نام شده است."); }else{
$query="insert into user(username,password) values(:username,:password)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password
))
or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";


}?>

زینب فاطمی
جمعه 28 آذر 1393, 20:59 عصر
یه سوال دیگه :
حالااگر بخواییم دو تا چیز زو چک کنیم مثلا email هم چک کنیم چجوری میشه ؟ pdo جدید هست نمیدونم چطوری بنویسم ببینید :

$username=$_POST['username'];
$password=$_POST['password'];
$email=$_POST['email'];
$password=generateHash($password);

$sth = $db->prepare("SELECT COUNT(*) as total FROM user where username=:username and email=:email");
$sth->bindvalue(":username",$username );
$sth->bindvalue(":email",$email );
$sth->execute();
$row = $sth->fetch();
if ($row['total'] !== 0){
echo("این نام قبلاً ثبت نام شده است."); }else{
$query="insert into user(username,password,email ) values(:username,:password, :email)";
$stmt=$db->prepare($query);
$stmt->execute(array(
":username"=>$username,
":password"=>$password,
":email"=>$email
))
or die('Your Pass and Username not Register');
echo "Your Password and Username is Registered.";

Unique
شنبه 29 آذر 1393, 01:49 صبح
حالااگر بخواییم دو تا چیز زو چک کنیم مثلا email هم چک کنیم چجوری میشه ؟ pdo جدید هست نمیدونم چطوری بنویسم

به چه دردی میخوره ؟ معمولا از یک نام کاربری یا ایمیل افراد به عنوان username استفاده میشه و چک کردن همون کفایت میکنه ! تا حالا دیدین برای ورود به بخشی از سایت از طرف نام کاربری و ایمیل و کلمه عبور بگیرن ؟

beh3000
شنبه 29 آذر 1393, 08:16 صبح
با این ساختار برید جلو


select count(*) as ... where user=:user
if (count>0)
{
echo 'user tekrari ast';
}
else
{
select count(*) as ... where mail=:mail
if (count>0)
{
echo 'mail tekrari ast';
}
else
{
insert query
}
}

زینب فاطمی
شنبه 29 آذر 1393, 10:02 صبح
به چه دردی میخوره ؟ معمولا از یک نام کاربری یا ایمیل افراد به عنوان username استفاده میشه و چک کردن همون کفایت میکنه ! تا حالا دیدین برای ورود به بخشی از سایت از طرف نام کاربری و ایمیل و کلمه عبور بگیرن ؟

بله دیدم طرف رمز عبورش رو یادش رفته و برای بازیابی رمز میاد قسمت بازیابی و نام کاربریش رو هم یادش رفته ایمیلشو میده و یا نوشته تو کادر یا نام کاربری و یا ایمیلتون تون رو وارذ کنید بعد بر اساس نام کاربری و یا ایمیل وارد شده کاربر بودنش تایید و رمز جدید میداد