شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

حذف مقادیر از MySQL با دستور DELETE

mysql-delete

مدیریت اطلاعات پایگاه داده به ذخیره (INSERT)، انتخاب (SELECT) و به روزرسانی (UPDATE) ختم نمی شود، دیر یا زود و به دلایل مختلف، سیستم ما نیاز خواهد داشت که مواردی را از دیتابیس حذف نماید، از این رو یکی دیگر از پرس و جوهای (query های) MySQL، دستور حذف ردیف ها با استفاده از DELETE است که در ادامه با آن آشنا خواهیم شد، آشنایی دقیق با این دستور از این لحاظ حائز اهمیت است که اگر در تعیین پارامترهای آن اشتباهی انجام دهیم، ممکن است موجب حذف مواردی ناخواسته شویم.

شیوه نگارش (syntax) دستور DELETE


نحوه استفاده از دستور DELETE در MySQL شباهت زیادی با سایر دستوراتی که تا این لحظه بررسی کرده ایم (مانند SELECT، UPDATE و...) دارد و البته رعایت نکات خاص آن نیز ضروری است، به مثال زیر توجه کنید.
<?php
mysql_query("DELETE FROM table WHERE id = '1'")
or die(mysql_error());
?>
با این دستور ساده، ردیف یا ردیف هایی در دیتابیس که مقادیر ستون id آنها برابر عدد 1 باشد حذف خواهند شد، ملاحظه می کنید که اگر به فرض پارامتر WHERE استفاده نشود یا اینکه به اشتباه تعیین گردد، موجب حذف موارد ناخواسته خواهد شد، لذا در استفاده از دستور DELETE باید دقت نمود و قبل از هر چیز از اطلاعات حساس دیتابیس پشتیبان تهیه کرده و دستورات را نیز قبل از استفاده نهایی، حتی الامکان تست کرد.

یک مثال کاربردی با دستور DELETE


برای آشنایی بیشتر با دستور DELETE، یک مثال کاربردی را با هم مرور می کنیم، فرض کنید در دیتابیس خود در جدول users اسامی و مشخصات کاربران را در ستون های id، name، pass، age و... ذخیره کرده ایم، حال می خواهیم کاربرانی که نام آنها با حرف ب فارسی یا B لاتین شروع می شود را حذف کنیم، بدین منظور خواهیم نوشت:
<?php
$con = mysql_connect("localhost","root","")
or die(mysql_error());

mysql_select_db("test")
or die(mysql_error());

$search_fa = 'ب';
$search_en = 'B';

$delete = mysql_query("DELETE FROM users WHERE name LIKE '$search_fa%' OR name LIKE '$search_en%'")
or die(mysql_error());

mysql_close($con);
?>
توضیح:
- همان طور که ملاحظه می کنید، در دستور DELETE می توانیم از WHERE و پارامترهای وابسته به آن مانند OR ، AND ، LIKE و... استفاده کنیم.
- هنگامی که در کنار دستور DELETE از WHERE و LIKE استفاده می کنیم، باید دقت کنیم که علامت % در ابتدا، انتها یا در هر دو سمت پارامتر، نقشی تعیین کننده در نحوه تفسیر دستورمان خواهد داشت که البته در این مورد در مباحث قبلی صحبت کرده ایم.

حذف مقادیر چندگانه با دستور DELETE


در پایان این آموزش بد نیست یک مثال پیشرفته تر را نیز با هم بررسی کنیم، حتما تا به حال صفحات و سایت هایی را دیده اید که با انتخاب چند مورد، می توان تمام آنها را در یک بار و هم زمان حذف نمود، برای این کار ابتدا یک فرم HTML در نظر می گیریم که مقادیر را به صورت آرایه ارسال کند.
<form action="#" method="post">
<input type="checkbox" name="delete[]" value="1">
<input type="checkbox" name="delete[]" value="2">
<input type="checkbox" name="delete[]" value="3">
<input type="checkbox" name="delete[]" value="4">
<input type="submit" value="ارسال">
</form>
نکته: علامت [] در قسمت نام فیلدها باعث می شود موارد به صورت یک آرایه به سرور ارسال شوند.
سپس در سرور از حلقه های for یا foreach می توانیم استفاده کنیم، به مثال زیر توجه کنید.
<?php
@$delete_array = $_POST['delete'];

