PDA

View Full Version : سوال: ارسال مقدار به دیتابیس 60 ثانیه بعد از ارسال قبلی



ravand
جمعه 13 بهمن 1391, 18:40 عصر
سلام
یه برنامه نوشتم که یک مقداری رو به دیتابیس ارسال میکنم بعد اگه بخوام زودتر از 60 ثانیه دوباره مقدار رو ارسال کنم یه پیغام بهم داده میشه و مانع از این کار میشه. عجیب اینجاست که این برنامه توی لوکال هاست کار میکنه ولی روی هاست سایتم کار نمیکنه!!!!!!!!!!!

<form method="POST" dir="rtl">
نام <input type="text" name="title"><br>
نام خانوادگي <input type="text" name="matn"><br>
<input type="submit" value="ارسال" name="submeted">
</form>
<?php
if(isset($_POST['submeted'])){
$handle=mysql_connect('localhost','root','');
if($handle==false){
die(" نمي تواند ارتباط برقرار كند .\r\n");
}
$db=mysql_select_db('time');
if($db==false){
die(". نمي تواند به ديتابیسمتصل شود .\r\n");
}
$time=time();
$ip=$_SERVER['REMOTE_ADDR'];
$sql="SELECT * FROM time";
mysql_query("SET CHARACTER SET utf8",$handle);
$result=mysql_query($sql,$handle) or die (mysql_error());
while ($row=mysql_fetch_array($result)){
$timee=$row['time'];
$ipi=$row['ip'];
$timei=$timee+20;
}
if($ipi==$ip && $timei >= $time){
die("شصت ثانیه ی دیگر تلاش کنید.");
}
$title=$_POST['title'];
$matn=$_POST['matn'];
mysql_set_charset('utf8',$handle);
mysql_query("INSERT INTO time (`title`,`matn`,`time`,`ip`) VALUES('$title','$matn','$time','$ip')");
$num=mysql_affected_rows($handle);
if($num==1){
echo "ارسال شد";
}
else
if($num == 0){
echo "ارسال نشد";
}
mysql_close($handle);
}
?>
راستی روی سایتم که تست میکنم مقادیر به دیتابیس ارسال میشه ولی اون شصت ثانیه انتظار کار نمیکنه.
متشکرم.

mamali-mohammad
جمعه 13 بهمن 1391, 19:00 عصر
به مدیر سرور بگو مقدار timeout رو بیشتر کنه
مثلا 5 دقیقه

ravand
جمعه 13 بهمن 1391, 19:52 عصر
به مدیر سرور بگو مقدار timeout رو بیشتر کنه
مثلا 5 دقیقه
متاسفانه سرور رایگان هست.
ولی خب من دارم برنامه نویسی میکنم چه ربطی به این موضوع داره؟ من میخوام با این برنامه ی ساده این کار رو بکنم. نمیفهمم چرا مدیر سرور باید این کار رو بکنه؟

MMSHFE
جمعه 13 بهمن 1391, 21:19 عصر
دوست عزیز، اسکریپت شما بعد از 30 ثانیه، با خطای Time-out error مواجه میشه. این دو خط رو ابتدای کدتون بگذارین:


ignore_user_abort(true);
set_time_limit(0);

تا سرور جلوی اجرای اسکریپتتون رو نگیره.

ravand
جمعه 13 بهمن 1391, 21:39 عصر
تست کردم خطا داد:
به خاطر این این خط خطا داد:

set_time_limit(0);
خطای زیر:

Warning: set_time_limit() has been disabled for security reasons in
وقتی برش داشتم خطایی نداد ولی کارم نکرد.
من برام عجیبه که چرا کار نمیکنه . خب برنامه ی من مثل این می مونه که بگید اگر 40 بزرگتر از 20 باشه پیغام بده.
همین. چرا کار نمیکنه؟؟؟

MMSHFE
جمعه 13 بهمن 1391, 21:49 عصر
عجب سرور باحالیه! set_time_limit رو بخاطر مسائل امنیتی! غیرفعال کرده.

ravand
جمعه 13 بهمن 1391, 21:52 عصر
راه حل دیگه ای برای انجام این کار وجود نداره؟ من بیام یه دستور دیگه بنویسم؟ :متفکر:

