آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس

یکی از مزایای استفاده از پایگاه داده و سیستم های داینامیک در مقایسه با شیوه های سنتی و استاتیک مدیریت اطلاعات، افزایش سرعت انجام کارها و قابلیت پردازش چندین دستور مختلف در یک لحظه و صرفه جویی در وقت است، به طور مثال فرض کنید می خواهیم اسامی تعدادی از کاربران سایتمان را از لیستی حذف کنیم، انجام این کار به شیوه سنتی مستلزم صرف زمان بسیار و دردسرهای خاص خودش است که باعث می شود ضریب اشتباه نیز افزایش یابد، اما کافی است یک بار در نوشتن کدی داینامیک برای حذف سیستماتیک و گروهی ردیف ها دقت کنیم تا از آن در دفعات بعدی و به اشکال مختلف، چندین و چند بار استفاده نمائیم، از این رو در این مطلب می خواهیم یکی از پرکاربرد ترین شیوه ها یعنی نحوه حذف گروهی اطلاعات از دیتابیس را به وسیله چک باکس چند گانه (Multiple Checkbox) آموزش دهیم.
ساخت دیتابیس، جدول و نمونه اطلاعات فرضی
برای درک بهتر این شیوه، آموزش را در قالب یک مثال ادامه می دهیم، ابتدا با استفاده از منوی Databases در برنامه phpMyAdmin یک پایگاه داده فرضی با نام db_test می سازیم، ترجیحا این کار را در لوکال هاست (برنامه WampServer) با درج آدرس
localhost/phpmyadmin
در مرورگر انجام می دهیم اما اگر بر روی سرور آنلاین باشیم احتمال دارد این قسمت توسط پشتیبانی فنی هاست محدود و غیرفعال شده باشد که در این صورت باید از طریق کنترل پنل اصلی سایتمان، بخش مدیریت Database ها را انتخاب و یک پایگاه داده جدید ایجاد نمائیم، فراموش نکنیم که در همین قسمت باید یک کاربر نیز به پایگاه داده جدید اختصاص دهیم، پس از ساخت دیتابیس در قسمت SQL برنامه phpMyAdmin کد زیر را درج و اجرا می کنیم تا جدولی با نام tbl_test با مقادیر پیش فرض جهت نمونه در آن ایجاد شود (ساخت جدول و ستون ها را به صورت دستی نیز می توانیم انجام دهیم، برای ایجاد جدول به صورت دستی بر روی دیتابیس مورد نظر در برنامه phpMyAdmin کلیک کرده، از قسمت Create table نام جدول و تعداد ستون ها را مشخص می کنیم، سپس بر روی دکمه Go کلیک کرده و پس از اعمال تنظیمات مربوط به هر ستون، در نهایت با دکمه Save جدول و ستون ها را ایجاد می کنیم، اگر هم جدول را بدون ستون ها ایجاد کرده باشیم یا بخواهیم ستون های دیگری به آن اضافه کنیم، ابتدا جدول مورد نظر را با کلیک بر روی نام آن انتخاب و سپس در منوی Structure از امکانات بخش Add column که معمولا در انتهای لیست ستون ها است می توانیم استفاده کنیم، برای درج نمونه ردیف های اطلاعات نیز منوی Insert کاربرد دارد):CREATE TABLE `tbl_test` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
INSERT INTO `tbl_test` VALUES (1, 'user_1');
INSERT INTO `tbl_test` VALUES (2, 'user_2');
INSERT INTO `tbl_test` VALUES (3, 'user_3');
INSERT INTO `tbl_test` VALUES (4, 'user_4');
INSERT INTO `tbl_test` VALUES (5, 'user_5');
INSERT INTO `tbl_test` VALUES (6, 'user_6');
کد PHP و HTML پایه برای حذف گروهی اطلاعات
پس از ساخت دیتابیس، جدول و INSERT نمونه اطلاعات فرضی، باید رابط کاربری HTML و کدنویسی PHP سمت سرور را آماده کنیم، برای این منظور ابتدا کد پایه زیر را که جهت درک بهتر روند کار تا حد امکان مختصر شده و صرفا شامل مراحل ضروری دریافت و حذف اطلاعات از جمله متغیرهای دریافت پارامترها در هنگام ارسال فرم با متد POST، تنظیمات مربوط به اتصال به پایگاه داده، دریافت اسامی کاربران و نمایش آنها به صورت ردیف به ردیف در صفحه مرورگر، ویژگی های تعاملی مورد نیاز مانند دکمه های چک باکس، دکمه ارسال فرم و پرس و جوی دریافت و حذف اطلاعات با بررسی توسط دستورات شرطی (if، else و...) و مواردی از این دست است را در یک فایل PHP با نام دلخواه (به طور مثال delete.php) درج و در ادامه این کد را توسعه داده و موارد پیشرفته تری که ممکن است مورد نیاز کاربران مختلف باشد را اضافه می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | حذف گروهی اطلاعات از دیتابیس با چک باکس - کد پایه</title>
<!-- Webgoo.ir -->
<style type="text/css">
.row-container{
direction:rtl;
}
.row-1 {
background:#FFFFFF;
}
.row-2 {
background:#CCCCCC;
}
</style>
</head>
<body>
<div class="row-container">
<?php
//تنظیمات پایگاه داده
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "db_test";
$tbl_name = "tbl_test";
//متغیرهای تعیین رنگ ردیف ها
$color_1 = '1';
$color_2 = '2';
$color = $color_1;
//دریافت پارامترها در هنگام ارسال فرم
@$users = $_POST['users'];
@$check = $_POST['check'];
//اتصال با دیتابیس
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if(!$conn) {
echo "Error!: " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
//اجرای پرس و جوی حذف ردیف ها در صورت ارسال فرم
if($check == 1){
$del_param = null;
$count_users = count($users);
for($i = 0; $i < $count_users; $i++){
$del_param .= "id=$users[$i]";
if($i + 1 < $count_users){
$del_param .= " OR ";
}
}
if($count_users > 0){
$query = mysqli_query($conn, "DELETE FROM $tbl_name WHERE $del_param");
if(!$query) {
echo "Error!: " . mysqli_error($conn) . '<br>';
} else{
echo 'تعداد ' . $count_users .' ردیف با موفقیت حذف شد!' . '<br>';
}
} else{
echo 'فیلدی برای حذف انتخاب نشده است!' . '<br>';
}
}
//پرس و جوی دریافت ردیف ها از دیتابیس و نمایش به صورت ردیف به ردیف
$query = mysqli_query($conn, "SELECT id, name FROM $tbl_name ORDER BY id ASC LIMIT 10");
if(!$query) {
echo "Error!: " . mysqli_error($conn);
} elseif(!mysqli_num_rows($query) > 0){
echo 'کاربری برای نمایش وجود ندارد!' . '<br>';
} else {
echo '<form action="#" method="post">' . "\n";
while($row = mysqli_fetch_array($query)){
echo '<div class="row-' . $color . '">' . "\n" .
'<input name="users[]" type="checkbox" value="' . $row['id'] . '">نام کاربر: ' . $row['name'] . "\n" .
'</div>' . "\n";
if($color == $color_1){
$color = $color_2;
} else{
$color = $color_1;
}
}
echo '<input name="check" type="hidden" value="1">' . "\n";
echo '<input type="submit" value="حذف">' . "\n";
echo '</form>' . "\n";
}
}
?>
</div>
</body>
</html>
همان طور که گفتیم کد بالا شامل دو قسمت اصلی است، ابتدا فرم HTML و اسامی موجود در دیتابیس به صورت ردیف به ردیف در صفحه مرورگر چاپ می شود تا کاربر پس از انتخاب موارد مورد نظر خود و کلیک بر روی دکمه حذف، اسامی را به صورت یک آرایه به سرور ارسال کند، در سرور اطلاعات ارسال شده با متد POST دریافت شده و پردازش های مورد نیاز صورت می گیرد، برای درک بهتر این شیوه کد را به صورت قسمت به قسمت بررسی می کنیم:- ابتدا مواردی که باید در قسمت تگ html و body درج شوند را قرار می دهیم، این موارد شامل تیتر دلخواه صفحه و استایل CSS است که در فرمت بندی خروجی کار نقش ایفا می کنند، چند کلاس ساده جهت نمونه درج شده که می توانید بر حسب نیاز آنها را تغییر دهید.
- سپس اطلاعات اتصال به پایگاه داده را در قسمت مربوط به آن تنظیم می کنیم، این اطلاعات شامل نام میزبان (معمولا localhost)، نام کاربری و کلمه عبور جهت اتصال به دیتابیس (معمولا در لوکال هاست عبارت root و بدون کلمه عبور) و عنوان دیتابیس مورد نظر است، در همین قسمت نام جدول را نیز در متغیر tbl_name تعریف کرده ایم، کد از اکستنشن MySQLi در حالت برنامه نویسی رویه ای (Procedural) استفاده می کند، قاعدتا اگر با حالت شی گرا یا اکستشن PDO آشنا باشیم، تبدیل این کد کار ساده ای خواهد بود.
- در ادامه، دستورات مربوط به قسمت حذف ردیف ها را نوشته ایم، این بخش از برنامه تنها زمانی اجرا خواهد شد که کاربر فرم را ارسال کرده و متغیر check برابر با 1 باشد، لذا تا زمانی که کاربر فرم را ارسال نکند، این بخش در فرآیند اجرا عملا تاثیری نخواهد داشت، در همین قسمت برای بهینه بودن کدنویسی تعداد فیلدهای ارسالی کاربر را شمارش کرده و در حلقه for برای بخش WHERE در دستور DELETE پارامترهای داینامیک نوشته ایم، به طور مثال اگر کاربر سه فیلد را انتخاب کند متغیر del_param به شکل زیر ایجاد و جایگزین می شود:
id=1 OR id=4 OR id=6
با این روش برای هر تعداد فیلدی که کاربر ارسال کند تنها یک پرس و جوی DELETE اجرا خواهد شد و از منابع دیتابیس کمتر استفاده شده و در نتیجه سرور فشار کمتری را متحمل می شود که این چاره اندیشی برای بهینه بودن برنامه های با تعداد کاربر بالا ضروری است.- بخش اصلی دیگر مربوط به دستور SELECT و دریافت مشخصات کاربران از دیتابیس است که در حلقه while این کار را انجام داده و خروجی HTML مورد نیاز را با استفاده از اطلاعات موجود در دیتابیس (ستون id و name) به صورت دلخواه ایجاد کرده ایم، با کمی سلیقه می توانیم به کمک استایل CSS شکل و فرم کار را سفارشی سازی کنیم، در اینجا نیز با مقداردهی چند متغیر ردیف ها را با دو رنگ متمایز کرده ایم که در خروجی به شکل نمونه زیر چاپ می شوند:
<div class="row-1">
<input name="users[]" type="checkbox" value="1">نام کاربر: user_1
</div>
<div class="row-2">
<input name="users[]" type="checkbox" value="2">نام کاربر: user_2
</div>
<div class="row-1">
<input name="users[]" type="checkbox" value="3">نام کاربر: user_3
</div>
<div class="row-2">
<input name="users[]" type="checkbox" value="4">نام کاربر: user_4
</div>
اگر به کلاس ها دقت کنیم، ردیف به ردیف عدد متناظر کلاس با شماره های 1 و 2 جایگزین شده (row-1 و row-2) که با تعریف این کلاس ها در قسمت CSS می توانیم دو رنگ مجزا برای ردیف ها داشته باشیم که این به زیبایی و خوانا شدن رابط کاربری کمک می کند.نکته: برای ارسال گروهی فیلدهای input از نوع checkbox باید در انتهای قسمت name آنها از علامت [] استفاده کنیم:
<input name="users[]" type="checkbox" value="1">
با این کار مقدار فیلدها در قالب یک آرایه به سرور ارسال می شود و می توان در سرور با استفاده از حلقه for یا foreach مقادیر را استخراج کرد، در این حالت چک باکس ها را در اصطلاح چندگانه (Multiple) یا گروهی اطلاق می کنند.توسعه کد HTML و PHP حذف گروهی اطلاعات با امکانات بیشتر
برای تکمیل آموزش، کد بالا را با چند امکان کاربردی دیگر توسعه داده ایم که در زیر ملاحظه می کنید، این امکانات بسته به نیاز و هدفمان می توانند به نحو دلخواه به کد اضافه شوند، برای نمونه امکان انتخاب و عدم انتخاب چک باکس ها به صورت گروهی (Toggle Checkbox) با جاوا اسکریپت را به کد اضافه کرده ایم، قابلیت اعتبارسنجی و نمایش پیام اخطار در حالتی که کاربر هیچ کدام از چک باکس ها را انتخاب نکرده اما بر روی دکمه حذف کلیک می کند و هچنین در نظر گرفتن حالت حذف دو مرحله ای با پرسش از کاربر:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | حذف گروهی اطلاعات از دیتابیس با چک باکس - توسعه کد با امکانات بیشتر</title>
<!-- Webgoo.ir -->
<style type="text/css">
.row-container{
direction:rtl;
}
.row-1 {
background:#FFFFFF;
}
.row-2 {
background:#CCCCCC;
}
#confirm-id{
display:none;
position:absolute;
height:50px;
width:200px;
top:50%;
left:50%;
margin-top:-25px;
margin-left:-100px;
text-align:center;
background:#E5E5E5;
border:1px solid #666666;
}
</style>
<script type="text/javascript">
var checked = false;
function checkboxToggle(name){
var form = document.forms[name];
if(checked == false) {
checked = true
} else {
checked = false
}
for(var i = 0; i < form.elements.length; i++) {
if(form.elements[i].type == 'checkbox'){
form.elements[i].checked = checked;
}
}
}
function formCheck(form){
var check_one = false;
var check_confirm;
for(var i = 0; i < form.elements.length; i++) {
if(form.elements[i].type == 'checkbox' && form.elements[i].checked){
check_one = true;
break;
}
}
if(check_one){
check_confirm = 'آیا مطمئن هستید؟<br>';
check_confirm += '<input type="button" value="بله" onclick="formSubmit(\'' + form.name + '\');">';
check_confirm += '<input type="button" value="خیر" onclick="closeConfirm(\'confirm-id\');">';
document.getElementById('confirm-id').innerHTML = check_confirm;
document.getElementById('confirm-id').style.display = 'block';
} else{
alert('لطفا حداقل یک کاربر را انتخاب نمائید!');
}
}
function formSubmit(name){
closeConfirm('confirm-id');
document.forms[name].submit();
}
function closeConfirm(id){
document.getElementById(id).style.display = 'none';
}
</script>
</head>
<body>
<div class="row-container">
<?php
//تنظیمات پایگاه داده
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "db_test";
$tbl_name = "tbl_test";
//متغیرهای تعیین رنگ ردیف ها
$color_1 = '1';
$color_2 = '2';
$color = $color_1;
//دریافت پارامترها در هنگام ارسال فرم
@$users = $_POST['users'];
@$check = $_POST['check'];
//اتصال با دیتابیس
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if(!$conn) {
echo "Error!: " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
//اجرای پرس و جوی حذف ردیف ها در صورت ارسال فرم
if($check == 1){
$del_param = null;
$count_users = count($users);
for($i = 0; $i < $count_users; $i++){
$del_param .= "id=$users[$i]";
if($i + 1 < $count_users){
$del_param .= " OR ";
}
}
if($count_users > 0){
$query = mysqli_query($conn, "DELETE FROM $tbl_name WHERE $del_param");
if(!$query) {
echo "Error!: " . mysqli_error($conn) . '<br>';
} else{
echo 'تعداد ' . $count_users .' ردیف با موفقیت حذف شد!' . '<br>';
}
} else{
echo 'فیلدی برای حذف انتخاب نشده است!' . '<br>';
}
}
//پرس و جوی دریافت ردیف ها از دیتابیس و نمایش به صورت ردیف به ردیف
$query = mysqli_query($conn, "SELECT id, name FROM $tbl_name ORDER BY id ASC LIMIT 10");
if(!$query) {
echo "Error!: " . mysqli_error($conn);
} elseif(!mysqli_num_rows($query) > 0){
echo 'کاربری برای نمایش وجود ندارد!' . '<br>';
} else {
echo '<form name="del-form" action="#" method="post">' . "\n";
echo '<input id="del-toggle" type="checkbox" onclick="checkboxToggle(\'del-form\');">' . "<hr>\n";
while($row = mysqli_fetch_array($query)){
echo '<div class="row-' . $color . '">' . "\n" .
'<input name="users[]" type="checkbox" value="' . $row['id'] . '">نام کاربر: ' . $row['name'] . "\n" .
'</div>' . "\n";
if($color == $color_1){
$color = $color_2;
} else{
$color = $color_1;
}
}
echo '<input name="check" type="hidden" value="1">' . "\n";
echo '<hr><input type="button" value="حذف" onclick="formCheck(this.form);">' . "\n";
echo '</form>' . "\n";
echo '<div id="confirm-id"></div>' . "\n";
}
}
?>
</div>
</body>
</html>
برای اعمال این نوع امکانات معمولا باید از کدنویسی سمت کاربر و به طور خاص کدنویسی جاوا اسکریپت بهره جست، در نمونه کد بالا نیز برای ایجاد حالت انتخاب چندگانه، یک فیلد input از نوع checkbox در نظر گرفتته ایم که با رویداد onclick تابع checkboxToggle را فراخوانی می کند:<input id="del-toggle" type="checkbox" onclick="checkboxToggle('del-form');">
آرگیومنت این تابع مقادیر name فرم HTML است که در این مثال با عبارت del-form مشخص است، در تابع با متد document.forms به فرم دسترسی پیدا کرده و بررسی می کنیم که اگر چک باکس های فرم مد نظر حالت checked (تیک فعال) نداشته باشند، آنها را به صورت checked تنظیم کنیم و برعکس اگر به صورت checked بودن تیک آنها را برداریم، تابع دیگر formCheck است که در زمان کلیک کاربر بر روی دکمه حذف فراخوانی می شود، آرگیومنت این تابع همان فرم HTML است که این بار به صورت آبجکت به تابع داده شده، در واقع دو روش زیر هر دو یک کارکرد دارند و صرفا به جهت جنبه های آموزشی از دو شیوه به ظاهر متفاوت در دو تابع استفاده شده:document.forms[name]
this.form
<input type="button" value="حذف" onclick="formCheck(this.form);">
تابع formCheck از چند بخش تشکیل شده، در یک قسمت با متغیر check_one بررسی می کنیم که کاربر حداقل یک فیلد را انتخاب کرده باشد، در غیر اینصورت پیام قسمت alert اجرا می شود، در صورتی که کاربر حداقل یک فیلد را انتخاب کرده باشد یک کادر سفارشی با id دلخواه (در اینجا confirm-id) نمایش می دهیم، در این کادر با دو تابع formSubmit و closeConfirm رفتار مد نظر را بر اساس انتخاب کاربر اعمال می کنیم.دسته بندی: آموزش کاربردی » MySQL

صفحه بندی مطالب و محتوا با PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL
تعویض کد امنیتی Captcha با Ajax و MySQL
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
دیدگاه


۱۵:۴۷ ۱۳۹۳/۰۵/۲۱
سلام. ممنون از آموزش های خوبتون.
میشه مثال های کاربردی تر از ارتباط با دیتابیس شامل حذف ویرایش اطلاعات بصورت کلاسیک و همچنین امنیت سایت بذارید؟
میشه مثال های کاربردی تر از ارتباط با دیتابیس شامل حذف ویرایش اطلاعات بصورت کلاسیک و همچنین امنیت سایت بذارید؟
آموزش ها تا حد امکان در دو سطح مقدماتی و کاربردی ارائه شده، باید توجه داشته باشید که همه مباحث قابل پوشش نیست، خیلی از موارد جزئی تر در حین کدنویسی و تمرین فرا گرفته می شوند!
۰۱:۵۷ ۱۳۹۳/۰۵/۱۴
استاد خسته نباشید بنده در کد بالا تغییراتی دادم خیلی عالیه اما برای مثال 1000 تا کاربر یا ای دی داشته باشیم چطور باید صفحه بندی انجام دهیم برای مثال که 3 تاش توی صفحه اول باشه بقیش توی دیگر صفحات
اینم کد
اینم کد
حذف شد
با تشکردوست گرامی لطفا به آموزشی که در رابطه با صفحه بندی در سایت وجود دارد مراجعه کنید، برای دسترسی مستقیم عبارت "صفحه بندی محتوا با PHP و MySQL" را در وب جستجو کنید.
فدایی
۱۵:۵۶ ۱۳۹۳/۰۴/۱۱
با تشکر از زحمات شما
اشکال این کد اینکه حلقه حذف به تعداد رکوردهای جدول تکرار میشه حتی اگه یک رکورد را تیک زده باشی
لطفا اصلاح کنید
اشکال این کد اینکه حلقه حذف به تعداد رکوردهای جدول تکرار میشه حتی اگه یک رکورد را تیک زده باشی
لطفا اصلاح کنید
ضمن تشکر از نکته ای که ذکر کردید، آموزش مجددا بازبینی شد.
مهدی
۱۱:۴۲ ۱۳۹۳/۰۲/۲۷
با تشکر از سایت خوبتون
چطور ميشه يه چک باکس طراحي کرد که وقتي روش ميزني بقيه ي چک باکس هاي موجود تيک بخورن
چطور ميشه يه چک باکس طراحي کرد که وقتي روش ميزني بقيه ي چک باکس هاي موجود تيک بخورن
انجام این کار با جاوا اسکریپت ممکن است، می توانید از نمونه کد زیر برای انتخاب یا عدم انتخاب گروهی چک باکس ها استفاده کنید:
<script type="text/javascript">
checktoggle = true;
function toggleCheckAll(formname){
var checkboxes = new Array();
checkboxes = document.forms[formname].getElementsByTagName('input');
for(var i = 0; i < checkboxes.length; i++){
if(checkboxes[i].type == 'checkbox'){
checkboxes[i].checked = checktoggle;
}
}
if(checktoggle == true){
checktoggle = false;
}
else{
checktoggle = true;
}
}
</script>
<form name="test" action="#">
<input type="checkbox" name="toggle" onclick="toggleCheckAll('test');"><br>
<input type="checkbox" name="box-1" value="1">
<input type="checkbox" name="box-2" value="2">
<input type="checkbox" name="box-3" value="3">
</form>
۰۱:۰۷ ۱۳۹۲/۰۹/۳۰
با سلام استاد من برای سایتم یه قسمت برای (نسخه موبایل) درست کردم آیا سایت من یا سایت هایی که از این تکنیک استفاده می کنند با مطالب تکراری برای موتورهای جستجو روبرو می شوند و روی سئو تاثیر بد دارد البته بنده در این مورد حدث میزنم که همین طور است راهنمایی بفرمایید.
لطفا سوالات مربوط به بهینه سازی را در قسمت مربوطه مطرح کنید!
وجود مطلب یا لینک مشابه با هر عنوانی منجر به ایجاد مطالب تکراری (از دید موتور جستجو) می شود، برای جلوگیری از بروز این مشکل چند راه حل وجود دارد:
- نسخه ای به عنوان موبایل نداشته باشید، بلکه سایتی با قابلیت سازگاری بیشتر با موبایل و دستگاه های مشابه طراحی کنید.
- از تگ canonical استفاده کنید.
وجود مطلب یا لینک مشابه با هر عنوانی منجر به ایجاد مطالب تکراری (از دید موتور جستجو) می شود، برای جلوگیری از بروز این مشکل چند راه حل وجود دارد:
- نسخه ای به عنوان موبایل نداشته باشید، بلکه سایتی با قابلیت سازگاری بیشتر با موبایل و دستگاه های مشابه طراحی کنید.
- از تگ canonical استفاده کنید.
۲۳:۴۹ ۱۳۹۲/۰۹/۲۶
استاد مچکر مشکلم حل شد خیلی از شما یاد گرفتیم
من راجبه سشن خیلی تحقیق کردم سایت شما عالیه
اوس اوس اوس
من راجبه سشن خیلی تحقیق کردم سایت شما عالیه
اوس اوس اوس
۰۰:۳۵ ۱۳۹۲/۰۹/۲۵
سلام استاد من یه کدی رو دارم که صفحه لوگین کاربرام رو تشکیل میده لذا من یه سوال دارم میخوام به فرض در صفحه ای که لوگین میشند در کل نام کاربر نمایش داده بشه چطور باید این کار رو بکنم البته با سرچی که در همون صفحه کاربر گذاشتم این کار انجام میشه البته با آپدیت و... اما اگر به فرض کاربر اسم یوزر دیگری رو سرچ کنه مشخصات اون شخص میاد چه کدی میتونه نشست و سشن مورد نظر رو برای اسم در اون صفحه اجرا کنه لطفا کدی که بتونه سشن نام رو در صفحه کاربر نمایش بده رو بذارید و چه تغییری باید در کد لوگین و یا صفحه کاربر بدم
با تشکر اوس
اینم کد
با تشکر اوس
اینم کد
حذف شد
همان طور که خودتان اشاره کردید، مشکل شما به بحث سشن ها مربوط می شود، لذا باید مباحث مقدماتی آن را مطالعه کرده و در صورتی که خودتان قادر به حل مشکل نبودید، سوال مطرح و به قسمت اصلی کد ارجاع دهید (لطفا فرصت اندک ما و تعداد سوالات زیاد کاربران را نیز لحاظ کنید) به هر صورت، به نظر و طبق بررسی اولیه کدهای شما، از قسمت زیر می توانید برای نمایش نام کاربری استفاده کنید:
<?php
$_SESSION['MM_Username'] = $loginUsername;
echo $_SESSION['MM_Username'];
?>
یلدا
۱۱:۰۳ ۱۳۹۲/۰۹/۲۴
سلام و عرض تشکر بابت آموزش های کاربردی و گویاتون!
اگر لطف بفرمائید ، نحوه ی ارسال مقادیر تگ select به پایگاه و mysql را هم توضیحی بفرمائید.
مثلا چطور مقداری که کاربر از کشوی تگ سلکت انتخاب مبکند در mysql ذخیره کنیم و بعد ازش استفاده کنیم.
ممنون
اگر لطف بفرمائید ، نحوه ی ارسال مقادیر تگ select به پایگاه و mysql را هم توضیحی بفرمائید.
مثلا چطور مقداری که کاربر از کشوی تگ سلکت انتخاب مبکند در mysql ذخیره کنیم و بعد ازش استفاده کنیم.
ممنون
ارسال پارامتر از تگ select با تگ input و... خیلی متفاوت نیست، تنها در اینجا عنصر دیگری به نام option وجود دارد که در واقع همان مقادیر انتخاب شده است.
<select name="test">
<option value="1">1</option>
<option value="2">2</option>
</select>
سپس با ارسال فرم، مقادیر تگ select بر اساس پارامتر name آن، قابل دریافت با PHP و به تبع ذخیره سازی در MySQL است.$name = $_POST['test'];
میثم
۲۰:۳۶ ۱۳۹۲/۰۹/۰۸
از راهنمایی تون ممنونم.
ولی ارور
بازم روی کد نویسی کار می کنم. نمی دونم کجا دارم اشتباه می کنم.
دوباره از سایت خوب و مفیدتون ممنونم.
ولی ارور
Invalid argument supplied for foreach()
میده.بازم روی کد نویسی کار می کنم. نمی دونم کجا دارم اشتباه می کنم.
دوباره از سایت خوب و مفیدتون ممنونم.
میثم
۱۸:۴۷ ۱۳۹۲/۰۹/۰۸
سلام. از پاسختون ممنونم. ببخشید من سوال رو واضح مطرح نکردم.
ولی فکر کنم شما دقیقا منظور منو متوجه شدین.
من می خوام یه فرم برای ویرایش یا ایجاد هم زمان چند رکورد از پایگاه داده درست کنم که هر رکورد مقدار فیلد خودش رو داشته باشه.
توی اینترنت خیلی گشتم و تابع foreach رو بهم گفتن ولی من نحوه نوشتن تابع رو بلد نیستم. ممنون میشم کمکم کنید. کارم خیلی گیره.
ولی فکر کنم شما دقیقا منظور منو متوجه شدین.
من می خوام یه فرم برای ویرایش یا ایجاد هم زمان چند رکورد از پایگاه داده درست کنم که هر رکورد مقدار فیلد خودش رو داشته باشه.
توی اینترنت خیلی گشتم و تابع foreach رو بهم گفتن ولی من نحوه نوشتن تابع رو بلد نیستم. ممنون میشم کمکم کنید. کارم خیلی گیره.
در اصل شما باید این موارد را از مقدمات فرا بگیرید، چون مباحث به هم مرتبط و پیوسته هستند، به هر صورت نمونه کد زیر یک حالت ساده را نشان می دهد.
فرم HTML:
فرم HTML:
<form action="index.php" method="post">
<input name="name[]" type="text"><br>
<input name="name[]" type="text"><br>
<input name="name[]" type="text"><br>
<input name="check" type="hidden" value="1">
<input type="submit" value="ارسال">
</form>
نمونه کد سمت سرور:@$name = $_POST['name'];
@$check = $_POST['check'];
if(isset($check) && $check == '1'){
foreach($name as $key => $value){
mysqli_query($conn, "INSERT INTO t2 (name) VALUES ('$value')")
or die(mysqli_error($conn));
}
}
میثم
۱۲:۴۰ ۱۳۹۲/۰۹/۰۸
سلام. من یه مشکلی دارم که تقریبا شبیه این مطلب حدف گروهی هست.
من دیتابیسم دو جدول داره و می خوام یه سری اطلاعات از جدول اول گرفته بشه و داخل جدول دوم بیاد به همراه یه سری اطلاعات جدید دیگه. من کد ساخت تکی ردیف ها رو می دونم. اما توی ارسال مثلا 20 تا ردیف به صورت هم زمان مشکل دارم.
مثلا:
من یه فرم HTML طراحی کردم به صورت زیر:
من کد php که نوشتم و به صورت زیر هست:
به عبارت دیگه چطور میشه اطلاعات یک ستون رو تغییر بدیم!!!
ببخشید سوال خیلی طولانی بود و ممنون میشم کمکم کنید.
من دیتابیسم دو جدول داره و می خوام یه سری اطلاعات از جدول اول گرفته بشه و داخل جدول دوم بیاد به همراه یه سری اطلاعات جدید دیگه. من کد ساخت تکی ردیف ها رو می دونم. اما توی ارسال مثلا 20 تا ردیف به صورت هم زمان مشکل دارم.
مثلا:
من یه فرم HTML طراحی کردم به صورت زیر:
نام عدد
علی فیلد
حسین فیلد
عباس فیلد
دکمه ارسال فرم
که ستون نام رو از جدول اول میگیره و ستون عدد به صورت فیلد طراحی شده که داخل هم کدام یه عدد (یا تکراری یا غیر تکراری) نوشته میشه.من کد php که نوشتم و به صورت زیر هست:
if($_REQUEST['link']){
$res = mysql_query("select * from t1 where a = '1'");
while($row = mysql_fetch_array($res)){
$name = strip_tags($row['name']);
$adad = strip_tags($_POST['adad']);
$querypost="INSERT INTO t2(name,adad)
Values('$name','$adad')";
if(mysql_query($querypost) or die(mysql_error())){
$error = '<div id="result">درخواست شما با موفقیت ثبت شد !</div>';
}else $error = '<div id="bresult">خطا در ارسال اطلاعات - لطفا مجددا تلاش کنید !</div>';
}
}
توی جدول html (کدش رو قرار ندادم) اطلاعات کامل نشون داده میشه مثل فرم بالا. بعد که برای هر کدام عدد رو داخل فیلد می نویسم و روی ارسال کلیک می کنم توی جدول جدید اطلاعات درست ذخیره میشن یعنی توی ردیف اول اسم علی میاد و توی ردیف دوم اسم حسین میاد و ... اما مشکل اینجاست که عدد وارد شده برای همه تکرار میشه مثلا همه رو 2 مینویسه که اشتباه است.به عبارت دیگه چطور میشه اطلاعات یک ستون رو تغییر بدیم!!!
ببخشید سوال خیلی طولانی بود و ممنون میشم کمکم کنید.
دوست گرامی سوالتان خیلی مفهوم نیست، کمی پراکنده توضیح دادید، به نظر باید فیلد ها را به صورت یک آرایه ارسال کنید (یعنی نام فیلد شما علامت [] را در انتهای خود داشته باشد)، سپس در سمت سرور با یک حلقه foreach در بین کلید و مقدار آرایه دور تکرار داشته باشید و برای هر دور، دستور INSERT را داخل حلقه اجرا و مقادیر value را در دیتابیس ذخیره کنید.
قاعدتا باید با بحث فرم ها و همچنین کار با آرایه ها در PHP آشنا باشید، در غیر این صورت درک این مسئله کمی پیچیده به نظر می رسد.
قاعدتا باید با بحث فرم ها و همچنین کار با آرایه ها در PHP آشنا باشید، در غیر این صورت درک این مسئله کمی پیچیده به نظر می رسد.
جعفر
۲۰:۰۹ ۱۳۹۲/۰۹/۰۱
سلام. خیلی خیلی ممنونم. مشکلم حل شد. سایت وبگو تکه .......
جعفر
۱۶:۵۱ ۱۳۹۲/۰۸/۳۰
سلام. من می خوام تمامی اطلاعاتی رو که توی دیتابیسم هستند رو تا قبل از 2 ساعت زمانی فعلی حذف کنم و کد زیر رو نوشتم اما کد کار نمی کنه و اطاعات رو یکی یکی حذف می کنه ! خوشحال میشم اگه کمکم کنید:
$ti = time() - 7200;
$query = mysql_query("SELECT id FROM counter WHERE time < $ti ");
while($row = mysql_fetch_array($query)){
$id = $row['id'];
}
$delete = mysql_query("DELETE FROM counter WHERE id = '$id' ");
دستور delete را داخل حلقه while قرار دهید.
سمیه
۱۵:۴۱ ۱۳۹۲/۰۶/۲۳
بخشید که اینقدر سوال میپرسم. واقعا ممنون که وقت میذارید و جواب میدید.
کمی مطالعه ام رو بالا بردم. ظاهرا این تابع mt_rand خیلی ضعیفه.
شما یک تابع مناسب و امن CPRNG که منبع آنتروپی خوبی داشته باشه، برای تولید کلید سراغ دارید؟
کمی مطالعه ام رو بالا بردم. ظاهرا این تابع mt_rand خیلی ضعیفه.
شما یک تابع مناسب و امن CPRNG که منبع آنتروپی خوبی داشته باشه، برای تولید کلید سراغ دارید؟
می توانید از تابع زیر استفاده کنید:
<?php
function randomChar($len){
$return = NULL;
for($i=0;$i<$len;++$i){
if(!isset($urandom)){
if($i % 2 == 0) mt_srand(time() % 2147 * 1000000 + (double)microtime() * 1000000);
$rand = 48 + mt_rand() % 64;
}
else{
$rand = 48 + ord($urandom[$i]) % 64;
}
if($rand > 57){
$rand += 7;
}
if($rand > 90){
$rand += 6;
}
if($rand == 123){
$rand = 45;
}
if($rand == 124){
$rand = 46;
}
$return .= chr($rand);
}
return $return;
}
echo randomChar(20);
?>
البته در مواردی اینچنین که کلمه رمز صرفا یک عبارت رندم است و به فرض هش شده کلمه عبور و... نیست که قابل بازیابی باشد، اینکه از چه روشی استفاده کنید چندان اهمیتی ندارد، چون در نهایت یک عبارت رندم خواهید داشت، مهم سلب امکان حدس زدن اتفاقی عبارت است.سمیه
۱۴:۰۱ ۱۳۹۲/۰۶/۲۲
مرسی از پاسخگویی سریع شما.
مورد دوم رو درست کردم. ولی کلیدی که برای کاربر میفرستم یک کلید رندوم 90 کاراکتری هست. لزوم هش کردن کلید چیه؟ نظرتون راجع به کلید من چیه؟
مورد دوم رو درست کردم. ولی کلیدی که برای کاربر میفرستم یک کلید رندوم 90 کاراکتری هست. لزوم هش کردن کلید چیه؟ نظرتون راجع به کلید من چیه؟
private function getRandomString($length)
{
$validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $validCharNumber - 1);
$result .= $validCharacters[$index];
}
return $result;
}
سایت من یک مدیریت وظایف هست، میخوام تقویم ماهانه داشته باشه. و برای هر روز نشون بده کاری هست یا نه. اگر متوجه منظور شما شده باشم. باید بعد از طراحی هر فیلد تقویم، یک کوئری از جدول داشته باشم که این روز رو چک کنه، بعد در همون فیلد پیام مناسب رو بنویسه. این روش بار زیادی به سرور نمیده و باعث کاهش سرعت نمیشه؟ چون برای صفحه تقویم حدود 30 تا کوئری انجام میده!ایجاد کد رندم تنها شیوه ای است که کاربران متفاوت از هم شناسایی شوند، اهمیتی ندارد که از چه روشی برای تولید کاراکترهای اتفاقی استفاده کنید، منتها هر چه طول کاراکترها بیشتر باشد (به فرض حداقل 20 کاراکتر)، امنیت آنها بیشتر و احتمال استفاده از کاراکترهای اتفاقی کمتر و نزدیک به صفر می شود.
در مورد نحوه پرس وجو، این مورد نیاز به تجربه قبلی دارد، یعنی باید در مباحثی مانند آرایه، حلقه ها و... به اندازه ای تجربه داشته باشید که با حداقل کدنویسی و استفاده از دیتابیس به نتیجه نهایی برسید، به فرض در اینجا می توان اتفاقات بازه 30 روز را با یک پرس و جو فراخوانی و در حلقه while به صورت یک آرایه با کلید و مقدار موارد را نگهداری کرد، سپس در فیلدهای مورد نیاز استفاده نمود.
در مورد نحوه پرس وجو، این مورد نیاز به تجربه قبلی دارد، یعنی باید در مباحثی مانند آرایه، حلقه ها و... به اندازه ای تجربه داشته باشید که با حداقل کدنویسی و استفاده از دیتابیس به نتیجه نهایی برسید، به فرض در اینجا می توان اتفاقات بازه 30 روز را با یک پرس و جو فراخوانی و در حلقه while به صورت یک آرایه با کلید و مقدار موارد را نگهداری کرد، سپس در فیلدهای مورد نیاز استفاده نمود.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.