$con = mysql_connect("localhost","root","")
or die(mysql_error());

mysql_select_db("test")
or die(mysql_error());

foreach($delete_array as $key => $value){
    $delete = mysql_query("DELETE FROM users WHERE id = '$value' LIMIT 1")
    or die(mysql_error());
}

mysql_close($con);
?>
توضیح:
- برای دریافت متغیر ارسال شده از طرف فرم HTML کافی است از روش های معمول (متد GET یا POST) استفاده کنید.
- اکنون اگر از متغیر delete_array با دستور print_r خروجی بگیرید، کلیدها و مقادیر آرایه به صورت زیر خواهد بود.
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
به این ترتیب می توان در یک دستور foreach از کلید و مقدار آرایه ارسال شده در query مربوط به DELETE استفاده کرد.
دسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
آموزش MySQL، سیستم مدیریت پایگاه داده
ساخت دیتابیس، جدول و ستون با دستور CREATE در MySQL
اتصال PHP به MySQL با اکستنشن MySQLi
به روز رسانی ردیف ها در MySQL با UPDATE
دیدگاه
more ۳۴ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
نیما
۱۸:۵۹ ۱۳۹۳/۰۱/۲۶
سلام.
چه جوری میشه زمان دار رکوردهای جداول رو حذف کرد.
مثلا بعد از 2 دقیقه رکورد ها حذف بشن
سلام
باید از phpMyAdmin و قابلیت تنظیم event استفاده کنید، همچنین در cPanel امکان استفاده از cron jobs و فراخوانی یک فایل PHP وجود دارد.
امير
۱۲:۲۴ ۱۳۹۲/۱۱/۱۸
با سلام و تشكر از شما ، بله منظورم همان داده های ذخيره شده در ديتابيس است .
امير
۱۹:۰۹ ۱۳۹۲/۱۱/۱۵
با سلام و تشكر از شما به خاطر مطالب مفيد و راهنمايي هاي بي دريغتان:
من مي خواهم بعد از گذشت مدت زماني معين فايل ها به صورت خودكار از ديتابيس پاك شوند . خواهشا اگر امكان دارد دستورش را برام بزاريد خيلي لازمه. ممنون
سلام
سوالتان واضح نیست! در دیتابیس فایلی ذخیره نمی شود؟! اگر منظور فایل است باید از امکانات سرور مانند قابلیت Cron Jobs (که در cPanle وجود دارد) استفاده کنید، اما اگر منظور اطلاعات دیتابیس است باید از بخش Events در MySQL استفاده کنید.
مصطفی
۰۳:۰۴ ۱۳۹۲/۱۰/۲۴
سلام با تشکر از زحماتتون
میشه توضیح بدید چطور میشه از فیلدهای timestamp یا timedate برای اجرای دستورات در یک زمان مشخص استفاده کرد مثلا می خوایم 1 ساعت بعد یک سطر از جدول update بشه
سلام
بدین منظور می توانید از EVENT در MySQL استفاده کنید، مثال:
CREATE EVENT `test` ON SCHEDULE AT '2014-01-14 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE tbl_1 SET num = 1 WHERE  num = 0
این قابلیت از برنامه phpMyAdmin نیز قابل دسترسی است.
رضا
۲۳:۴۴ ۱۳۹۲/۰۸/۱۳
اگه بخوایم مثلا از توابع و رویه ها یا شرط ها در سمت سرور استفاده کنیم بهتره از کدهای php استفاده کنیم بعد منتقلش کنیم به mysql یا در همان پایگاه داده از این قابلیت ها استفاده کنیم
در اغلب موارد استفاده از PHP به دلیل سرعت بالاتر در این خصوص توصیه می شود، مگر در مورد برخی توابع که خللی به سرعت اجرای پرس و جو وارد نمی کنند.
نیلوفر
۰۰:۴۸ ۱۳۹۲/۰۸/۱۳
دوباره سلام
برای یادگیری کار با توابعی مثل join , left باید به کدوم صفحه از سایتتون مراجعه کنم؟؟؟ یا اگه میشه لطفا همینجا یک نمونه کدش رو بنویسید و توضیح دهید خیییییییییییییلی ممنون
سلام
لطفا در وب جستجو کنید، هنوز مطالب مربوط به این مباحث آماده انتشار نیست!
نیلوفر
۰۰:۳۶ ۱۳۹۲/۰۸/۱۳
سلام من میخوام از یه جدول که چند تا ردیف داره، یک ردیفش رو حذف کنم که هر ستون این جدول از یک table در دیتابیسم خونده شده. اما هر ردیف رو که حذف میزنم فقط ردیف آخری رو حذف میکنه. مشکل کجاست؟؟؟ 4 تا table دارم که 4 تا دستور delete نوشتم.
ممنون برای سایت خوبتون
$sql=" DELETE FROM gheymat WHERE nerkh='$_SESSION[nerkh]' and idn='$_SESSION[idn]';";
$result=mysql_query($sql);
if($result)
{
header("location:tedad_kala.php");}
else
$not="<h3>حذف نشد</h3>";