Beginner2013
جمعه 13 بهمن 1391, 22:12 عصر
سلام.دوست من چرا بجای خواندن تایم از دیتا بیس از کوکی استفاده نمی کنید که کدتون سریع تر و کارتون راحت تر بشه.

MMSHFE
جمعه 13 بهمن 1391, 22:55 عصر
میگم راوندی جان، وقتش نیست به این نتیجه برسی که هاست رایگان بدرد نمیخوره؟

ravand
شنبه 14 بهمن 1391, 09:19 صبح
سلام.دوست من چرا بجای خواندن تایم از دیتا بیس از کوکی استفاده نمی کنید که کدتون سریع تر و کارتون راحت تر بشه.
فکر میکنم اگه هکر مردم آزار باشه کوکی و سشن رو به راحتی جعل میکنه.


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

masato
شنبه 14 بهمن 1391, 12:12 عصر
سلام
داداش میشه این هاست رایگان رو معرفی کنید ؟
تشکر

tehro0n
شنبه 14 بهمن 1391, 12:24 عصر
یه هاست رایگان آمریکایی گرفتم که سرعتش از نمونه ی پولیش بهتره. من که نیازی به امکانات ندارم چرا برم بیخودی براش پول بدم؟ :لبخند:

خوب پس این امکانی که الان نداری چی میشه؟
time() رو 60 ثانیه اضافه کن و بگو خروجی کوچکتر از time باشه :لبخند:
با سیشن هم امتحان کنی همین مشکل رو داری حتما..

پس فقط می مونه استفاده از post JQuery که اونجا بیای زمان بگیری و 60 ثانیه رو تعریف کنی.. فقط من تو کدت 20 ثانیه میبینم، نمی دونم 60 چجوری میشه!
البته با این روش هم قطعا کاربری که بخواد زیر 60 ثانیه ارسال می کنه ولی خوب همین می مونه برات، ازش به خوبی استفاده کن!

Reza1607
شنبه 14 بهمن 1391, 12:40 عصر
من الان دقيقا نفهميدم كه شما مي خواين چيكار كنيد ولي اگه مي خواين كه هر كاربر بعد از ارسال يك پست نتونه تا 60 ثانيه بعد ارسالي انجام بده مي تونيد از روش زير استفاده كنيد كه خيلي هم راحت تره



