ایجاد لینک دانلود مدت دار با PHP و MySQL
احتمالا تا به حال سایت هایی را دیده اید که لینک دانلود آنها به اصطلاح مدت دار بوده و پس از گذشت چند ساعت یا چند روز دیگر نمی توان با آن لینک، فایل مورد نظر را دانلود کرد، این سیستم به انگیزه های مختلف ممکن است مورد نیاز باشد، از جمله اینکه می توان بین کاربران مختلف با توجه به حالت دانلود (رایگان یا با پرداخت هزینه) تفاوت قائل شد، یا هر زمان که نیاز بود، بدون حذف فیزیکی فایل از سرور، لینک دانلود آن را غیر فعال کرد، همچنین این حالت معمولا باعث جلوگیری از بروز ترافیک سنگین و درخواست های متعدد برای دانلود فایل ها می شود که این خود بر بهبود عملکرد سرویس های دانلود تاثیر مثبت دارد، به هر صورت فارغ از انگیزه شما برای انجام این کار، در ادامه آموزش، خواهیم دید که چگونه می توان با کمک PHP و MySQL، سیستم ایجاد لینک دانلود مدت دار را طراحی نمود.
ایجاد دیتابیس و جداول لازم
طبق معمول برنامه های مبتنی بر دیتابیس MySQL، اولین گام ما ایجاد و تعریف ساختار پایگاه داده است که در اینجا با توجه به نیازمان ابتدا از طریق برنامه phpMyAdmin یا با استفاده از کدهای PHP، دیتابیس download را می سازیم (در این آموزش فرض بر این است که از طریق برنامه phpMyAdmin پایگاه داده را ساخته اید)، سپس کدهای زیر را (در صورت نیاز پس از اعمال تنظیمات اتصال) در دایرکتوری فرضی time-limit-download و با نام table_create.php در ریشه هاست یا در سرور مجازی اجرا می کنیم (باید این دایرکتوری را در فولدر www یا public_html و فایل را داخل آن داشته باشید).
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | ساخت جدول دانلود مدت دار فایل</title>
<!-- https://webgoo.ir -->
<style type="text/css">
body{
font-family:Tahoma, Geneva, sans-serif;
font-size:12px;
direction:rtl;
}
.ltr{
direction:ltr;
}
</style>
</head>
<body>
<?php
@$con = mysqli_connect('localhost', 'root', '', 'download');
//خطای اتصال
if(mysqli_connect_errno()){
echo 'اتصال با دیتابیس برقرار نشد:
<br>
<div class="ltr">
'.mysqli_connect_errno().' - '.mysqli_connect_error().'
</div>';
}
//اتصال برقرار است
else{
$query = mysqli_query($con, "CREATE TABLE file_storage(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
client_ip VARCHAR(255),
original_name VARCHAR(255),
temp_name VARCHAR(255),
date_time BIGINT(20)) ENGINE=MyISAM");
if(mysqli_errno($con)){
echo 'بروز خطا در ایجاد جدول:
<br>
<div class="ltr">'.mysqli_errno($con).' - '.mysqli_error($con).'</div>';
}
else{
$link = 'http://'.$_SERVER["SERVER_NAME"].'/time-limit-download/test.zip';
echo 'جدول با موفقیت ساخته شد.
<br>
<div class="ltr">
<a href="'.$link.'">'.$link.'</a>
</div>';
}
}
$close = mysqli_close($con);
?>
</body>
</html>لینک اجرای فایل باید مطابق با نمونه زیر باشد.http://localhost/time-limit-download/table_create.phpنکته: در این آموزش از اکستنشن mysqli استفاده شده که می توانید مطابق سلیقه از PDO یا حتی اکستنش اولیه mysql استفاده کنید (استفاده از این اکستنشن به جزء در موارد آموزشی و پروژه های قدیمی، توصیه نمی شود).توضیح:
با اجرای فایل بالا جدولی با نام فرضی file_storage در دیتابیس download ایجاد می شود که این جدول دارای ستون هایی است که در قسمت CREATE TABLE پرس و جوی بالا ملاحظه می کنید، در زیر به صورت مختصر و جهت آشنایی نقش ستون ها را بررسی می کنیم.
ستون id: این ستون به عنوان یک شماره یکتا معمولا در اکثر برنامه های مبتنی بر دیتابیس استفاده می شود (جهت تمایز و مدیریت بهتر داده های مختلف)، نوع این ستون INT است که در این حالت تا مرز 2147483647 ردیف قابل ایجاد است.
ستون client_ip: این ستون برای نگهداری IP کاربر است که در هنگام تطبیق اطلاعات لینک می تواند مورد استفاده قرار گیرد (استفاده از IP صرفا جهت نمونه است و در صورت نیاز می تواند استفاده نشود).
ستون original_name: این ستون نام اصلی فایل را به همراه پسوند آن نگهداری می کند.
ستون temp_name: این ستون برای نگهداری نام hash شده فایل است (hash به عبارت رمزی شده گفته می شود که در مورد استفاده ما به آن token نیز گفته می شود).
ستون date_time: این ستون جهت نگهداری تاریخ و زمان با نمونه فرمت 20140101121110 (ثانیه دقیقه ساعت روز ماه سال) است، از این عدد برای محاسبه مدت زمان انقضای لینک دانلود استفاده می کنیم.
ایجاد لینک دانلود
پس از ایجاد دیتابیس و جدول، اکنون باید کدی داشته باشیم که آدرس های موقت دانلود مدت دار فایل را برایمان ایجاد کند، در واقع در این مرحله به طور مثال کاربر لینک فرضی زیر را از سرور درخواست می کند و در پاسخ، لینک مدت دار به او نشان داده می شود.
نمونه لینک درخواستی کاربر:
http://localhost/time-limit-download/test.zipنمونه آدرس ایجاد شده برای دانلود مدت دار:http://localhost/time-limit-download/gCvHGkaDADuTbmq3dQsdSXyZ/test.zipلذا کدهای زیر را در فایلی با نام download_link.php در دایرکتوری time-limit-download درج کنید.<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | ایجاد لینک دانلود مدت دار</title>
<!-- https://webgoo.ir -->
<style type="text/css">
body{
font-family:Tahoma, Geneva, sans-serif;
font-size:12px;
direction:rtl;
}
.ltr{
direction:ltr;
}
</style>
</head>
<body>
<?php
//تابعی برای ایجاد عبارت رندوم
function randomStr($length){
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$random_string = '';
for($i = 0; $i < $length; $i++){
$random_string .= $characters[rand(0, strlen($characters) - 1)];
}
return $random_string;
}
@$file = $_GET['file'];
if(!isset($file)){
echo 'مشکلی در دریافت اطلاعات فایل وجود دارد!';
}
else{
@$con = mysqli_connect('localhost', 'root', '', 'download');
//خطای اتصال
if(mysqli_connect_errno()){
echo 'اتصال با دیتابیس برقرار نشد:
<br>
<div class="ltr">
'.mysqli_connect_errno().' - '.mysqli_connect_error().'
</div>';
}
//اتصال برقرار است
else{
$temp = randomStr(24);
$date = date('YmdHis');
//مدت زمان اعتبار لینک به ثانیه
$time = date('YmdHis', time() - 60);
//ایمن سازی
$file = mysqli_real_escape_string($con, $file);
$ip = mysqli_real_escape_string($con, $_SERVER["SERVER_ADDR"]);
//حذف ردیف هایی که تاریخ اعتبار آنها گذشته است
$query = mysqli_query($con, "DELETE FROM file_storage WHERE date_time < '$time'");
//بررسی ip
$query = mysqli_query($con, "SELECT temp_name FROM file_storage WHERE client_ip = '$ip' AND original_name = '$file' LIMIT 1");
$count = mysqli_num_rows($query);
//استفاده از لینک موجود
if($count > 0){
while($row = mysqli_fetch_array($query)){
$temp = $row['temp_name'];
//آپدیت زمان
$update = mysqli_query($con, "UPDATE file_storage SET date_time = '$date' WHERE client_ip = '$ip' AND original_name = '$file' LIMIT 1");
}
}
//ایجاد لینک جدید
else{
$query = mysqli_query($con, "INSERT INTO file_storage(
client_ip, original_name, temp_name, date_time)
VALUES('".$ip."', '".$file."', '".$temp."', '".$date."')");
}
if(mysqli_errno($con)){
echo 'بروز خطا در ذخیره و ایجاد لینک دانلود:
<br><div class="ltr">'.mysqli_errno($con).' - '.mysqli_error($con).'</div>';
}
else{
$link = 'http://'.$_SERVER["SERVER_NAME"].'/time-limit-download/'.$temp.'/'.$file.'';
echo 'لینک دانلود با موفقیت ساخته شد:
<br>
<div class="ltr">
<a href="'.$link.'">'.$link.'</a>
</div>';
}
}
$close = mysqli_close($con);
}
?>
</body>
</html>توضیح:منطق به کار رفته در این قسمت خیلی پیچیده نیست، ابتدا فایل درخواستی کاربر از سرور از طریق متد GET دریافت شده و پیش از ایجاد لینک جدید، وجود IP کاربر و نام فایل مشابه در دیتابیس بررسی می شود، اگر فایل مشابهی با این IP در دیتابیس باشد، ضمن به روز رسانی مدت زمان اعتبار لینک، از اطلاعات موجود برای نمایش لینک دانلود مدت دار استفاده می شود، در غیر این صورت (یعنی اگر اطلاعاتی مطابق با IP و نام اصلی فایل در دیتابیس موجود نباشد)، لینکی با اطلاعات جدید ساخته و در دیتابیس نیز INSERT می شود.
نکته 1: ملاحظه می کنید که پیش از هر گونه اقدامی، ابتدا دستور حذف ردیف های تاریخ گذشته را اجرا کرده ایم.
نکته 2: مدت اعتبار لینک با تغییر مقادیر عددی در متغیر time قابل تغییر است، در این مثال ما از عدد 60 ثانیه استفاده کرده ایم که می توان مطابق نیاز آن را افزایش یا احیانا کاهش داد.
نکته 3: بررسی وجود IP و لینک موجود به این دلیل ممکن است ضروری باشد که معمولا علاوه بر مرورگر، برنامه های مدیریت دانلود مانند IDM نیز (هم زمان با مرورگر و به صورت مخفیانه) درخواستی به سرور ارسال می کنند که در این صورت برای یک فایل، دو ردیف و دو لینک دانلود مجزا در دیتابیس خواهیم داشت که قاعدتا یک مورد آن زائد است.
نکته 4: همان طور که پیش تر گفته شد، این برنامه صرفا یک الگو است و می توان بر اساس نیاز خود بخش هایی از آن را حذف یا مواردی اضافه نمود (منتها باید نسبت به انجام این مورد مسلط باشید!).
ایجاد فولدر file و کد اجرای دانلود
پس از ایجاد و ذخیره لینک دانلود مدت دار، قاعدتا این لینک باید توسط کاربر نهایی جهت دانلود فایل استفاده شود، لذا بدین منظور در دایرکتوری time-limit-download فولدر دیگری با نام file ساخته و درون آن فایلی با نام download_file.php می سازیم، کدهای این فایل وظیفه بررسی لینک درخواستی و در صورت تائید، ارسال فایل به مرورگر را به عهده خواهند داشت.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | دانلود فایل مدت دار</title>
<!-- https://webgoo.ir -->
<style type="text/css">
body{
font-family:Tahoma, Geneva, sans-serif;
font-size:12px;
direction:rtl;
}
.ltr{
direction:ltr;
}
</style>
</head>
<body>
<?php
@$token = $_GET['token'];
@$file = $_GET['file'];
if(!isset($file) || !isset($token)){
echo 'مشکلی در دریافت اطلاعات فایل وجود دارد!';
}
else{
@$con = mysqli_connect('localhost', 'root', '', 'download');
//خطای اتصال
if(mysqli_connect_errno()){
echo 'اتصال با دیتابیس برقرار نشد:
<br>
<div class="ltr">
'.mysqli_connect_errno().' - '.mysqli_connect_error().'
</div>';
}
//اتصال برقرار است
else{
$date = date('YmdHis');
//مدت زمان اعتبار لینک به ثانیه
$time = date('YmdHis', time() - 60);
//ایمن سازی
$token = mysqli_real_escape_string($con, $token);
$file = mysqli_real_escape_string($con, $file);
//حذف ردیف هایی که تاریخ اعتبار آنها گذشته است
$query = mysqli_query($con, "DELETE FROM file_storage WHERE date_time < '$time'");
//بررسی اطلاعات فایل درخواستی کاربر با سرور
$query = mysqli_query($con, "SELECT temp_name FROM file_storage WHERE original_name = '$file' AND temp_name = '$token' LIMIT 1");
$count = mysqli_num_rows($query);
//اطلاعات فایل معتبر است
if($count > 0){
//تابع برای بدست آوردن پسوند فایل
function getExtension($file){
preg_match('/\.[^\.]+$/i', $file, $ext);
return $ext[0];
}
//نوع فایل
$file_type = NULL;
switch(getExtension($file_name)){
case 'zip':
$file_type = 'application/zip';
break;
case 'pdf':
$file_type = 'application/pdf';
break;
case 'jpg':
$file_type = 'image/jpeg';
break;
}
//ارسال فایل به مرورگر برای دانلود
$file_name = $file;
header('Content-Description: File Transfer');
//header('Content-Type: application/octet-stream');
header('Content-Type: '.$file_type);
header('Content-Disposition: attachment; filename='.$file_name);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.filesize("$file_name"));
ob_clean();
flush();
readfile("$file_name");
}
//لینک فایل معتبر نیست یا فایل حذف شده
else{
echo 'فایل مورد نظر یافت نشد!';
}
}
$close = mysqli_close($con);
}
?>
</body>
</html>توضیح:عملکرد این کد به این صورت است که پارامتر hash یا همان token ارسالی از کاربر و همچنین نام حقیقی فایل را که از طریق لینک مدت دار دانلود دریافت شده با دیتابیس تطبیق داده و در صورتی که اطلاعات معتبر باشد، فایل موجود در دایرکتوری file را به مرورگر (یا هر واسط کاربری دیگر مانند برنامه های مدیریت دانلود) ارسال می کند.
نکته: لطفا برای کسب اطلاعات بیشتر در خصوص این قسمت از آموزش، مطلب مشابه ای را که پیش تر در سایت منتشر شده مطالعه کنید:
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
دستور htaccess برای ایجاد لینک های استاتیک
در آخرین گام از ایجاد لینک دانلود مدت دار نیاز به دستورات htaccess زیر در ریشه سایت است تا بتوانیم آدرس های استاتیک (آدرس هایی که در آنها علامت ? نباشد) را ایجاد و استفاده کنیم، لذا بدین منظور اگر فایل htaccess. در ریشه سایت وجود دارد، کافی است دستورات جدید را در انتها اضافه کنید، اما اگر این فایل وجود ندارد باید آن را بسازید و کدها را در آن درج نمائید.
RewriteEngine on
RewriteRule time-limit-download/([^/]+)/([^/]+)(\.zip|\.pdf|\.jpg)$ /time-limit-download/file/download_file.php?token=$1&file=$2$3 [NC,L]
RewriteRule time-limit-download/([^/]+)(\.zip|\.pdf|\.jpg)$ /time-limit-download/download_link.php?file=$1$2 [NC,L]دو دستور بالا به ترتیب برای دریافت لینک مدت دار (token و نام اصلی فایل) و لینک عادی فایل (بدون token) کاربرد دارد.نکته: اگر از فعال بودن Rewrite Engine در سرور مجازی خود مطمئن نیستید، لطفا در این خصوص در وب جستجو کنید.
دانلود نمونه فایل های آموزش
دانلود نمونه فایل های آموزش ایجاد لینک دانلود مدت دار با PHP و MySQL
دسته بندی: آموزش کاربردی » MySQL
« بعدی
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
هوشمند سازی پنل ورود و خروج سایت با PHP و MySQL
آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
جستجو در مطالب سایت با استفاده از MySQL Full-Text
صفحه بندی مطالب و محتوا با PHP و MySQL
دیدگاه
امین
۱۹:۳۸ ۱۳۹۹/۰۷/۱۱
با عرض سلام ببخشید یه فرم دارم اخر فرمم یه دکمه دارم میخواستم بدونم چطوری باید بعد از کلیک کردن دکمه به صفحه دیگه انتقال بدم البته با توسط جی کئوری اطلاعات فرمم رو از طریق ایجکس داخل دیتابیس ثبت میکنم ولی بعد از زدن دکمه چطوری باید به صفحه دیگه برم البته قبلش یه سری مطالب رو بگم به دکمه لینک هم دادم ولی بدون اعتبار سنجی وارد صفحه دیگه میشه و اطلاعات داخل دیتا ثبت نمیشه . ولی وقتی لینک رو بر میدارم روی دکمه کلیک میکنم اطلاعات فرمم از طریق ایجکس ثبت میشه داخل دیتا ولی به صفحه ای که میخوام چطوری باید انتقال داده بشم خیلی ممنون از زحمات شما سپاسگزارم . فقط اگر با نمونه کد واسم ارسال کنید ممنون میشم تشکر
برای انتقال به صفحه دیگر می توانیم از متد window.location.href در جاوا اسکریپت (جی کئوری) استفاده کنیم، پس از ارسال اطلاعات به سرور نمونه کد زیر را در قسمت success یا done جی کئوری درج کنید:
window.location.href = 'http://www.example.com';function ajaxRequest() {
$.ajax({
url: "example.php",
success: function() {
window.location.href = 'http://www.example.com';
}
});
}نکته: کد بالا ناقص و صرفا جهت نمونه است.احمد
۱۹:۵۷ ۱۳۹۹/۰۷/۰۹
با عرض سلام مجدد و خسته نباشید ببخشید نمونه کد رو اگر امکانش هست نگاه کنید که چطوری این متغییری رو که بدست اوردم در صفحات دیگه بتونم ازش استفاده کنم متاسفانه با توضیحاتی که واسم گفتین نتونستم خودم عملی کنم و نتیجه نگرفتم . در نمونه کدها دو عدد پارامتر یکی تعداد و یکی قیمت رو ضربدر همدیگه کردم و در متغییر amount ریختم و در اخر متغییر amount رو اچ تی ام ال کردم که نشون بده در قسمت تگم الان مشکلم این هست که میخوام همین متغییر amount رو در صفحات دیگه هم فراخوانی کنم ولی نمیدونم چطوری اگر امکانش هست یه نمونه کد واسم ارسال کنید که متوجه بشم ممنون از زحمات شما . نمونه کدهام
function jam_kharid() {
var amount = 0;
$(".ppp .uuu ").each(function (index,element) {
var tedad=$(this).find('.form-control').val();
var gheymat=$(this).find('.price-col').text();
amount=amount+parseInt(tedad)*parseInt(gheymat);
});
$("#jam").html(amount);
}
jam_kharid();ساده ترین روش از بین موارد گفته شده روش Local Storage است، به فرض در صفحه اول مقادیر را به این صورت در سیستم کاربر ذخیره می کنیم:
روش URL موقعی کاربرد دارد که بخواهیم کاربر را با جاوا اسکریپت به صفحه دیگر منتقل کنیم، روش کوکی هم مانند روش Local Storage است منتها نحوه ایجاد و استفاده از کوکی در جاوا اسکریپت کمی پیچیده تر است.
function set_jam_kharid() {
var amount = 12;
/*************
سایر کدهای تابع
**************/
localStorage.setItem('amount', amount);
alert('amount set ok!');
}
set_jam_kharid();نام تابع اختیاری است و فقط جهت درک بهتر مطلب تغییر یافته، در صفحه دوم یا همان صفحه می توانیم مقدار ذخیره شده را مجدد فراخوانی کنیم:function get_jam_kharid() {
var amount = localStorage.getItem('amount');
/*************
سایر کدهای تابع
**************/
alert('amount is: ' + amount);
}
get_jam_kharid();در لینک پاسخ قبلی سایر متدهای قابل استفاده در این روش برای حذف یا پاک سازی کامل مقادیر ذخیره شده در حافظه سیستم کاربر نیز توضیح داده شده است.روش URL موقعی کاربرد دارد که بخواهیم کاربر را با جاوا اسکریپت به صفحه دیگر منتقل کنیم، روش کوکی هم مانند روش Local Storage است منتها نحوه ایجاد و استفاده از کوکی در جاوا اسکریپت کمی پیچیده تر است.
احمد
۰۰:۳۶ ۱۳۹۹/۰۷/۰۹
با سلام ببخشید چطوری باید در جکوری از یک متغییر در صفحات دیگه استفاده کنم مثال دو عدد را باهم جمع کردم و ریختم داخل یک متغییر الان میخوام از همین متغییر در صفحات دیگه هم استفاده کنم . در php من از سیشن استفاده میکنم ولی در جکوری نمیدونم. ممنون میشم راهنمایی کنید تشکر از زحمات شما
برای به اشتراک گذاری پارامترها بین صفحات مختلف وب در سمت کاربر چند راه وجود دارد:
- راه حل توصیه شده قرار دادن پارامترهای مد نظر در آدرس URL و دریافت آنها در صفحه مقصد با متد search یا اینترفیس آبجکت URLSearchParams و یا هر روش مد نظر دیگر است، توضیح و نمونه کد:
- راه حل توصیه شده قرار دادن پارامترهای مد نظر در آدرس URL و دریافت آنها در صفحه مقصد با متد search یا اینترفیس آبجکت URLSearchParams و یا هر روش مد نظر دیگر است، توضیح و نمونه کد:
https://developer.mozilla.org/en-US/docs/Web/API/Location/search- شیوه دوم استفاده از کوکی ها در سمت کاربر است، پارامترهای مد نظر در کوکی نگهداری و در زمان مورد نیاز فراخوانی می شوند، آموزش و نمونه کد:https://www.tutorialspoint.com/javascript/javascript_cookies.htm- راه حل دیگر استفاده از Local Storage و ذخیره سازی پارامترها در حافظه سیستم کاربر است که در HTML5 کاربرد دارد، توضیح و نمونه کد:https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage۱۹:۴۱ ۱۳۹۹/۰۶/۱۱
سلام لینک های من وقتی کلیک شوند اررور 404 تولید میکنند. علت چیست؟
لطفا یک نمونه لینک جهت بررسی درج کنید، خطای 404 می تواند علت واقعی (عدم وجود سورس درخواستی از سرور) یا علت فنی (مشکل در برنامه مدیریت سایت) داشته باشد.
محمد
۱۹:۱۴ ۱۳۹۹/۰۴/۱۵
با عرض سلام ببخشید چطوری میتونم واسه اشتراک کاربر انقضا بزارم مثلا یک ماه داخل دیتابیس ردیف تایم رو درست کردم البته تاریخ رو تبدیل کردم به فارسی آیا باید در دیتابیس شرط بزارم یا باید سلکت کنم بعدا توسط متغیر تابع دیت را با متغیر گرفته شده از دیتابیس مقایسه کنم. اخه از این راه رفتم فقط وقتی از علامت بزرگتر و یا کوچکتر استفاده میکنم واسه متغیرها یه بار عمل میکنه یه بار نه . ایا راهی بهتر وجود داره چطوری میتونم اینکار رو انجام بدم ممنون از زحمات شما
می توانید از همین آموزش برای ایجاد انقضای اشتراک کاربران الگوبرداری کنید، به فرض هر کاربر در ستون اشتراک های دیتابیس یک ردیف داشته باشد که تاریخ خرید اشتراک با فرمت YmdHis در ستونی از نوع BIGINT با نام دلخواه reg_date ذخیره شده باشد:
نکته: روش محاسبه تاریخ و زمان به شیوه های مختلف از جمله استفاده از ستون DATETIME و ذخیره سازی و مقایسه برچسب زمان یا Timestamp هم ممکن است، در اینجا صرفا ساده ترین روش جهت فهم بهتر مطلب انتخاب شده است.
$reg = date('YmdHis');سپس هر موقع نیاز به بررسی بود زمان فعلی دسترسی کاربر را از میزان زمان انقضای هر اشتراک (به ثانیه) کسر کرده، حاصل را با زمان موجود در دیتابیس برای آن کاربر مقایسه می کنیم، اگر در نتیجه مقایسه زمان خرید اشتراک بزرگتر بود یعنی کاربر هنوز فرصت دارد، به طور مثال کاربر A در تاریخ 20140210121110 اشتراک 30 روزه را خریداری کرده است، 30 روز برابر است با 24 * 60 * 60 * 30 ثانیه یعنی 2592000 ثانیه و اگر در تاریخ 20 ام همان ماه به سایت مراجعه کند خواهیم داشت:$now = date('YmdHis', time() - 2592000);که نتیجه به صورت 20140120121120 یعنی 20 ام ماه قبل خواهد بود، بر این اساس:20140210121110 > 20140120121020و اشتراک کاربر هنوز برای 20 روز آتی مجاز است! همین تئوری را می توانیم در پرس و جوی MySQL داشته باشیم:$query = mysqli_query($con, "SELECT id FROM table WHERE user = '$user' AND reg_date > '$now' LIMIT 1");
$count = mysqli_num_rows($query);
if($count > 0){
//مجاز
} else{
//پایان اشتراک
}بسته به میزان حساسیت مدت اشتراک می توانیم از عملگر بزرگتر مساوی هم استفاده کنیم.نکته: روش محاسبه تاریخ و زمان به شیوه های مختلف از جمله استفاده از ستون DATETIME و ذخیره سازی و مقایسه برچسب زمان یا Timestamp هم ممکن است، در اینجا صرفا ساده ترین روش جهت فهم بهتر مطلب انتخاب شده است.
۱۶:۵۶ ۱۳۹۸/۱۲/۱۴
یه سوالم دارم اینه که جدیدا سایت های فیلم اخر لینک هاشون اینو داره
این بخشش اضافی تر از لینک معمولی هست.
http://s2-clf.inupload.ir/Movie/2020/02/01/Spycies%202019%20720p%20BluRay%20x264%20YIFY%20Exclusive%20Sync%20Dubbed-%5BClubFilm.IR%5D.mkv.T8d7c0540244856a.mkv?md5=bbf49cc54c7b47c91471d105ef7d3acd&expires=1585999334چطوری میشه اینو ساخت. برای هاست فیلم خودم میخوام استفاده کنم.این بخشش اضافی تر از لینک معمولی هست.
T8d7c0540244856a.mkv?md5=bbf49cc54c7b47c91471d105ef7d3acd&expires=1585999334این آموزش در همین خصوص است منتها نمونه لینک درج شده در ساختار کمی تفاوت دارد و پارامترها را به شکل دیگری استفاده کرده است، اگر بتوانید این آموزش را پیاده سازی کنید هر ساختار مشابه دیگری قابل اجرا است، تابع md5 یک عبارت اتفاقی به عنوان شناسه یکتای موقت ایجاد می کند و قسمت expire احتمالا برای تعیین مدت اعتبار شناسه یکتا در دیتابیس کاربرد دارد.
۱۰:۰۲ ۱۳۹۸/۱۲/۰۶
با سلام
میخوام فایل پیوست بسازم برای اسکریپت وبلاگ از کد زیر استفاده میکنم تا فایل را آپلود و اطلاعات را به دیتابیس ارسال کنم مشکلی که دارم اینه که میخوام ای دی سطر دیتابیس که فایل پیوست شد را برام بازگشت بده تا بتونم در پست اسکریپت وبلاگ استفاده کنم:
میخوام فایل پیوست بسازم برای اسکریپت وبلاگ از کد زیر استفاده میکنم تا فایل را آپلود و اطلاعات را به دیتابیس ارسال کنم مشکلی که دارم اینه که میخوام ای دی سطر دیتابیس که فایل پیوست شد را برام بازگشت بده تا بتونم در پست اسکریپت وبلاگ استفاده کنم:
<?php
include 'config.php';
if (isset($_POST['save'])) {
$filename = $_FILES['myfile']['name'];
$destination = 'uploads/' . $filename;
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$file = $_FILES['myfile']['tmp_name'];
$size = $_FILES['myfile']['size'];
if (!in_array($extension, ['zip', 'pdf', 'docx'])) {
echo "پسوند های مجاز: .zip, .pdf or .docx";
} elseif ($_FILES['myfile']['size'] > 1000000) {
echo "File too large!";
} else {
if (move_uploaded_file($file, $destination)) {
$sql = "INSERT INTO files (name, size, downloads) VALUES ('$filename', $size, 0)";
if (mysqli_query($con, $sql)) {
echo "فایل با موفقیت پیوست شد";
echo "نام فایل '$filename'";
}
} else {
echo "خطا در پیوست فایل";
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css">
<title>Files Upload and Download</title>
</head>
<body>
<div class="container">
<div class="row">
<form action="index.php" method="post" enctype="multipart/form-data" >
<h3>Upload File</h3>
<input type="file" name="myfile"> <br>
<button type="submit" name="save">upload</button>
</form>
</div>
</div>
</body>
</html>
پس از اجرای دستور INSERT می توانید از تابع mysqli_insert_id برای برگردان آی دی ایجاد شده توسط آخرین پرس و جو استفاده کنید:
$last_id = 0;
if (mysqli_query($con, $sql)) {
$last_id = mysqli_insert_id($con);
...
}و مقدار نسبت داده شده به متغیر را در قسمت فرم HTML به نحو دلخواه و مورد نیاز استفاده نمائید:<input type="hidden" name="lastid" value="<?php echo $last_id; ?>">۰۸:۱۱ ۱۳۹۸/۰۹/۲۸
سلام اینو ببینید کار نمیکنه...
خروجی دیتابیس علامت سواله.....،
خروجی دیتابیس علامت سواله.....،
ory.ir/wp1.phpکدشم اینهحذف شداین موضوع به یونیکد و Collation دیتابیس شما بر می گردد، دقت کنید که اگر تمام مراحل زیر را انجام دهید، اطلاعات باید به شکل فارسی در دیتابیس ذخیره و (از طریق برنامه phpMyAdmin) قابل روئیت باشند:
در درجه اول باید Server Connection Collation دیتابیس را
- از متاتگ زیر در تمام صفحات استفاده کنید:
برای HTML نسخه 5:
- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
- اگر مشکل همچنان حل نشد، فایل های خود را با ویرایشگر ++Notepad باز کرده و سپس از قسمت Encoding گزینه Encoding UTF-8 without BOM را انتخاب و فایل خود را مجددا ذخیره نمائید.
در درجه اول باید Server Connection Collation دیتابیس را
utf8_persian_ciانتخاب کنید، سپس مراحل زیر را انجام دهید:- از متاتگ زیر در تمام صفحات استفاده کنید:
برای HTML نسخه 5:
<meta charset="utf-8">برای HTML نسخه های پائین تر:<meta http-equiv="Content-Type" content="text/html; charset=utf-8">- علاوه بر دیتابیس، جداول و ستون ها را نیز با یونیکدutf8_persian_ciبسازید.- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
mysqli_query($conn, "SET NAMES 'utf8'");استفاده از اکستنشن mysql منسوخ شده بهتر است از mysqli استفاده کنید!- اگر مشکل همچنان حل نشد، فایل های خود را با ویرایشگر ++Notepad باز کرده و سپس از قسمت Encoding گزینه Encoding UTF-8 without BOM را انتخاب و فایل خود را مجددا ذخیره نمائید.
۲۳:۴۶ ۱۳۹۷/۰۹/۲۰
خیلی عالی
شریفی
۱۱:۵۵ ۱۳۹۷/۰۹/۰۸
با سلام مجدد.
بابت راهنمایی خوبتون ممنونم.
بابت راهنمایی خوبتون ممنونم.
شریفی
۱۷:۳۹ ۱۳۹۷/۰۹/۰۷
سلام یه سوال خدمت شما داشتم.
من یه جدول SQL دارم که دارای 21 ستون از اعداد گرفته تا متن و ... هست. حالا در اکثر صفحات برای نمایش اطلاعات به داده های ستون ها نیاز دارم. تعداد رکوردها خیلی خیلی زیاد هست و هر روز بیشتر میشه. به نظر شما برای اینکه سرعت لود افزایش پیدا کنه کار مناسبی هست که به جای یک جدول از دو جدول با تعداد ستون های 11 و 10 تا استفاده کنم؟
در کل نظر شما برای افزایش سرعت خواندن اطلاعات در سایت نوشته شده با PHP و جدول MySQL با تعداد رکوردهای زیاد (بالای 50.000 تا) چی هست؟
ممنونم.
من یه جدول SQL دارم که دارای 21 ستون از اعداد گرفته تا متن و ... هست. حالا در اکثر صفحات برای نمایش اطلاعات به داده های ستون ها نیاز دارم. تعداد رکوردها خیلی خیلی زیاد هست و هر روز بیشتر میشه. به نظر شما برای اینکه سرعت لود افزایش پیدا کنه کار مناسبی هست که به جای یک جدول از دو جدول با تعداد ستون های 11 و 10 تا استفاده کنم؟
در کل نظر شما برای افزایش سرعت خواندن اطلاعات در سایت نوشته شده با PHP و جدول MySQL با تعداد رکوردهای زیاد (بالای 50.000 تا) چی هست؟
ممنونم.
تعداد ستون ها به خودی خود مشکل ایجاد نمی کند، 21 ستون میزان نرمال است و نگهداری رکوردها تا چندین میلیون نیز مشکلی ایجاد نمی کند (در کل تعیین سقف برای این موضوع بستگی زیادی به قدرت سخت افزاری و کانفیگ بهینه سرور دارد)، مشکل اصلی در کار با دیتابیس نحوه نوشتن پرس و جوها به صورتی است که کمترین ستون ها و سطرها درگیر باشند، راه حل هایی برای این کار وجود دارد از جمله استفاده از سیستم ایندکس گذاری MySQL، منظور از ایندکس گذاری تعیین ستون هایی جهت دسته بندی و مجزا کردن اطلاعات دارای وجه مشترک از هم است، به فرض اگر در سیستم کاربران مختلف وجود دارند ستون user می تواند برای ایندکس گذاری اطلاعات آنها استفاده شود، به این صورت اگر به فرض 1 میلیون رکورد در جدول باشد MySQL به صورت مستقیم سراغ رکوردهایی می رود که با نام کاربر شروع شده و تعداد سطرهای درگیر به نحو چشمگیری کاهش می یابد که نتیجه افزایش سرعت سیستم است، همچنین بهینه نوشتن پرس و جو ها به طور مثال عدم استفاده از علامت * در دستور SELECT و تعیین دقیق و حداقلی ستون ها و یا استفاده از LIMIT و...
برای آشنایی با مبحث ایندکس گذاری در MySQL این منبع کمک می کند:
برای آشنایی با مبحث ایندکس گذاری در MySQL این منبع کمک می کند:
https://www.siteground.com/kb/mysql-optimization-using-indexes۱۷:۴۵ ۱۳۹۷/۰۴/۱۳
خیلی ممنون از شما به خاطر این آموزش
علی کینگ
۲۱:۲۳ ۱۳۹۶/۰۵/۳۰
با سلام و خسته نباشید و تشکر از مطالب و اموزشهای مفیدتون
سوالی درباره هدرها داشتم
البته من فایل رو میفرستم به یه فایل php دیگه و اونو میذارم برای دانلود... راه دیگه ای نداره؟
سوالی درباره هدرها داشتم
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');اگه ممکنه اطلاعاتی درباره این هدرها بدید که کارشون چیه و بخش دوم سوالم اینه که من میخام یه فایلو از یه لینک خاص به اسم دلخواه خودم به یه جای دیگه بفرستم بدون اینکه تو هاستم اپلودش کنم دقیقترش اینکه فایل رو از تلگرام بگیرم و با هدر با اسم دلخواه خودم برگردونم به تلگرام من الان میتونم لینک فایل رو از تلگرام بگیرم و با هدر با اسم دلخواه برای دانلود بذارم ولی وقتی میخام دوباره بفرستم به تلگرام، نام فایل پی اچ پی بجای نام فایلی که انتخاب کردم ارسال میشهالبته من فایل رو میفرستم به یه فایل php دیگه و اونو میذارم برای دانلود... راه دیگه ای نداره؟
توضیح کامل در مورد دستورات Header:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headersدر مورد مشکل دوم تا آنجا که اطلاع داریم تلگرام از API خاص خود برای ارسال و دریافت اطلاعات و از جمله فایل ها استفاده می کند، این یعنی نمی توانیم آن طور که در وب به نحو دلخواه فایل را به مرورگر ارسال می کنیم، به همان نحو فایل را به تلگرام ارسال کنیم و باید از متدهای موجود در API استفاده کنیم، دستورات Header توسط تلگرام نادیده گرفته می شوند، باید از Option های موجود در Method ارسال فایل در تلگرام استفاده کنید که ممکن است محدود به امکانات مشخصی باشد.امیررضا
۱۴:۵۸ ۱۳۹۵/۰۶/۱۲
سلام و خسته نباشید خدمت شما
واقعا ممنونم بابت قرار دادن این آموزش فقط من مشکلم اینه که هر کاری میکنم فایل با لینک مستقیم دانلود میشه یا میگه فایل مورد نظر یافت نشد! (برای فایل test.zip) برای mp3 هم که لینک مستقیم داد! هم روی هاست و هم روی لوکال هاست همینطوری بود (htaccess هم همون کد داخل پوشه هستش) کلی هم کد ها رو دستکاری کردم و داخل فایل دانلود لینک خط 12 کد رو به این صورت کردم
ببخشید طولانی شد؛ ممنون میشم کمکم کنید
واقعا ممنونم بابت قرار دادن این آموزش فقط من مشکلم اینه که هر کاری میکنم فایل با لینک مستقیم دانلود میشه یا میگه فایل مورد نظر یافت نشد! (برای فایل test.zip) برای mp3 هم که لینک مستقیم داد! هم روی هاست و هم روی لوکال هاست همینطوری بود (htaccess هم همون کد داخل پوشه هستش) کلی هم کد ها رو دستکاری کردم و داخل فایل دانلود لینک خط 12 کد رو به این صورت کردم
@$file = $_GET.$_FILES["file"];اما لینک رو برای Array میسازه و با همین نام داخل دیتابیس ذخیره میکنهببخشید طولانی شد؛ ممنون میشم کمکم کنید
متاسفانه تنها با دسترسی به سورس کدها و تست آنلاین می توان به علت مشکل و راه حل آن پی برد! ممکن است تنظیمات htaccess در سرور شما یا موارد دیگری به درستی انجام نشده باشد.
alireza
۱۶:۱۵ ۱۳۹۵/۰۵/۳۱
سلام این ارور رو هنگام اجرای فایل php ای که در پوشه مشخصه در روت هاست ریختم بهم میده
http://localhost/time-limit-download/table_create.phpارور:1045 - Access denied for user 'root'@'localhost' (using password: NO)چیکار کنم؟در هاست باید یک نام کاربری و کلمه عبور برای اتصال به دیتابیس داشته باشید (در تابع mysqli_connect آن را تنظیم کنید) که از قسمت کنترل پنل، بخش مدیریت پایگاه داده انجام این کار ممکن است، کاربر root و بدون کلمه عبور معمولا صرفا در سرور مجازی و برای تست در سیستم شخصی کاربرد دارد!
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.