$sql1="DELETE FROM model WHERE name_m='$_SESSION[name_m]' and idn='$_SESSION[idn]';";
$result1=mysql_query($sql1);
if($result1)
{
header("location:tedad_kala.php");}
else
$not="<h3>حذف نشد</h3>";

$sql2="DELETE FROM mojodi WHERE tedad='$_SESSION[tedad]' and idn='$_SESSION[idn]' ;";
$result2=mysql_query($sql2);
if($result2)
{
header("location:tedad_kala.php");}
else
$not="<h3>حذف نشد</h3>";

$sql3="DELETE FROM tozihat WHERE matn='$_SESSION[matn]' and idn='$_SESSION[idn]' ;";
$result3=mysql_query($sql3);
if($result3)
{
header("location:tedad_kala.php");}
else
$not="<h3>حذف نشد</h3>";
سلام
به نظر مشکل شما از اجرای دستور header بعد از هر حذف موفقیت آمیز است، این دستور باعث می شود تا پردازش کدها متوقف و کاربر به فایل tedad_kala.php منتقل شود!
باید معنی دستوراتی که می نویسید را به خوبی درک کنید، مفسر PHP هیچ کاری را بی دلیل انجام نمی دهد!
hamed
۲۰:۴۵ ۱۳۹۲/۰۸/۱۲
سلام
من در یک پایگاه داده 2 جدول دارم که برای جستجو در پایگاه داده ناگزیر هستم که در query از UNION استفاده کنم ولی زمانی که رکوردها رو fetch می کنم مشخص نیست که کدام رکورد مربوط به کدام جدول بوده. از AS هم استفاده کردم و جواب نگرفتم
ممکن هست که با یک مثال ساده راه کار رو به من نشون بدین؟ ممنون
سلام
تا آنجا که اطلاع داریم، هنگامی که از UNION استفاده می کنیم، به ناچار خروجی موارد مشترک باید در یک ستون و با یک نام مشترک تعریف شود، لذا تنها راه حل اینکه بدانید کدام مقدار از کدام جدول گرفته شده، تعریف یک ستون است که به فرض کد هر جدول را در خود داشته باشد.
خلیل
۰۱:۱۰ ۱۳۹۲/۰۸/۰۱
بازم خیلی ممنون
مصطفی
۲۳:۴۶ ۱۳۹۲/۰۷/۲۹
سلام
اگه میشه درباره دو نوع فرمت myisam و innodb یه توضیحی بدید کدوم مناسب تره مثلا برای سایتی که توش فرم عضویت و انجمن داره. با تشکر
سلام
MYISAM و INNODB فرمت نیستند، موتورهای MySQL هستند که تفاوتهایی با هم دارند:
MYISAM
- از Table-level Locking استفاده می کند، یعنی به فرض اگر جدولی در حال نوشتن توسط کاربری باشد، در همان میلی ثانیه، کاربر دیگر نمی تواند در آن جدول چیزی بنویسد (ممکن است برای سایت های خیلی خیلی بزرگ مشکل ساز باشد).
- سرعت بالاتری دارد.
- در مواقع Crash کردن معمولا باید دستی جداول چک شوند.
- میزان فضای زیادتری برای ذخیره اطلاعات دارد (256 Terabytes).
- امکانات جستجوی پیشرفته تری دارد (Full Text indexing).
- از transaction پشتیبانی نمی کند، یعنی دستور به محض اجرا، انجام می شود و امکان بازگشت نیست.
INNODB
- از Row-level Locking استفاده می کند، یعنی تنها ردیفی قفل می شود که در حال استفاده است.
- تنظیم شده برای کار با داده های حجیم است.
- از transaction پشتیبانی می کند.
- در مقایسه با MYISAM حداکثر حجم کمتری دارد (64 Terabytes).
نتیجه:
اگر امکاناتی مانند جستجوی پیشرفته مبنی بر دیتابیس (با امکانات خود MySQL) برایتان اهمیت دارد، یا صرفا یک سایت با تعداد کاربر در حد معمول (حتی به فرض تا 100 یا 200 هزار نفر در روز) دارید، MYISAM از این نظر مشکلی نخواهد داشت، در غیر این صورت استفاده از INNODB توصیه می شود.
مصطفی
۱۵:۴۲ ۱۳۹۲/۰۷/۲۴
یعنی اگه واسه هر کاربر در دو یا سه جدول اطلاعات متفاوتی داشته باشیم نیازی به برقراری پیوند بین جداول نیست؟
تا حد ممکن باید اطلاعات را طوری سازمان دهی کنید که نیاز به اینگونه موارد نباشد، اما اگر ساختار سیستم و دیتابیس اجازه نداد، از روش LEFT JOIN و... استفاده کنید.
مصطفی
۱۳:۱۰ ۱۳۹۲/۰۷/۲۴
با تشکر
در مورد ارتباط خارجی میشه توضیح بدید روش استاندارد واسه برقراری ارتباط بین دو جدول کدومه
منظور از "به صورت مجزا" این است که به فرض مقادیر یک جدول را با یک پرس و جوی SELECT اسخراج کرده و در ادامه برای جدول دیگر، از یک پرس و جوی دیگر استفاده شود، اینکه شیوه عادی را انتخاب کنید یا استفاده از JOIN و... (ترکیب دستورات در یک دستور)، بستگی به شرایط دارد، به فرض اگر پرس و جو خیلی پیچیده نیست یا دو جدول کاملا به هم مرتبط هستند، یکی کردن آن می تواند روش خوبی باشد تا در کدنویسی صرفه جویی و سرعت کار افزایش پیدا کند، اما اگر جداول مستقل هستند یا ترکیب آنها باعث پیچیده شدن درک کدها می شود، روش عادی به شرط رعایت سایر موارد مربوط به نوشتن پرس و جوهای بهینه، مشکلی ایجاد نمی کند.
سید سام حسینی
۰۶:۳۰ ۱۳۹۲/۰۷/۲۳
اقا خیلی دمتون گرم
به قول ما شیرازیا خدا یارت کاکو
مصطفی
۲۰:۵۸ ۱۳۹۲/۰۷/۲۲
با تشکر از مطلبتون اگه ممکنه توضیح بدید چطور میشه بین جدول های پایگاه داده ارتباط برقرار کرد مثلا ما 2 تا جدول داریم که یکیش مربوط به اطلاعات کاربر هست و یه جدول که مربوط به تنظیمات شخصی کاربر هست و ایا استفاده از چند جدول توصیه میشه؟
ارتباط جداول مختلف در MySQL امری عادی و مرسوم است (جدول را با دیتابیس اشتباه نگیرید!)، به فرض جدول مشخصات کاربر با جدول اطلاعات مالی او، نحوه برقراری ارتباط می تواند به صورت دستورات ساده (پرس و جو با SELECT و... به صورت مجزا) یا دستوراتی پیچیده تر مبتنی بر توابعی مانند JOIN، LEFT JOIN و... باشد.
مصطفی
۱۴:۴۱ ۱۳۹۲/۰۷/۲۰
سلام
می خواستم بدونم نحوه ای ارتباط با پایگاه داده mysql چطور صورت می گیره و ایا اینکه مقادیر ابتدا تحلیل می شوند و بعد به پایگاه داده می روند یا در همان پایگاه داده تحلیل می شوند
سلام
در مفسر PHP افزونه هایی به نام Extension داریم (mysql, mysqli, PDO) که با الگوریتم هایی امکان برقراری ارتباط با نرم افزار پایگاه داده را فراهم می کنند، معمولا پایگاه داده محلی برای ذخیره و بازیابی اطلاعات است و تجزیه تحلیل در کدهای PHP انجام می شود، هر چند خود MySQL نیز توابعی از پیش تعریف شده و درونی برای انجام برخی محاسبات دارد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
7 × 9
20 × 20
=