- پنجشنبه 23 مهر 1405 ساعت 00:00
- 3.1.9
- کامل شده
- منقضی شده
کلاس Database امکان اجرای SQL مستقیم و استفاده از Query Binding را فراهم میکند. متد query() دستور SQL را اجرا میکند و در صورت نیاز آرایه مقادیر را بهعنوان Binding میپذیرد. برای عملیات خواندن، نتیجه به شکل Query Result برمیگردد و برای عملیات نوشتن میتوانید تعداد ردیفهای تغییرکرده را دریافت کنید.
ساختار و API اصلی
مقادیر ورودی را با Binding ارسال کنید تا بهعنوان داده به Query متصل شوند. برای شناسه جدول یا نام ستون که قابل Binding نیستند، از فهرست مجاز استفاده کنید. escape() و escape_str() برای Escape مقدار و رشته کاربرد دارند، اما Query Binding معمولاً انتخاب سادهتر و امنتری است.
نمونه استفاده
$query = $this->db->query('SELECT id, name FROM products WHERE status = ? AND price >= ?', array('active', 100000));
foreach ($query->result() as $row) {
echo $row->name;
}نکته مهم
از الحاق مستقیم ورودی کاربر به SQL خودداری کنید. برای Queryهای پیچیده از Query Builder استفاده کنید و Queryهای پرهزینه را با EXPLAIN بررسی کنید.
مطالعه مرتبط
برای ادامه مطالعه، MVC، کوئری، ترنزکشن را ببینید.
روشهای اجرای Query
| متد یا مفهوم | کاربرد |
|---|---|
query($sql) | اجرای SQL مستقیم. |
query($sql, $binds) | اجرای SQL با Binding پارامتر. |
escape($value) | Escape مقدار. |
escape_str($str) | Escape رشته. |
last_query() | نمایش آخرین SQL اجراشده. |
simple_query() | اجرای Query با مسیر سادهتر و بدون ساخت Result کامل. |
نکات عملی برای دیتابیس
پیش از استفاده در محیط واقعی، Driver و نسخه موتور دیتابیس را با قابلیتهای موردنیاز تطبیق دهید. Queryهای دارای ورودی کاربر باید Binding داشته باشند، عملیات چندمرحلهای باید در Transaction قرار بگیرند و برای Queryهای پرتکرار، Index و Execution Plan بررسی شود. تعداد Queryها و حجم Result نیز روی حافظه و زمان پاسخ اثر دارد.
برای عیبیابی، SQL تولیدشده، تعداد ردیفهای متاثر و زمان اجرا را در محیط توسعه ثبت کنید. در Production اطلاعات محرمانه را از Log حذف کنید و خطاهای دیتابیس را به کاربر نشان ندهید. اگر ساختار جدول تغییر میکند، تغییر را نسخهبندی و پیش از اجرا Backup بگیرید.
در بازبینی کد، ترتیب و نتیجه متدهای query($sql)، query($sql, $binds)، escape($value)، escape_str($str) را بررسی کنید. نام متد بهتنهایی تضمین نمیکند ورودی معتبر یا خروجی امن باشد، بنابراین رفتار هر متد را با تست و مستندات همان نسخه کنترل کنید.