parsgreen.com
article

حذف مقادیر از 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 استفاده کرد.
sectionدسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
» ساخت دیتابیس، جدول و ردیف با دستور CREATE در MySQL
» استفاده از ORDER و GROUP در MySQL
» نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
» استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL
» نحوه استفاده از WHERE در MySQL
commentنظرات (۲۲ یادداشت برای این مطلب ارسال شده است)
نویسنده: Mahna
زمان: ۱۹:۲۸:۲۷ - تاریخ: ۱۳۹۱/۱۲/۰۴
سلام .. واقعا خسته نباشید به خاطر داشتن همچین سایت مفید و کارآمدی...
چندتا سوال داشتم :
‏1. چه جوری می تونم در بالای وبلاگم نوشته هایی رو به صورت متحرک و با سلیقه ی خودم داشته باشم؟ ( مثل زیرنویس تلویزیون) .. کد آن در سرویس دهنده ها موجود است؟ کد را باید در کجای قالب قرار بدهم؟
‏2. در کدام قسمت قالب کد مربوط به بخش نظرات قرار دارد؟ اگر بخواهم به جای "نظر بدهید" از عبارت دیگری استفاده کنم ، کدام قسمت را باید تغییر بدهم؟
‏3: از چه سرویس دهنده ی ابزار وبلاگ استفاده کنم تا امکان درج کدهای اسکریپت در پست ها برای بلاگفا وجود داشته باشد؟
ممنون از راهنماییتون ...
پاسخ: 
سلام
- برای مورد اول باید از تگ marquee استفاده کنید که آموزش آن در بخش آموزش های کاربردی html وجود دارد، کد را پس از تنظیم در هر جای قالب وبلاگتان (در قسمت ویرایش قالب) می توانید قرار دهید (هر چه بالاتر باشد، خروجی نیز در قسمت بالاتر نشان داده می شود، اگر با کدهای html آشنا نیستید، باید با آزمایش و خطا مکان درست را پیدا کنید).
- کد مربوط به نظرات معمولا در ابتدای کد قالب در پائین تر از تگ head قرار دارد، اگر دقت کنید دقیقا عبارت "نظر بدهید" را در آن خواهید یافت (اگر پیدا نکردید می توانید از قابلیت find در notepad یا مرورگر استفاده کنید)، کافی است متن خود را جایگزین آن کنید.
- متاسفانه این مورد به محدودیت های سرویس دهنده ارتباط دارد و دقیقا نمی دانیم چه سایت هایی از نظر آن مجاز است و چه سایت هایی غیر مجاز و معیار چیست!
نویسنده: زهرا
زمان: ۱۰:۱۰:۳۷ - تاریخ: ۱۳۹۱/۱۲/۰۷
با سلام. اگه ممكنه در مورد دستور join در sql و كاربرد آن در mysql توضيح دهيد
پاسخ: 
سلام
در یک تعریف ساده، از join برای انتخاب از دو یا چند جدول (به جای یک جدول) در هنگام اجرای پرس و جو (query) استفاده می شود، به طور مثال اگر اسامی افراد و سن آنها در یک جدول و میانگین وزن و سن در جدول دیگر باشد، می توان با یک پرس و جو با استفاده از join به فرض میانگین وزن افراد را استخراج کرد!
توضیحات بیشتر در این رابطه را در آموزش های بعد خواهیم گفت.
نویسنده: hamed
زمان: ۰۰:۰۸:۴۳ - تاریخ: ۱۳۹۲/۰۴/۲۳
عالی بود.
نویسنده: مهدی
زمان: ۲۰:۳۳:۰۵ - تاریخ: ۱۳۹۲/۰۶/۲۷
سلام
من میخوام از جدول بازدید چند تا آی پی رو حذف کنم
از این دستور استفاده میکنم ولی تغییری ایجاد نمیشه
DELETE FROM `bazdid` WHERE ip = '***.***.***.***'
مشکل چیه . میشه راهنمایی کنید.
پاسخ: 
سلام
اگرچه نقطه در MySQL معنی خاصی دارد، اما در حالتی که شما استفاده کرده اید، نباید خطایی رخ دهد، در هر صورت حل مشکل شما نیاز به بررسی و تست کدهای برنامه و دیتابیس به صورت کامل دارد، ممکن است ایراد از موردی جزئی یا به فرض از character set دیتابیس و collate جداول باشد.
نویسنده: مصطفی
زمان: ۱۴:۴۱:۳۹ - تاریخ: ۱۳۹۲/۰۷/۲۰
سلام
می خواستم بدونم نحوه ای ارتباط با پایگاه داده mysql چطور صورت می گیره و ایا اینکه مقادیر ابتدا تحلیل می شوند و بعد به پایگاه داده می روند یا در همان پایگاه داده تحلیل می شوند
پاسخ: 
سلام
در مفسر PHP افزونه هایی به نام Extension داریم (mysql, mysqli, PDO) که با الگوریتم هایی امکان برقراری ارتباط با نرم افزار پایگاه داده را فراهم می کنند، معمولا پایگاه داده محلی برای ذخیره و بازیابی اطلاعات است و تجزیه تحلیل در کدهای PHP انجام می شود، هر چند خود MySQL نیز توابعی از پیش تعریف شده و درونی برای انجام برخی محاسبات دارد.
نویسنده: مصطفی
زمان: ۲۰:۵۸:۳۷ - تاریخ: ۱۳۹۲/۰۷/۲۲
با تشکر از مطلبتون اگه ممکنه توضیح بدید چطور میشه بین جدول های پایگاه داده ارتباط برقرار کرد مثلا ما 2 تا جدول داریم که یکیش مربوط به اطلاعات کاربر هست و یه جدول که مربوط به تنظیمات شخصی کاربر هست و ایا استفاده از چند جدول توصیه میشه؟
پاسخ: 
ارتباط جداول مختلف در MySQL امری عادی و مرسوم است (جدول را با دیتابیس اشتباه نگیرید!)، به فرض جدول مشخصات کاربر با جدول اطلاعات مالی او، نحوه برقراری ارتباط می تواند به صورت دستورات ساده (پرس و جو با SELECT و... به صورت مجزا) یا دستوراتی پیچیده تر مبتنی بر توابعی مانند JOIN، LEFT JOIN و... باشد.
نویسنده: سید سام حسینی
زمان: ۰۶:۳۰:۳۰ - تاریخ: ۱۳۹۲/۰۷/۲۳
اقا خیلی دمتون گرم
به قول ما شیرازیا خدا یارت کاکو
نویسنده: مصطفی
زمان: ۱۳:۱۰:۵۰ - تاریخ: ۱۳۹۲/۰۷/۲۴
با تشکر
در مورد ارتباط خارجی میشه توضیح بدید روش استاندارد واسه برقراری ارتباط بین دو جدول کدومه
پاسخ: 
منظور از "به صورت مجزا" این است که به فرض مقادیر یک جدول را با یک پرس و جوی SELECT اسخراج کرده و در ادامه برای جدول دیگر، از یک پرس و جوی دیگر استفاده شود، اینکه شیوه عادی را انتخاب کنید یا استفاده از JOIN و... (ترکیب دستورات در یک دستور)، بستگی به شرایط دارد، به فرض اگر پرس و جو خیلی پیچیده نیست یا دو جدول کاملا به هم مرتبط هستند، یکی کردن آن می تواند روش خوبی باشد تا در کدنویسی صرفه جویی و سرعت کار افزایش پیدا کند، اما اگر جداول مستقل هستند یا ترکیب آنها باعث پیچیده شدن درک کدها می شود، روش عادی به شرط رعایت سایر موارد مربوط به نوشتن پرس و جوهای بهینه، مشکلی ایجاد نمی کند.
نویسنده: مصطفی
زمان: ۱۵:۴۲:۱۶ - تاریخ: ۱۳۹۲/۰۷/۲۴
یعنی اگه واسه هر کاربر در دو یا سه جدول اطلاعات متفاوتی داشته باشیم نیازی به برقراری پیوند بین جداول نیست؟
پاسخ: 
تا حد ممکن باید اطلاعات را طوری سازمان دهی کنید که نیاز به اینگونه موارد نباشد، اما اگر ساختار سیستم و دیتابیس اجازه نداد، از روش LEFT JOIN و... استفاده کنید.
نویسنده: مصطفی
زمان: ۲۳:۴۶:۵۸ - تاریخ: ۱۳۹۲/۰۷/۲۹
سلام
اگه میشه درباره دو نوع فرمت 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 توصیه می شود.
نویسنده: خلیل
زمان: ۰۱:۱۰:۴۵ - تاریخ: ۱۳۹۲/۰۸/۰۱
بازم خیلی ممنون
نویسنده: hamed
زمان: ۲۰:۴۵:۰۹ - تاریخ: ۱۳۹۲/۰۸/۱۲
سلام
من در یک پایگاه داده 2 جدول دارم که برای جستجو در پایگاه داده ناگزیر هستم که در query از UNION استفاده کنم ولی زمانی که رکوردها رو fetch می کنم مشخص نیست که کدام رکورد مربوط به کدام جدول بوده. از AS هم استفاده کردم و جواب نگرفتم
ممکن هست که با یک مثال ساده راه کار رو به من نشون بدین؟ ممنون
پاسخ: 
سلام
تا آنجا که اطلاع داریم، هنگامی که از UNION استفاده می کنیم، به ناچار خروجی موارد مشترک باید در یک ستون و با یک نام مشترک تعریف شود، لذا تنها راه حل اینکه بدانید کدام مقدار از کدام جدول گرفته شده، تعریف یک ستون است که به فرض کد هر جدول را در خود داشته باشد.
نویسنده: نیلوفر
زمان: ۰۰:۳۶:۰۸ - تاریخ: ۱۳۹۲/۰۸/۱۳
سلام من میخوام از یه جدول که چند تا ردیف داره، یک ردیفش رو حذف کنم که هر ستون این جدول از یک 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 هیچ کاری را بی دلیل انجام نمی دهد!
نویسنده: نیلوفر
زمان: ۰۰:۴۸:۱۹ - تاریخ: ۱۳۹۲/۰۸/۱۳
دوباره سلام
برای یادگیری کار با توابعی مثل join , left باید به کدوم صفحه از سایتتون مراجعه کنم؟؟؟ یا اگه میشه لطفا همینجا یک نمونه کدش رو بنویسید و توضیح دهید خیییییییییییییلی ممنون
پاسخ: 
سلام
لطفا در وب جستجو کنید، هنوز مطالب مربوط به این مباحث آماده انتشار نیست!
نویسنده: رضا
زمان: ۲۳:۴۴:۲۶ - تاریخ: ۱۳۹۲/۰۸/۱۳
اگه بخوایم مثلا از توابع و رویه ها یا شرط ها در سمت سرور استفاده کنیم بهتره از کدهای php استفاده کنیم بعد منتقلش کنیم به mysql یا در همان پایگاه داده از این قابلیت ها استفاده کنیم
پاسخ: 
در اغلب موارد استفاده از PHP به دلیل سرعت بالاتر در این خصوص توصیه می شود، مگر در مورد برخی توابع که خللی به سرعت اجرای پرس و جو وارد نمی کنند.
paged صفحه 1 از 2




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

3 × 6
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...