أهداف الدرس
- أتعرّف على مفهوم عمليات CRUD وكيفية تطبيقها على قواعد البيانات.
- أُدرج سجلًا واحدًا في قاعدة البيانات باستخدام الدالة execute().
- أُدرج عدة سجلات دفعة واحدة باستخدام الدالة executemany().
- أطوّر تعليمات برمجية لاستقبال بيانات المستخدم وتخزينها في قاعدة البيانات.
- أطبّق آليات التعامل مع الاستثناءات لضمان سلامة البيانات وإغلاق الاتصال بقاعدة البيانات بشكل صحيح.
- أعاين محتوى الجداول باستخدام برنامج DB Browser for SQLite.
الشرح خطوة بخطوة
الموضع محفوظ على هذا الجهاز.
المقطع 1 من 5التعامل مع قواعد البيانات SQLite في Python: عمليات CRUD0:33
لا يوجد صوت عربي على هذا الجهاز. الشرح الصوتي المسجّل سيتوفر لهذا الدرس قريبًا
مقاطع الدرس
0 من 5 مكتملالتعامل مع قواعد البيانات SQLite في Python: عمليات CRUD(ص 57)
- عند التعامل مع قواعد البيانات هناك أربع عمليات، أي مهام، رئيسة تُستخدم بصورة متكررة، وتُمثل بالاختصار CRUD.
CREATE (INSERT) — READ (SELECT) — UPDATE — DELETE - الإدخال: إضافة بيانات جديدة إلى قاعدة البيانات.
INSERT - القراءة: قراءة واسترجاع بيانات من قاعدة البيانات.
SELECT - التعديل: تعديل أو تحديث بيانات مُخزنة في قاعدة البيانات.
UPDATE - الحذف: حذف بيانات موجودة في قاعدة البيانات.
DELETE
إضافة البيانات Inserting Data(ص 57)
تُعد عملية إضافة البيانات من العمليات الأساسية في إدارة قواعد البيانات، حيث تتبع نهجًا منظمًا لتخزين البيانات في الجداول.(ص 57)
- هذه صيغة التعليمة البرمجية لإضافة البيانات كما في شكل رقم (4-1).
cursor.execute("INSERT INTO table_name (column1, column2, ...) VALUES (?, ?, ...)", (value1, value2, ...)) - الجزء الأول ينفذ أمر SQL داخل قاعدة البيانات.
cursor.execute - ثم أمر SQL لإضافة بيانات للجدول، يليه اسم الجدول.
INSERT INTO table_name - ثم أسماء الأعمدة بين قوسين ويفصل بينها فاصلة.
(column1, column2, ...) - ثم كلمة القيم يليها عناصر مؤقتة تُسمى placeholders، وهي مواضع القيم المطلوب إدخالها.
VALUES (?, ?, ...) - ثم بعد الفاصلة القيم المطلوب إدخالها فعليًا بالترتيب نفسه.
(value1, value2, ...)
خطوات إدخال البيانات في قاعدة البيانات(ص 58)
- الخطوة الأولى: تحديد القيم المطلوب إضافتها لأعمدة الجدول.
- الخطوة الثانية: كتابة التعليمات البرمجية، وهي ست تعليمات بالترتيب: استدعاء المكتبة، ثم إنشاء أو فتح اتصال بقاعدة البيانات، ثم إنشاء كائن المؤشر، ثم إضافة القيم للأعمدة، ثم حفظ التغييرات، ثم إغلاق الاتصال.
- الخطوة الثالثة: تنفيذ التعليمات البرمجية.
- الخطوة الرابعة: معاينة محتوى الجدول في برنامج DB Browser.
إدخال صف واحد إلى الجدول — مثال 1(ص 58)
- قيم الصف المطلوب إدخاله كما في جدول رقم (4-1): عنوان الكتاب.
title: Arabic - المؤلف.
author: Arabic SD - سنة النشر.
year: 2001 - التصنيف.
category: Art/Science - السعر فارغ.
price: NULL - ولا نُدخل قيمة العمود id يدويًا، وسنعرف بعد قليل لماذا.
id - وخطوات التنفيذ ثمانٍ: استدعاء المكتبة، ثم إنشاء أو فتح الاتصال، ثم إنشاء كائن المؤشر، ثم إضافة البيانات، ثم حفظ التغييرات، ثم إغلاق الاتصال، ثم تنفيذ التعليمات البرمجية، ثم معاينة النتائج في برنامج DB Browser.
السطر الأول: استيراد مكتبة SQLite.
import sqlite3السطر الثاني: تعليق يوضح أن ما بعده هو الاتصال بقاعدة البيانات، والتعليق في بايثون يبدأ بعلامة الشباك ولا يُنفَّذ.
# Connect to the databaseالسطر الثالث: الاتصال بقاعدة بيانات grade11_books.db.
connection= sqlite3.connect('grade11_books.db ')السطر الرابع: إنشاء كائن المؤشر cursor لتنفيذ أوامر SQL.
cursor = connection.cursor()السطر الخامس: تعليق يوضح أن ما بعده إضافة بيانات إلى جدول الكتب.
# Insert data into table bookالسطر السادس: بداية تنفيذ أمر SQL، والأمر مكتوب بين ثلاث علامات تنصيص مفردة.
cursor.execute('''السطر السابع: أمر الإضافة إلى جدول book مع أسماء الأعمدة الخمسة المطلوب تعبئتها.
INSERT INTO book(title, author,year,category,price)السطر الثامن: العناصر المؤقتة الخمسة التي ستُستبدل بالقيم، ثم إغلاق النص وفاصلة.
VALUES( ?,?,?,?,?)'''),السطر التاسع: القيم المطلوب إدخالها بالترتيب نفسه، وNone تعني قيمة فارغة.
('Arabic', 'Arabic SD', 2001, 'Art/Science',None)السطر العاشر: إغلاق قوس الدالة execute.
)السطر الحادي عشر: تعليق يوضح أن ما بعده حفظ التغييرات.
# Commit changesالسطر الثاني عشر: حفظ التغييرات في قاعدة البيانات.
connection.commit()السطر الثالث عشر: تعليق يوضح أن ما بعده إغلاق قاعدة البيانات.
# Close databaseالسطر الرابع عشر: إغلاق الاتصال بقاعدة البيانات.
connection.close()
- كتلة execute كاملة معناها: إضافة بيانات لأعمدة الجدول.
- العنصر المؤقت يتم استبداله بالقيم المطلوبة بطريقة آمنة.
placeholder (?) - المعاملات تُستخدم بدلًا من إدخال القيم مباشرة في الاستعلام، وذلك لحماية قاعدة البيانات ومنع هجمات الحقن البرمجي.
Parameters — SQL Injection - عند إرسال هذه القيمة إلى قاعدة بيانات SQLite تتحول تلقائيًا إلى قيمة فارغة في قاعدة البيانات، وهي الطريقة الصحيحة لإدخال القيم الفارغة في بايثون.
None → NULL - حفظ التغييرات في قاعدة البيانات.
connection.commit() - إغلاق الاتصال بقاعدة البيانات.
connection.close()
- الملاحظة الأولى: تتولى قاعدة البيانات إسناد قيم رقمية تلقائية تصاعدية للمفتاح الأساسي من النوع INTEGER عند عدم إدخال قيم يدوية، ولهذا تركنا العمود id في المثال.
- الملاحظة الثانية: لإضافة أكثر من صف للجدول، يتم تكرار التعليمة البرمجية.
cursor.execute("INSERT ....") - الملاحظة الثالثة: عند تنفيذ أمر الإضافة دون تحديد اسم عمود أو أكثر، يتم تعبئة الأعمدة غير المحددة إما بقيمتها الافتراضية إن وجدت أو بالقيمة الفارغة، بشرط ألا يكون عليها قيد عدم الفراغ.
INSERT — DEFAULT / NULL — NOT NULL - الملاحظة الرابعة: يتم تمرير قيم الأعمدة في متغير من نوع مجموعة مرتبة.
tuple - الملاحظة الخامسة: عند إضافة قيمة واحدة للصف باستخدام tuple يجب إضافة علامة الفاصلة بعد القيمة.
("AI_application" , ) أو (123 , )
إدخال سجلات متعددة إلى الجدول دفعة واحدة(ص 61)
- الدالة التي تُستخدم لإضافة مجموعة من الصفوف إلى الجدول دفعة واحدة.
cursor.executemany() - المعامل الأول: نص أمر الإضافة نفسه مع العناصر المؤقتة.
'INSERT INTO table_name (column1, column2, ...) VALUES (? , ?, ...)', - المعامل الثاني: قائمة بين قوسين مربعين، كل عنصر فيها مجموعة مرتبة تمثل صفًا كاملًا.
[(value1_1, value1_2, ...), (value2_1, value2_2, ...), ... ] - ثم نغلق قوس الدالة.
)
- الصف الأول من جدول رقم (4-2).
ICT | ICT Supervision | 2001 | Art/Science | — - الصف الثاني.
Physics | Science SD | 2007 | Science | 1.500 - الصف الثالث.
English | English SD | 2009 | Art/Science | — - ولا تُدخل قيم العمود id، فقاعدة البيانات تُسندها تلقائيًا تصاعديًا.
السطر الأول: استيراد المكتبة.
import sqlite3السطر الثاني: تعليق الاتصال بقاعدة البيانات.
# Connect to the databaseالسطر الثالث: الاتصال بقاعدة البيانات، ولاحظ هنا علامتي التنصيص المزدوجتين.
connection= sqlite3.connect("grade11_books.db")السطر الرابع: إنشاء كائن المؤشر.
cursor = connection.cursor()السطر الخامس: تعليق إضافة البيانات إلى جدول الكتب.
# Insert data into table bookالسطر السادس: بداية دالة الإضافة المتعددة.
cursor.executemany('''السطر السابع: أمر الإضافة مع أسماء الأعمدة الخمسة.
INSERT INTO book(title, author,year,category,price)السطر الثامن: العناصر المؤقتة الخمسة، ثم إغلاق النص وفاصلة.
VALUES( ?,?,?,?,?)'''),السطر التاسع: فتح القائمة بالقوس المربع.
[السطر العاشر: الصف الأول كمجموعة مرتبة تنتهي بفاصلة.
('ICT', 'ICT SD',2001,'Art/Science',None),السطر الحادي عشر: الصف الثاني.
('Physics', 'Science SD', 2007,'Science',1.500),السطر الثاني عشر: الصف الثالث وبلا فاصلة بعده لأنه الأخير.
('English', 'English SD',2009,'Art/Science',None)السطر الثالث عشر: إغلاق القائمة بالقوس المربع.
]السطر الرابع عشر: إغلاق قوس الدالة.
)السطر الخامس عشر: تعليق حفظ التغييرات.
# Commit changesالسطر السادس عشر: حفظ التغييرات.
connection.commit()السطر السابع عشر: تعليق إغلاق قاعدة البيانات.
# Close databaseالسطر الثامن عشر: إغلاق الاتصال.
connection.close()
- استخدم الدالة لإدراج عدة سجلات في الجدول دفعة واحدة.
cursor.executemany - استخدام قائمة تتكون من عدة عناصر، كل عنصر من النوع مجموعة مرتبة.
List — tuple - عدد عناصر القائمة يساوي عدد الصفوف المطلوب إضافتها، فثلاثة عناصر تعني ثلاثة صفوف.
- وكل مجموعة مرتبة تمثل صفًا واحدًا يحتوي على القيم المراد إضافتها إلى الأعمدة.
title , author, year, category, price
- الملاحظة الأولى: يجب استخدام العناصر المؤقتة مع أمر الإدخال المتعدد لإدخال مجموعة من الصفوف دفعة واحدة.
placeholders (?) — executemany - الملاحظة الثانية: يُمكن كتابة التعليمة البرمجية السابقة بصورة أخرى أوضح: نضع نص الأمر في متغير مستقل.
insert_sql ='INSERT INTO book(title, author, year,category, price) VALUES (?,?,?,?,?)' - ثم نضع الصفوف في قائمة مستقلة باسم قائمة الكتب.
book_list = [ - الصف الأول.
('ICT', 'ICT SD', 2001, 'Art/Science', None), - الصف الثاني.
('Physics', 'Science SD', 2007, 'Science', 1.500), - الصف الثالث.
('English', 'English SD', 2009, 'Art/Science', None) - ثم نغلق القائمة بالقوس المربع.
] - ثم نستدعي الدالة ونمرر لها المتغيرين فقط، فتصير التعليمة أقصر وأسهل قراءة.
cursor.executemany(insert_sql , book_list)
الملخص
- عمليات CRUD أربع: الإدخال INSERT، والقراءة SELECT، والتعديل UPDATE، والحذف DELETE.
- صيغة الإضافة: cursor.execute("INSERT INTO table_name (column1, column2, ...) VALUES (?, ?, ...)", (value1, value2, ...)).
- العناصر المؤقتة placeholders (?) تُستبدل بالقيم بطريقة آمنة، وتُستخدم المعاملات Parameters بدل كتابة القيم داخل الاستعلام لحماية قاعدة البيانات ومنع هجمات الحقن البرمجي SQL Injection.
- القيمة None في Python تتحول تلقائيًا إلى NULL في SQLite، وهي الطريقة الصحيحة لإدخال القيم الفارغة.
- تتولى قاعدة البيانات إسناد قيم رقمية تلقائية تصاعدية للمفتاح الأساسي من النوع INTEGER عند عدم إدخال قيم يدوية.
- عند تنفيذ INSERT دون تحديد عمود أو أكثر، تُعبَّأ الأعمدة غير المحددة بقيمتها الافتراضية إن وجدت أو بالقيمة NULL، بشرط ألا يكون عليها قيد NOT NULL.
- الدالة executemany() تُدرج عدة سجلات دفعة واحدة، ويُمرَّر لها نص الأمر ثم قائمة List عناصرها من النوع tuple، وعدد عناصر القائمة يساوي عدد الصفوف.
- خطوات الإدخال: تحديد القيم، ثم كتابة التعليمات (sqlite3، الاتصال، المؤشر، الإضافة، commit، close)، ثم التنفيذ، ثم معاينة محتوى الجدول في DB Browser.
الأفكار الرئيسية
- علامة الاستفهام ليست مجرد اختصار في الكتابة، بل هي درع أمني: تفصل نص الأمر عن القيم فتمنع هجمات الحقن البرمجي SQL Injection.
- الفرق بين execute وexecutemany هو الفرق بين تمرير tuple واحد وتمرير قائمة من tuples: صف واحد مقابل عدة صفوف دفعة واحدة.
- ترك العمود id فارغًا ليس نسيانًا بل تصميم: قاعدة البيانات تتولى ترقيمه تلقائيًا لأنه مفتاح أساسي من النوع INTEGER.
- الإضافة لا تكتمل إلا بـ commit()، والتحقق البصري في DB Browser هو الدليل النهائي على نجاح العملية.
الأسئلة المهمة
ما عمليات CRUD؟ اذكرها مع أمر SQL المقابل لكل منها.
أربع عمليات رئيسة تُستخدم بصورة متكررة عند التعامل مع قواعد البيانات: الإدخال INSERT لإضافة بيانات جديدة إلى قاعدة البيانات، والقراءة SELECT لقراءة واسترجاع بيانات من قاعدة البيانات، والتعديل UPDATE لتعديل أو تحديث بيانات مخزنة، والحذف DELETE لحذف بيانات موجودة.
الكتاب صفحة 57
اكتب صيغة التعليمة البرمجية لإضافة البيانات، واشرح أجزاءها.
الصيغة: cursor.execute("INSERT INTO table_name (column1, column2, ...) VALUES (?, ?, ...)", (value1, value2, ...)). وcursor.execute يُنفذ أمر SQL داخل قاعدة البيانات، وINSERT INTO أمر SQL لإضافة بيانات للجدول، وtable_name اسم الجدول، و(column1, column2, ...) أسماء الأعمدة، و(?, ?, ...) عناصر مؤقتة placeholders للقيم المطلوب إدخالها، و(value1, value2, ...) القيم المطلوب إدخالها.
الكتاب صفحة 57
علّل: تُستخدم المعاملات Parameters والعناصر المؤقتة (?) بدلًا من إدخال القيم مباشرة في الاستعلام.
لحماية قاعدة البيانات ومنع هجمات الحقن البرمجي SQL Injection، وهي نوع من الهجمات السيبرانية التي يستغل فيها المخترِق مدخلات المستخدم غير الآمنة لإدخال أوامر SQL ضارة بهدف الوصول إلى قاعدة البيانات أو تعديلها أو حذف بيانات منها دون إذن. كما أن العنصر المؤقت (?) يتم استبداله بالقيم المطلوبة بطريقة آمنة.
الكتاب صفحة 60
ماذا يحدث عند إرسال القيمة None من Python إلى قاعدة بيانات SQLite؟
تتحول تلقائيًا إلى NULL في قاعدة البيانات، وهي تُمثل الطريقة الصحيحة لإدخال القيم الفارغة في Python.
الكتاب صفحة 60
لماذا لم تُدخَل قيمة للعمود id في مثالي الدرس؟
لأن قاعدة البيانات تتولى إسناد قيم رقمية تلقائية تصاعدية للمفتاح الأساسي من النوع INTEGER عند عدم إدخال قيم يدوية.
الكتاب صفحة 60
ماذا يحدث عند تنفيذ الأمر INSERT دون تحديد اسم عمود أو أكثر؟
يتم تعبئة الأعمدة غير المحددة إما بقيمتها الافتراضية (إن وجدت) أو بالقيمة NULL، بشرط ألا يكون عليها قيد NOT NULL.
الكتاب صفحة 60
قارن بين الدالتين execute() وexecutemany() في إضافة البيانات.
execute() تُستخدم لإدخال صف واحد، وتُمرَّر لها قيم الأعمدة في متغير من نوع tuple، ولإضافة أكثر من صف يتم تكرار التعليمة. أما executemany() فتُستخدم لإدراج عدة سجلات (rows) في الجدول دفعة واحدة، ويُمرَّر لها نص الأمر ثم قائمة (List) تتكون من عدة عناصر كل عنصر من النوع tuple، وعدد عناصر القائمة يساوي عدد الصفوف المطلوب إضافتها.
الكتاب صفحة 63
اذكر خطوات إدخال البيانات في قاعدة البيانات كما رتّبها الكتاب.
1) تحديد القيم المطلوب إضافتها لأعمدة الجدول. 2) كتابة التعليمات البرمجية: استدعاء مكتبة sqlite3، إنشاء / فتح اتصال بقاعدة البيانات، إنشاء كائن المؤشر، إضافة القيم للأعمدة، حفظ التغييرات، إغلاق الاتصال. 3) تنفيذ التعليمات البرمجية. 4) معاينة محتوى الجدول في برنامج DB Browser.
الكتاب صفحة 58
اختبار الدرس
أجب ثم اضغط «صحّح» لترى درجتك وتفسير كل إجابة.
الواجب
أسئلة تطبيقية لتحلها في البيت. يمكنك طباعتها من الأعلى.
مصطلحات الدرس
- CRUD
- أربع عمليات رئيسة على قواعد البيانات: الإدخال INSERT، والقراءة SELECT، والتعديل UPDATE، والحذف DELETE.
- INSERT INTO
- أمر SQL لإضافة بيانات للجدول.
- العناصر المؤقتة placeholders (?)
- مواضع مؤقتة داخل الاستعلام تُستبدل بالقيم المطلوبة بطريقة آمنة.
- المعاملات Parameters
- القيم التي تُمرَّر خارج نص الاستعلام بدلًا من إدخالها مباشرة فيه، لحماية قاعدة البيانات.
- الحقن البرمجي SQL Injection
- نوع من الهجمات السيبرانية يستغل فيها المخترِق مدخلات المستخدم غير الآمنة لإدخال أوامر SQL ضارة للوصول إلى قاعدة البيانات أو تعديلها أو حذف بياناتها دون إذن.
- None
- قيمة في Python تتحول تلقائيًا إلى NULL عند إرسالها إلى قاعدة بيانات SQLite، وهي الطريقة الصحيحة لإدخال القيم الفارغة.
- tuple
- نوع متغير تُمرَّر فيه قيم الأعمدة، ويمثل كل واحد منه صفًا واحدًا.
- executemany()
- دالة تُستخدم لإدراج عدة سجلات (rows) في الجدول دفعة واحدة عبر قائمة List من tuples.
تمارين الكتاب كاملة
كل سؤال ونشاط وتمرين ورد في صفحات هذا الدرس، بنصه وإجابته النموذجية. 2 تمرينًا.
ورقة عمل (4) — إضافة سجل لجدول landmark بقاعدة البيانات Kuwait_landmarks.dbإضافة سجل لجدول landmark بقاعدة البيانات Kuwait_landmarks.db، باتباع الخطوات التالية: 1. استدعِ المشروع landmark_insert. 2. افتح ملف data_insert1.py (الأسطر المكتوبة: import sqlite3 ثم تعليق # Connect to the database ثم connection = sqlite3.connect ('Kuwait_landmarks.db') ثم cursor = connection.cursor() ثم تعليق # Insert data into table book ثم cursor.execute( والأسطر 7 و8 متروكة لك ثم ) ثم # Commit changes ثم connection.commit() ثم # Close database ثم connection.close()). 3. استكمل التعليمة البرمجية لإضافة سجل وفقًا للبيانات التالية: name هو Abdullah AlSalem Centre، وlocation هو Al-Shaab Area، وcategory هو Culture، وyear هو 2018، وid وprice بلا قيمة. 4. نفّذ التعليمات البرمجية. 5. عاين بيانات الجدول باستخدام برنامج DB Browser.(ص 64)
يُستكمل داخل قوسي cursor.execute بسطرين على نمط مثال 1: '''INSERT INTO landmark(name, location, category, year) VALUES( ?,?,?,?)''', ثم ('Abdullah AlSalem Centre', 'Al-Shaab Area', 'Culture', 2018). فتصير التعليمة: cursor.execute( '''INSERT INTO landmark(name, location, category, year) VALUES( ?,?,?,?)''', ('Abdullah AlSalem Centre', 'Al-Shaab Area', 'Culture', 2018) ). وترك العمودين id وprice جائز، فالأول مفتاح أساسي INTEGER تُسند له قاعدة البيانات قيمة تلقائية تصاعدية، والثاني عمود غير محدد فيُملأ بالقيمة NULL لأنه ليس عليه قيد NOT NULL. ويصح أيضًا ذكر price في قائمة الأعمدة وتمرير None له. الناتج المتوقع: لا تُطبع رسالة، وعند فتح DB Browser واختيار Browse Data للجدول landmark يظهر صف جديد id يساوي 1، وname يساوي Abdullah AlSalem Centre، وlocation يساوي Al-Shaab Area، وcategory يساوي Culture، وyear يساوي 2018، وprice قيمته NULL.
ورقة عمل (5) — إضافة عدة سجلات مرة واحدة لجدول landmark بقاعدة البيانات Kuwait_landmarks.dbإضافة عدة سجلات مرة واحدة لجدول landmark بقاعدة البيانات Kuwait_landmarks.db، باتباع الخطوات التالية: 1. استدعِ المشروع landmark_insert. 2. افتح ملف data_insert2.py، وفيه: import sqlite3 ثم connection = None ثم try: وداخلها connection=sqlite3.connect('Kuwait_landmarks.db') ثم cursor=connection.cursor() ثم تعليق # Insert data into landmark table ثم insert_sql="..." (فراغ) ثم landmarks_list = [('Failaka Island', 'Off the eastern coast of Kuwait', 'Historical Landmark', 1950,5), ('Souq Al-Mubarakiya','Central Kuwait City','Traditional Market',1897,0), ('Museum of Modern Art','Salmiya Area','Art Museum',1980,1)] ثم cursor.executemany(............ , ............) ثم connection.commit()، ثم except Exception as e : وفيها print("Error :", e)، ثم finally : وفيها if connection is not None: ثم connection.close(). 3. استكمل التعليمة البرمجية لإضافة الصفوف المخصصة للمتغير landmarks_list. 4. نفّذ التعليمات البرمجية. 5. عاين بيانات الجدول باستخدام برنامج DB Browser.(ص 65)
الفراغ الأول يُملأ بنص أمر الإضافة، والقيم في كل tuple خمس فتكون الأعمدة خمسة: insert_sql="INSERT INTO landmark(name, location, category, year, price) VALUES (?,?,?,?,?)". والفراغان في السطر الأخير يُملآن باسمَي المتغيرين بالترتيب: cursor.executemany(insert_sql , landmarks_list). وهذه هي الصورة البديلة التي ذكرها الكتاب في ملاحظات الإدخال المتعدد (متغير للأمر ومتغير للقائمة). الناتج المتوقع عند النجاح: لا تُطبع رسالة خطأ، وتُضاف ثلاثة صفوف؛ وعند فتح DB Browser واختيار Browse Data للجدول landmark تظهر: Failaka Island في Off the eastern coast of Kuwait وفئتها Historical Landmark وسنتها 1950 وسعرها 5، وSouq Al-Mubarakiya في Central Kuwait City وفئتها Traditional Market وسنتها 1897 وسعرها 0، وMuseum of Modern Art في Salmiya Area وفئتها Art Museum وسنتها 1980 وسعرها 1، مع أرقام id تلقائية تصاعدية. وإن حدث خطأ فستُطبع رسالة تبدأ بكلمة Error ثم وصف الخطأ، ويُغلق الاتصال في كل الأحوال داخل finally.
صفحات الكتاب
صفحات هذا الدرس من كتاب الطالب الرسمي كما هي، صفحات 55 إلى 66.