if(isset($_SESSION['time'])){
if($_SESSION['time']+60<=time()){
echo 'شما بايد بعد از هر ارسال 60 ثانيه منتظر بمانيد.';
exit();
}
}
mysql_connect('localhost','root','') or die('Can not Connect to Database !!!!');
mysql_select_db('time') or die('Can not Select Database !!!');
mysql_query('SET NAME `utf8`);

if(mysql_query("INSERT INTO time(`title`,`matn`,`time`,`ip`) VALUES('$_POST[title]','$_POST[matn]','".time()."','$_SERVER[REMOTE_ADD]')") && mysql_affected_rows()===1)
{
echo 'ثبت شد.';
$_SESSION['time']=time();
}

MMSHFE
شنبه 14 بهمن 1391, 13:10 عصر
راوندی جان، هاستت یک set_time_limit ساده بهت اجازه نمیده و میگه بخاطر مسائل امنیتی! (خداییش ربطش رو با امنیت نفهمیدم) این ویژگی غیرفعال شده. حالا این هاست چی براش میمونه که میگی از پولیش بهتره؟ خودمونیم اگه یک اسکریپت حجیم و سنگین داشتی که بیشتر از 30 ثانیه زمان برای اجرا لازم داشته باشه، چطوری میخوای روی این هاست ازش استفاده کنی؟

armin390
شنبه 14 بهمن 1391, 13:40 عصر
برنامه شما مشکل منطقی داره! شاید همچنین کوئری کمکتون کنه با توجه به هدف:


SELECT MAX(`time`) FROM `time` WHERE `ip`='$ip'


ربطی به محدودیت زمان اجرا نداره، کار طبیعی هست که تو یه هاستینگ رایگان (حتی ارزان قیمت) این محدودیت وجود داشته باشه و ربطش به امنیت هم اینه که لود سرور به خاطر درگیر موندن پروسس های وب سرور (و احتمالا خود php در صورتی که cgi اجرا میشه) تا حد ممکن بالا نره!

ravand
شنبه 14 بهمن 1391, 13:46 عصر
دستور سشن رو که آقا رضا داد تست کردم اینم مثل قبلی فایده ای نداشت.
من درست نگرفتم چرا و کجا باید از این دستور استفاده کنم؟

SELECT MAX(`time`) FROM `time` WHERE `ip`='$ip'

tehro0n
شنبه 14 بهمن 1391, 19:42 عصر
شاید منظورش این بود که این کد رو بنویسی!

<form method="POST" dir="rtl">
نام <input type="text" name="title">
نام خانوادگي <input type="text" name="matn">
<input type="submit" value="ارسال" name="submeted">
</form>
<?php
if(isset($_POST['submeted'])){
$handle=mysql_connect('localhost','root','');
if($handle==false){
die(" نمي تواند ارتباط برقرار كند .\r\n");
}
$db=mysql_select_db('time');
if($db==false){
die(". نمي تواند به ديتابیسمتصل شود .\r\n");
}
$time=time();
$ip=$_SERVER['REMOTE_ADDR'];
$sql="SELECT * FROM time WHERE time <= {$time}+60 AND {$ip} == ip";
mysql_query("SET CHARACTER SET utf8",$handle);
$result=mysql_query($sql,$handle) or die (mysql_error());
if(mysql_num_rows($result)){
die("شصت ثانیه ی دیگر تلاش کنید.");
}
$title=$_POST['title'];
$matn=$_POST['matn'];
mysql_set_charset('utf8',$handle);
mysql_query("INSERT INTO time (`title`,`matn`,`time`,`ip`) VALUES('$title','$matn','$time','$ip')");
$num=mysql_affected_rows($handle);
if($num==1){
echo "ارسال شد";
}
else
if($num == 0){
echo "ارسال نشد";
}
mysql_close($handle);
}
?>
چقدر شبیه بود به هم :لبخند:

ravand
شنبه 14 بهمن 1391, 20:53 عصر
این خط کدی که شما نوشتید مشکل داره بهتر بود قبلش یه چکی میکردید:

SELECT * FROM time WHERE time <= {$time}+60 AND {$ip} == ip

tehro0n
یک شنبه 15 بهمن 1391, 00:44 صبح
این خط کدی که شما نوشتید مشکل داره بهتر بود قبلش یه چکی میکردید:

SELECT * FROM time WHERE time <= {$time}+60 AND {$ip} == ip

درست می فرمایید، == رو به = تبدیل کن، البته دیگه این چیزا چک کردن نداره :| بخوام دیتا بسازم و بیام تست کنم اووووووووووووووووه

ravand
یک شنبه 15 بهمن 1391, 07:06 صبح
درست می فرمایید، == رو به = تبدیل کن، البته دیگه این چیزا چک کردن نداره :| بخوام دیتا بسازم و بیام تست کنم اووووووووووووووووه
این کاری هم که شما میگفی کردم چند تا راه دیگه ام رفتم فایده ای نداشت این کد شما از لحاظ تئوریشم ناکارامده.چه برسه بخواد در عمل جواب بده.
من خودم توی برنامه ی wamp یه دیتابیس ساختم که این کدها رو راحت تست میکنم فکر نمیکنم که تست کردنش زیاد وقتی ببره. همیشه مطالب رو تست میکنم بعد میذارم اینجا اتاق چت نیست . بالاخره باید جواب هامون صحیح باشه. خیلی معذرت میخوام جسارته . نباید که بیایم اینجا یه چیزی بپرونیم که! :لبخند:

Reza1607
یک شنبه 15 بهمن 1391, 08:41 صبح
دستور سشن رو که آقا رضا داد تست کردم اینم مثل قبلی فایده ای نداشت.
من درست نگرفتم چرا و کجا باید از این دستور استفاده کنم؟

SELECT MAX(`time`) FROM `time` WHERE `ip`='$ip'

جهت شرط رو اشتباه گذاشته بودم (از اين سوتي ها تا دلتون بخواد ميدم)اون خط شرط رو بردارين و اين رو به جاش بذاريد


if(($_SESSION['time']+60)>=time()){

ravand
یک شنبه 15 بهمن 1391, 08:55 صبح
الهی من قوربونت برم رضا جون برنامه داره کار میکنه نمیدونم دارم خواب میبینم :قهقهه:
داشتم کم کم ناامید میشدم. راستی راستی چرا وقتی زمان رو توی دیتابیس ذخیره میکردم جواب نمیداد ؟ حالا که توی سشن ذخیره کردم جواب میده؟ :متعجب:
در هر حال یه دنیا ممنون. برنامه ات معجزه کرد :تشویق:

Reza1607
یک شنبه 15 بهمن 1391, 09:54 صبح
راستی راستی چرا وقتی زمان رو توی دیتابیس ذخیره میکردم جواب نمیداد ؟ حالا که توی سشن ذخیره کردم جواب میده؟ :متعجب:
:تشویق:

خواهش مي كنم خوشحالم كه تونستم كمكتون بكنم
كلا منطق برنامه شما براي استفاده از ديتابيس اشتباه بود


mysql_connect('localhost','root','') or die('Can not Connect to Database !!!!');
mysql_select_db('time') or die('Can not Select Database !!!');
mysql_query('SET NAME `utf8`');
$result=mysql_query("SELECT max(`time`) `max_time` FROM `time` WHERE `ip`='$_SERVER[REMOTE_ADD]'");
if(mysql_num_rows($result)===1){
$time=mysql_fetch_assoc($result);
if($time['max_time']+60>=time()){
echo 'شما بايد بعد از هر ارسال 60 ثانيه منتظر بمانيد.';
exit();
}
}

if(mysql_query("INSERT INTO time(`title`,`matn`,`time`,`ip`) VALUES('$_POST[title]','$_POST[matn]','".time()."','$_SERVER[REMOTE_ADD]')") && mysql_affected_rows()===1)
{
echo 'Save';
$_SESSION['time']=time();
}


البته دوستان اين روش رو قبلا پيشنهاد داده بودن

tehro0n
یک شنبه 15 بهمن 1391, 10:01 صبح
این کاری هم که شما میگفی کردم چند تا راه دیگه ام رفتم فایده ای نداشت این کد شما از لحاظ تئوریشم ناکارامده.چه برسه بخواد در عمل جواب بده.
من خودم توی برنامه ی wamp یه دیتابیس ساختم که این کدها رو راحت تست میکنم فکر نمیکنم که تست کردنش زیاد وقتی ببره. همیشه مطالب رو تست میکنم بعد میذارم اینجا اتاق چت نیست . بالاخره باید جواب هامون صحیح باشه. خیلی معذرت میخوام جسارته . نباید که بیایم اینجا یه چیزی بپرونیم که! :لبخند:

این آخه یه خط ساده بود که من هم انقدر سوتی دادم، آخر شب بود دیگه :لبخند:
شما اون خط رو بردار به جاش این رو بگذار، زمان رو هم جابه جا گفتم.. اگه هم کمی فکر کنی میفهمی که قرار بود بگم اون آی پی هایی که زمانشون جزو بلاک شده هاست و آی پی تکراری هستند رو نمایش بده، حالا بعدش اگه چنین رکوردی وجود داشت اون رو die کن در غیر این صورت یعنی این آی پی تو 60 ثانیه چند رکورد نداده!
سایت شما را نمی دونم، اما من که سرویس دهنده دارم سعی می کنم انقدر با RAM ام بازی نکنم و جاهای دیگه ازاش استفاده کنم، منظورم ساخت و حذف session سر هر بازدیدکننده است! (خیلی بده)

و در نهایت فکر کنم راه شما اصلا منطقی نبوده که برای هر بازدید میای اون تک نفر رو تو while میندازی! بعد که کوئری گرفتی می گی خوب دیگه حالا die.. این هم از کد:

SELECT * FROM time WHERE time+60 >= {$time} AND {$ip} = ip

ravand
یک شنبه 15 بهمن 1391, 10:38 صبح
آقا رضا من این روش دیتابیس هم که دادید رو تست کردم ولی جواب نداد. بیخیال من از همون سشن استفاده میکنم . دیگه حال ندارم بیش از این این مبحث رو کشش بدم :لبخند: