آموزش حذف گروهی اطلاعات از 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
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL
جستجو در مطالب سایت با استفاده از MySQL Full-Text
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
صفحه بندی مطالب و محتوا با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL
جستجو در مطالب سایت با استفاده از MySQL Full-Text
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
دیدگاه
۵۲ دیدگاه برای این مطلب ارسال شده است.
چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
مهیار
۱۳:۴۸ ۱۳۹۵/۱۱/۱۵
با درود
عزیز من خیلی جاهای دیگه هم دیدم که علامت @ رو میزارن قبل متغیر ها این به چه معناست و کجاها میشه (یا باید) استفاده کرد
ممنون
عزیز من خیلی جاهای دیگه هم دیدم که علامت @ رو میزارن قبل متغیر ها این به چه معناست و کجاها میشه (یا باید) استفاده کرد
ممنون
این علامت برای عدم نمایش خطاهای احتمالی مربوط به آن قسمت از کد در PHP است، استفاده از این علامت اختیاری است، به طور مثال گاهی ممکن است مقادیر یک متغیر وابسته به یک آدرس URL خارجی یا کلیدی از یک آرایه باشد (به طور مثال نام فیلد checkbox از آرایه متد POST در PHP)، در اینصورت اگر به هر دلیل مقادیر مورد انتظار از URL یا آرایه دریافت نشود (به فرض اگر فرم هنوز ارسال نشده باشد، کلید checkbox نیز در متد POST وجود ندارد)، PHP در حالت عادی خطایی در مرورگر چاپ خواهد کرد، اما با درج این علامت خطا از دید کاربر مخفی خواهد شد، دقت کنید که استفاده از این علامت باید با آگاهی قبلی انجام شود و در هنگام خطایابی باید حذف یا به روش دیگری بی اثر گردد!
mahdi
۱۶:۳۰ ۱۳۹۵/۰۴/۲۲
سلام چه جوری میشه اطلاعات به وسیله کمبو باکس insert تو دیتابیس
و همین طور search؟
کلا با کمبو باکس مشکل دارم
و همین طور search؟
کلا با کمبو باکس مشکل دارم
بر اساس پارامتر name تگ select می توانید مقادیر value مربوط به option را دریافت و در پرس و جوی خود مانند حالت معمول استفاده نمائید، مثال:
<select name="yourname">
<option value="value1">Value 1</option>
<option value="value2" selected="selected">Value 2</option>
<option value="value3">Value 3</option>
</select>
در کدهای PHP:<?php
$yourname = $_POST['yourname'];
?>
در نمونه پرس و جو:SELECT * FROM tbl WHERE col = $yourname;
نکته: این صرفا یک نمونه کد و جهت آشنایی بیشتر است، قاعدتا در یک کد کاربردی باید موارد دیگری از جمله ایمن سازی متغیرها قبل از استفاده در پرس و جو را با توجه به اکستنشن مورد نظر (MySQL, MySQLi, PDO)، رعایت کنید.محمود
۱۳:۱۸ ۱۳۹۵/۰۳/۳۰
ممنونم.
محمود
۱۰:۲۵ ۱۳۹۵/۰۳/۲۸
ممنون به خاطر پاسخ هایی که دادین.
منظورم از نظیر اینه که جدول شماره 2 به این صورته :
نمی دونم منظورمو رسوندم یا نه.
منظورم از نظیر اینه که جدول شماره 2 به این صورته :
check 1 Ali
check 2 Mahmood
check 3 Hoseen
حالا می خوام به جای check1, check2, check3 ,... عبارت Ali, Mahmood, Hoseen,... نمایش داده بشه.نمی دونم منظورمو رسوندم یا نه.
برای این نوع ساختار هیچ کد ساده ای وجود ندارد، ابتدا باید ردیف اصلی استخراج شود و اطلاعات هر چک باکس در قالب آرایه تجزیه شده و برای هر مقدار در حلقه یک پرس و جو برای پیدا کردن نظیر آن اجرا شود و در پر س و جو از شیوه های ترکیبی به طور مثال LIKE یا دستورات Regex استفاده کنید، این شیوه ساختار به هیچ وجه توصیه نمی شود و کار جستجوی اطلاعات را با مشکلات متعددی روبرو می کند، به فرض هم که با دستورات فوق ردیف متناظر پیدا شود نیز مجدد نیاز به کدنویسی و تجزیه اطلاعات است، دقیقا هدفتان را نمی دانیم اما سعی کنید ساختار تفکیک شده تری داشته باشید که جستجو در بین محتوا به این شکل نباشد و ستون ها و مقادیر از هم در ردیف های مختلف متمایز باشند.
محمود
۱۲:۱۱ ۱۳۹۵/۰۳/۲۶
سلام مجدد.
من یه فرم دارم که کاربر از بین حدود 50 تا چک باکس چند تا شو انتخاب میکنه و اونها به صورت :
حالا یه جدول دیگه دارم (شماره 2) که نظیر هر check یه متن توش ذخیره شده.
از چه کدی (کوئری) استفاده کنم که وقتی عبارت
فراخوانی میشه نظیرهای اونها توی جدول شماره 2 نمایش داده بشن.
مثلا بشه
من یه فرم دارم که کاربر از بین حدود 50 تا چک باکس چند تا شو انتخاب میکنه و اونها به صورت :
check1,check2,check3,...
توی یه ستون از یه سطر جدول شماره 1 دیتابیس ذخیره میشن.حالا یه جدول دیگه دارم (شماره 2) که نظیر هر check یه متن توش ذخیره شده.
از چه کدی (کوئری) استفاده کنم که وقتی عبارت
check1,check2,check3,...
از جدول شماره 1فراخوانی میشه نظیرهای اونها توی جدول شماره 2 نمایش داده بشن.
مثلا بشه
Ali,Mahmood,Hoseen,...
دقیق متوجه ساختار دیتابیس و سوالتان نشدیم! منظورتان از "نظیر" مشخص نیست! آیا شماره چک باکس با شماره متن مورد نظر بر اساس تعداد "," ملاک است؟ پاسخ همه این موارد باید روش و صریح باشد تا بتوان راه حلی پیشنهاد کرد! در حالت کلی می توان اطلاعات ردیف را به صورت کلی دریافت (چون در واقع یک ردیف است و تفکیک اطلاعات در پرس و جو کمکی به افزایش سرعت و... نمی کند) و سپس بر اساس علامت "," آنها را با توابعی مانند explode در PHP تجزیه و سپس بر اساس شماره چک باکس، مقادیر مورد نظر را دریافت کرد.
محمود
۱۲:۰۵ ۱۳۹۵/۰۳/۲۶
سلام.
شما برای انتخاب و شمارش چک باکس ها از حلقه for به صورت زیر استفاده کردین
ممنون
شما برای انتخاب و شمارش چک باکس ها از حلقه for به صورت زیر استفاده کردین
if($checkbox){
//شمارش تعداد چک باکس های انتخاب شده
@$count = count($checkbox);
for($i = 0; $i < $count; $i++){
@$del_id = $checkbox[$i];
$sql = "DELETE FROM $tb_name WHERE id = '$del_id'";
$result = mysql_query($sql) or die("حذف ردیف های دیتابیس میسر نیست");
}
//رفرش صفحه در صورت اجرای موفقیت آمیز کد
if($result){
echo '<meta http-equiv="refresh" content="0;URL=checkbox.php">';
}
}
من معمولا از حلقه foreach به صورت زیر استفاده می کنم$pets="";
$flag=0;
foreach($petathome as $entry){
$pets .= $entry.", ";
$flag=1;
}
if($flag==1){
$pets=rtrim($pets);
}
به کار بردن کدام روش هم از لحاظ سرعت و هم از لحاظ امنیت بهتره؟ممنون
کارکرد این دو دستور مشابهت های زیادی با هم دارند و اغلب به جای هم قابل استفاده هستند، هر دو به لحاظ استفاده استاندار هستند و به خودی خود مشکل امنیتی ندارند! منتها حلقه for می تواند برای مواقعی که کلید آرایه عددی است یا حلقه نیاز به شروع، توقف و پایان با یک مکانیزم عددی دارد، مناسبتر باشد، در مقابل حلقه foreach برای مواقعی که کلید و مقدار آرایه یک مقدار غیر عددی است مناسبتر خواهد بود.
سامان
۲۳:۴۱ ۱۳۹۴/۰۸/۲۲
ممنونم بابت پاسخ .
سامان
۲۱:۲۳ ۱۳۹۴/۰۸/۲۲
سلام
من آپلود کردم لینک دانلود کدهاشم گذاشتم ...
ممنون میشم اگه کمک کنید
باور کنید یک هفته درگیرشم به خیلیا هم گفتم.
من آپلود کردم لینک دانلود کدهاشم گذاشتم ...
ممنون میشم اگه کمک کنید
باور کنید یک هفته درگیرشم به خیلیا هم گفتم.
حذف شد
دوست گرامی صفحه بررسی شد، موارد اینچنینی را به علت زمانبر بودن معمولا کسی انجام نمی دهد! متاسفانه کدها طوری است که برای رسیدن به اهداف شما تقریبا کل کار باید از نو دوباره نویسی شود (کدهای آماده با آگاهی از کارکرد آنها باید استفاده شوند، در غیر اینصورت صرفا باعث درهم و برهم شدن و شلوغی سورس ها می شوند!) + توابع جداگانه ای برای بحث Ajax باید نوشته شود.
سامان
۱۴:۵۴ ۱۳۹۴/۰۸/۲۰
سلام
چطوری میشه با جی کوئری روی این input های چندگانه validation گذاشت. من هرکاری که میکنم نمیشه فقط به یدونه اینپوت میگیره. ببینید من یک سطر رو میخوام clone کنم که اون سطر هم قابلیت validation داره هم اینکه توسط یک تابع که تو نت موجوده کاربر بتونه فقط فارسی تایپ کنه. اما وقتی clone میکنم خاصیت validation رو از دست میده و اون خاصیت مقید بودن به فارسی نویسی رو هم از دست میده. در ضمن کد زیر رو برای مقید بودن به فارسی نویسی به input ها اضافه میکنم:
چطوری میشه با جی کوئری روی این input های چندگانه validation گذاشت. من هرکاری که میکنم نمیشه فقط به یدونه اینپوت میگیره. ببینید من یک سطر رو میخوام clone کنم که اون سطر هم قابلیت validation داره هم اینکه توسط یک تابع که تو نت موجوده کاربر بتونه فقط فارسی تایپ کنه. اما وقتی clone میکنم خاصیت validation رو از دست میده و اون خاصیت مقید بودن به فارسی نویسی رو هم از دست میده. در ضمن کد زیر رو برای مقید بودن به فارسی نویسی به input ها اضافه میکنم:
lan=fa
البته قبلش هم فانکشن جاوا اسکریپت مربوطه رو فراخوانی میکنم.این مشکل نیاز به بررسی دقیق سورس کدها دارد، احتمالا خطای Syntax برای فیلدهای اضافه یا مواردی مشابه این مورد وجود دارد، در صورت تمایل کدها را به صورت یک فایل HTML در سایت خود یا در یک سایت دیگر آپلود و آدرس صفحه را ارسال کنید تا بررسی گردد.
رضا
۱۸:۲۳ ۱۳۹۴/۰۸/۱۹
سلام خوبید
ممنون از سایت خوبتون
جناب من یک فرم دارم که شامل نام مقاله - نمره مقاله - مدرک موسسه و.. هست حال کاربر میتونه تا 10 بار این سطر رو clone کنه یعنی شاید 2 تا مقاله داشته باشه شاید ده تا و مهمتر اینکه همه این فیلدها بصورت آرایه ای هست و شاید مثلا کاربر تو یک سطر نام موسسه رو ننویسه و یا در سطر بعدی نام مقاله رو ننویسه اما به هر حال یک فیلد رو حتما پر میکنه اما کدام فیلده مشخص نیست..
حالا من این نوع فرم رو چطوری داخل جدول درج کنم؟؟؟
ممنون از سایت خوبتون
جناب من یک فرم دارم که شامل نام مقاله - نمره مقاله - مدرک موسسه و.. هست حال کاربر میتونه تا 10 بار این سطر رو clone کنه یعنی شاید 2 تا مقاله داشته باشه شاید ده تا و مهمتر اینکه همه این فیلدها بصورت آرایه ای هست و شاید مثلا کاربر تو یک سطر نام موسسه رو ننویسه و یا در سطر بعدی نام مقاله رو ننویسه اما به هر حال یک فیلد رو حتما پر میکنه اما کدام فیلده مشخص نیست..
حالا من این نوع فرم رو چطوری داخل جدول درج کنم؟؟؟
برای این کار باید با نحوه کار آرایه ها و ارسال فرم های چندگانه آشنا باشید، برای مثال به نمونه زیر دقت کنید:
<form action="index.php" method="post">
<input name="name[]" type="text">
<input name="family[]" type="text">
<input name="name[]" type="text">
<input name="family[]" type="text">
<input name="name[]" type="text">
<input name="family[]" type="text">
<input type="submit" value="Submit!">
</form>
<?php
$name = @$_POST['name'];
$family = @$_POST['family'];
for($i = 0; $i < count($name); $i++){
echo 'Name['.$i.']: '.$name[$i].'<br>';
echo 'Family['.$i.']: '.$family[$i].'<br>';
}
?>
در این مثال در بخش سمت کاربر (کدهای HTML) باید به کمک جاوا اسکریپت، فیلدهای اضافه را با نامی مشابه الگوی بالا ایجاد کنید، هر نام مشابه در واقع یک ایندکس از آرایه نهایی ما خواهد بود، سپس اطلاعات بعد از ارسال به صورت آرایه قابل دریافت هستند که در نهایت می توان با استفاده از حلقه ها (for، foreach و...) متناسب با نیاز بین اعضاء به اصطلاح دور زد و مقادیر پرس و جوی MySQL را در هر دور بر اساس کلید و مقدار همان دور اجرا کرد، در کدهای بالا این کار صرفا جهت راهنمایی و درک ساختار با دستور echo ساده انجام شده که در صورت آشنایی شما با نحوه نوشتن پرس و جوی دیتابیس، به راحتی قابل برداشت و استفاده است!نرگس
۱۸:۱۱ ۱۳۹۴/۰۶/۱۱
با تشکر از پاسخگویی شما. می توانید در قالب مثال بیان کنید. چون من متوجه نشدم.
برای این کار باید از input چندگانه (multiple) استفاده کنید (در این حالت تمام فیلدها یک نام دارند + علامت [])، به طور مثال:
<input type="text" id="user-1" name="user[]" value="1">
<input type="text" id="user-2" name="user[]" value="2">
<input type="text" id="user-3" name="user[]" value="3">
اینها باید در یک form با متد post استفاده شوند و در سمت سرور پارامترها به صورت آرایه از طریق متد POST قابل دریافت و استفاده هستند، به فرض:<?php
$my_array = $_POST['user'];
$loop = 1;
foreach($my_array as $key => $value){
echo 'input-'.$loop.' => '.$value.'<br>';
$loop++;
}
?>
نرگس
۰۶:۱۷ ۱۳۹۴/۰۶/۱۱
با سلام. من صفحه ای دارم که در آن صفحه نام چندین غذا موجود است و برای هر نام یک چک باکس قرار داده ام. حال می خواهم زمانی که تعدادی از این چک باکس ها انتخاب شد با فشردن دکمه ارسال که در همان صفحه قرار دارد نام غذاهای انتخاب شده در صفحه ای دیگر نمایش داده شود . اما در صفحه دیگر هیچ غذایی نمایش داده نمی شود. مشکل از کجاست؟ باتشکر
قاعدتا اشکال می تواند از هر قسمتی باشد که تنها با خطایابی مشخص خواهد شد! اما طبق روال کار ابتدا باید در فرم از چک باکس چندگانه استفاده کنید تا اطلاعات به شکل یک آرایه به سرور ارسال شوند، سپس در سرور با استفاده از حلقه for یا foreach به راحتی می توان موارد را چاپ کرد!
محسن طالع شايان
۰۴:۴۱ ۱۳۹۴/۰۱/۱۷
با سلام و خسته نباشيد
بنده يه كدي رو همانند آموزش شما نوشتم. حال ديتابيس بنده از نوع فيد خبرخوان هست و وقتي كه بخواي صفحه رو بياري براي حذف كردن به دليل ازدياد خبر لود نميشه.
حال چه دستوري بايد اضافه كنم كه وقتي مثلا بخواي 300 تا خبر رو پاك كني بهش بدي و اكي شه. و بشه گروهي 300 تا رو حذف كنم . و مجدد صفحه لود كنم و ادامه كار.
اگه ممكنه همين جا جوابم رو بديد ممنون ميشم.
باتشكر
بنده يه كدي رو همانند آموزش شما نوشتم. حال ديتابيس بنده از نوع فيد خبرخوان هست و وقتي كه بخواي صفحه رو بياري براي حذف كردن به دليل ازدياد خبر لود نميشه.
حال چه دستوري بايد اضافه كنم كه وقتي مثلا بخواي 300 تا خبر رو پاك كني بهش بدي و اكي شه. و بشه گروهي 300 تا رو حذف كنم . و مجدد صفحه لود كنم و ادامه كار.
اگه ممكنه همين جا جوابم رو بديد ممنون ميشم.
باتشكر
سوال کمی مبهم است! در صورت آشنایی با دستورات MySQL می توانید در پرس و جوی خود از LIMIT استفاده کرده و تعداد نتیاج دریافتی در هر درخواست را محدود کنید، البته این مباحث جزء آموزش های مقدماتی هستند که باید در جای خود فرا گرفته شوند!
پریسا
۱۲:۲۰ ۱۳۹۳/۱۱/۱۹
سلام
من توی سایت سرچ کردم سوالم رو نمیدونستم کجا مطرح کنم فقط این مطلب رو درباره ی چک باکس نمایش داد به ناچار اینجا مطرح میکنم.
من سه تا چک باکس دارم بنام های ناهار شام صبحانه
که میخوام هر کدام که تیک خورد در یک فیلد توی دیتابیس مثلا با نام food ذخیره بشه مشکل اینجاست که وقتی توی php اطلاعات رو میگیرم فقط صبحانه ذخیره میشه لطفا کمکم کنید
من توی سایت سرچ کردم سوالم رو نمیدونستم کجا مطرح کنم فقط این مطلب رو درباره ی چک باکس نمایش داد به ناچار اینجا مطرح میکنم.
من سه تا چک باکس دارم بنام های ناهار شام صبحانه
که میخوام هر کدام که تیک خورد در یک فیلد توی دیتابیس مثلا با نام food ذخیره بشه مشکل اینجاست که وقتی توی php اطلاعات رو میگیرم فقط صبحانه ذخیره میشه لطفا کمکم کنید
علت این نوع مشکلات بدون دیدن و بررسی سورس کدها قابل تشخیص نیست! باید قدم به قدم کدهای خود را خطایابی کنید، یعنی ابتدا ببینید که آیا فرم HTML صحیح است، به فرض پارامترهای مربوط به name در فرم و در کدهای PHP به درستی تنظیم شده، آیا مقدار فرم به سرور ارسال می شود، سپس ببینید که آیا این مقدار به درستی در پرس و جو قرار می گیرد و... در هر صورت بدون دیدن سورس کدها نمی توان مشکل را حدس زد!
۲۰:۲۷ ۱۳۹۳/۱۱/۰۴
سلام
ضمن تشکر از زحمات بی نظیر شما. به نظر می رسد یک جدول اضافی نوشته شده است که سودی ندارد. گرچه هیچ اختلالی ایجاد نمی کنه اما چون در ابتدا برای خود من سوال بود گفتم بهتون اطلاع بدم تا در صورت صلاحدید حذفش کنید.
منظورم کدی است که قبل از فرم باز شده:
ضمن تشکر از زحمات بی نظیر شما. به نظر می رسد یک جدول اضافی نوشته شده است که سودی ندارد. گرچه هیچ اختلالی ایجاد نمی کنه اما چون در ابتدا برای خود من سوال بود گفتم بهتون اطلاع بدم تا در صورت صلاحدید حذفش کنید.
منظورم کدی است که قبل از فرم باز شده:
<table width="400" dir="rtl">
<tr>
<td>
خیلی ممنون از توجه شما، بله ظاهرا همین طور است، در بازبینی مطالب سایت (که در آینده نزدیک صورت خواهد گرفت)، هم زمان با اعمال تغییرات دیگر در آموزش، اصلاح خواهد شد.
آخرین دیدگاه ها
برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
سیدعباسی
با سلام و خسته نباشید این کد رو نگاه کنید شروع می شن رو حذف کنم و فقط متن لینک باقی بمونه ولی...۱۴۰۳/۱۱/۰۲
امیرحسین
سلام وقت بخیر بنده میخوام با کمک curl دیتابیس پنل رو دانلود کنم و در یک فایل ذخیره کنم با دستور file_get_contents و ارسال...۱۴۰۳/۱۰/۲۹
عباسی
با سلام و خسته نباشید چطوری می تونم با یک الگو متن داخل کد زیر رو پیدا کنم: با تشکر۱۴۰۳/۱۰/۲۸
شریفی
اینجا هم یه سری توضیحات داده خیلی سر در نیاوردم ۱۴۰۳/۱۰/۲۴
شریفی
سلام وقت بخیر این نمونه هست که البته فقط توضیحاتش رو خوندم و خودم اسکریپت رو تست نکردم. فقط برام جالبه که...۱۴۰۳/۱۰/۲۴
شریفی
سلام وقت بخیر خوب هستین انشالله؟ من به تازگی با کتابخانه سدیم آشنا شدم مثل اینکه میشه برای کدگذاری روی فایل php ازش...۱۴۰۳/۱۰/۲۲
پرتو
سلام ممنونم از جوابتون اوکی مرسی از جواب ایمیل بله درسته جواب دادید و دیگ اینکه یه ایمیل دیگه هم تازگیا فرستادم ممنون میشم چک...۱۴۰۳/۱۰/۰۸
پرتو
سلام خوبید خسته نباشید ببخشید یه سوال داشتم اولا بهتون ایمیل دادم جواب ندادین دوما میگن قالب هام ساده هستند چیکار می تونم بکنم بنظرتون...۱۴۰۳/۱۰/۰۴
رضا
ممنونم از شما بابت وقتی که گذاشتید و پاسخ دادین. راستی یه سوال خدمت شما داشتم. بهترین راه برای اینکه بفهمیم که کاربر از...۱۴۰۳/۰۹/۲۷
رضا
اصلاح می کنم دیکودر ایرانی یون ۱۲ هم گویا پیدا شده امان از دست ...۱۴۰۳/۰۹/۲۱
رضا
سلام ممنون برای پاسخ خوبتون. فرمودین <نکته 1: با مبهم سازی، سورس ها همچنان قابل کپی هستند منتها برای انسان گیج کننده، نامفهوم و...۱۴۰۳/۰۹/۲۱
رضا
سلام من چند ماهی هست که کلی روی یه پروژه سیستم مدیریت محتوا با زبان php کار کردم و پروژه کامل شده. قصد...۱۴۰۳/۰۹/۲۰
ناشناس
سلام خسته نباشید وقتتون بخیر چطور می تونم با استفاده از حلقه وایل بزرگ ترین و کوچک ترین عدد را از بین چند عدد پیدا...۱۴۰۳/۰۹/۱۸
علایی
با سلام و درود بی پایان و خوشحالم که با این سایت آشنا شدم بنده وردپرس کار هستم اگه لطف بکنید و نحوه شمسی سازی...۱۴۰۳/۰۹/۱۲
روزمرگی های یک مهندس عمران
در جستجوی یک مطلب در مورد مهندسی عمران داشتم میگشتم که رسیدم به این سایت وبگو که یک سایت تخصصی آموزش برنامه نویسی وب و...۱۴۰۳/۰۹/۱۱
روزمرگی های یک مهندس عمران
من یک وبلاگ در بلاگ اسپات دارم و میخوام موتور جستجوی گوگل در وبلاگ استفاده کنم، پرسشم اینه که آیا خود بلاگر این ابزار را...۱۴۰۳/۰۹/۰۹
سیدعباسی
با تشکر از شما استاد بزرگوار تست کردم واسه اعداد بزرگتر بالا و پایین می کنه و صحیح نیست مثلا از یک تا ۹...۱۴۰۳/۰۹/۰۴
در انتظار بررسی: ۰
پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.
پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.