السلام عليكم ،،
هدا الشرح مترجم من : MySQL C API Programming
عن هذا البحث(الشرح):
هدا بحث للبرمجه بالـC لقواعد بيانات MySQL. تغطي اساسيات برمجه الـMySQL مع الـC API
المثال الاول:
مثالنا الاول سيكون تجربة واحده من دوال الـMySQL:
الــmysql_get_client_info() تظهر اصدار الـMySQL للعميل(المستخدم).كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { printf("MySQL client version: %s\n", mysql_get_client_info()); }
هنا كيف نقوم بترجمة كود النثال الاول.gcc version.c -o version `mysql_config --cflags --libs`
$ ./version
MySQL client version: 5.0.38اضفنا الملفات الرأسيه الضروريه ،، mysql.h الملف الرأسي الأكثر اهميه لاستدعاء دوال الـMySQL. ,,كود:#include <my_global.h> #include <mysql.h>
my_global.h لاستدعاء ملفات الراسيه الادخال و الاخراج ,, input/output
لاخراج اصدار الـMySQL لدي العميل ،، لذالك استخدمنا الداله mysql_get_client_info()كود:printf("MySQL client version: %s\n", mysql_get_client_info());
انشاء قاعدة بيانات:
كود المثال القادم سوف يقوم بانشاء قاعدة بيانات جديده.
محتوي كود المثال السابق يقوم بانشاء قاعدة بيانات جديده تدعى testdb.كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; conn = mysql_init(NULL); if (conn == NULL) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); } if (mysql_real_connect(conn, "localhost", "zetcode", "passwd", NULL, 0, NULL, 0) == NULL) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); } if (mysql_query(conn, "create database testdb")) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); } mysql_close(conn); }
هدا البرهان ،، على ان قاعدة البيانات انشأتmysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| testdb |
+--------------------+
3 rows in set (0.00 sec)
لقد اضفنا متحقق الاخطاء في المثال ،، مهم لتحقق الاخطاء الغير متوقعه.
كود المثال منقسم الى عدت اقسام :
- تلقين مقبض الاتصال
- انشاء اتصال
- تشغيل الاستعلام
- اغلاق الاتصال
اعلنا عن مؤشر لتراكيب الMySQL. هده التراكيب ستخدمنا كمقبض للاتصال.كود:MYSQL *conn;
الـmysql_init() ستحصل على مقبض الاتصال.كود:conn = mysql_init(NULL);
نتحقق القيمه المعاده. اذا الداله mysql_init() فشلت ، سنطبع رسالة خطأ و ننهي البرنامج(التطبيق).كود:if (conn == NULL) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); }
الداله mysql_real_connect() تقوم بأنشاء اتصال الى قاعدة البيانات. لنزود مقبض الاتصالكود:if (mysql_real_connect(conn, "localhost", "zetcode", "passwd", NULL, 0, NULL, 0) == NULL) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); }
برامترات الاتصال ب اسم المضيف(hostname) , اسم المستخدم(username)، كلمة المرور(password) للداله .
الاربع البرامترات الخرى ل اسم قاعدة البيانات ، رقم المنفذ،Unix Socket ، واخيرا Client Flag .
الmysql_query() لتنفيد استعلام SQL , في حالتنا الاستعلام يقوم بعمل قاعدة بيانات جديده.كود:if (mysql_query(conn, "create database testdb")) { printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1); }
واخيرا، نقوم بالغلاق الاتصال.كود:mysql_close(conn);
انشاء جدول و ادخال بعض البيانات فيه :
في الكود القادم سوف ننشئ جدول و ادخال بعض البيانات فيه.
لم نستدعي داله MySQL جديده هنا ،، نحن استخدمنا mysql_query() لكلا استعلامين انشاء جدول و ادخال بيانات فيهكود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0); mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))"); mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')"); mysql_query(conn, "INSERT INTO writers VALUES('Jack London')"); mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')"); mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')"); mysql_query(conn, "INSERT INTO writers VALUES('Emile Zola')"); mysql_close(conn); }
اتصلنا بقاعدة البيانات testdb . اسم المستخدم هو zetcode ، و كلمة المرور هي passwd.كود:mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
هنا اتشائنا جدول يدعى writers ، لديه عمود واحد من نوع VARCHAR.كود:mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
ادخلنا اسم كاتب واحد الى جدول writers.كود:mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
نحن نعرض الجداول الموجوده في قاعدة البياناتmysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| writers |
+------------------+
1 row in set (0.00 sec)
لقد حددنا جميع البيانات الموجوده في الجدول.mysql> select * from writers;
+-------------------+
| name |
+-------------------+
| Leo Tolstoy |
| Jack London |
| Honore de Balzac |
| Lion Feuchtwanger |
| Emile Zola |
+-------------------+
5 rows in set (0.00 sec)
استخراج البيانات من قاعده البيانات:
في المثال القادم سوف نقوم باستخراج البيانات من الجدول.
الخطوات:
- انشاء اتصال
- تنفيذ استعلام
- جلب النتائج
- جلب جميع الصفوف المفعله
- تحرير النتائج
المثال يقوم بطباعة جميع الاسماء الموجوده في الجدول writers.كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; MYSQL_RES *result; MYSQL_ROW row; int num_fields; int i; conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0); mysql_query(conn, "SELECT * FROM writers"); result = mysql_store_result(conn); num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { for(i = 0; i < num_fields; i++) { printf("%s ", row[i] ? row[i] : "NULL"); } printf("\n"); } mysql_free_result(result); mysql_close(conn); }
$ ./select
Leo Tolstoy
Jack London
Honore de Balzac
Lion Feuchtwanger
Emile Zolaنفذنا الاستعلام الذي يستخرج جميع الاسماء من الجدول writers.كود:mysql_query(conn, "SELECT * FROM writers");
نأخد جميع نتائج.كود:result = mysql_store_result(conn);
ناخد عدد الحقول في الجدول.كود:num_fields = mysql_num_fields(result);
نظهر جميع الصفوف و نطبعهم على الشاشه.كود:while ((row = mysql_fetch_row(result))) { for(i = 0; i < num_fields; i++) { printf("%s ", row[i] ? row[i] : "NULL"); } printf("\n"); }
نحرر المصادر.كود:mysql_free_result(result);
رؤس(عناوين) الاعمده :
في المثال القادم ، سوف نقوم باستخراج البيانات و نظهر اسماء عمودهم من الجدول ،، لذلك سوف نقوم بانشاء جدول جديد يدعى friends.
mysql> create table friends (id int not null primary key auto_increment,
name varchar(20), age int);ادخلنا بعض البيانات في قاعدة البيانات.mysql> insert into friends(name, age) values('Tom', 25);
mysql> insert into friends(name, age) values('Elisabeth', 32);
mysql> insert into friends(name, age) values('Jane', 22);
mysql> insert into friends(name, age) values('Luke', 28);
المثال مماثل للمثال السابق ،، يقوم فقط بأضافة الاسماء الرأسيه للعمود فيه.كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; MYSQL_RES *result; MYSQL_ROW row; MYSQL_FIELD *field; int num_fields; int i; conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0); mysql_query(conn, "SELECT * FROM friends"); result = mysql_store_result(conn); num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { for(i = 0; i < num_fields; i++) { if (i == 0) { while(field = mysql_fetch_field(result)) { printf("%s ", field->name); } printf("\n"); } printf("%s ", row[i] ? row[i] : "NULL"); } } printf("\n"); mysql_free_result(result); mysql_close(conn); }
mysql_fetch_field() تقوم بارجاع تراكيب الـ MYSQL_FIELD ،، اخذنا اسماء العمود الرأسيه من هذه التراكيب(الستركشر).كود:while(field = mysql_fetch_field(result)) { printf("%s ", field->name); }
وهذا هو ناتج البرنامج../headers
id name age
1 Tom 25
2 Elisabeth 32
3 Jane 22
4 Luke 28
ادخال الصور داخل الـMySQL :
بعض من الناس يفضلون وضع صورهم داخل قاعدة البيانات ،، و البعض الاخر يفضل تركهم في ملفات تطبيقه ،،
يكون هناك صعوبه عندما تعمل مع ملايين الصور.،، الصور و ملفات التنفيذيه. MySQL تملك نوع مميز لتخزين
الملفات التنفيذيه تدعى BLOB (Binary Large Object).
هذا الجدول الذي سوف نستخدمه في مثالنا. تستطيع انشائه بواسطة هذا الاستعلام:mysql> describe images;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | | |
| data | mediumblob | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
create table images(id int not null primary key, data mediumblob);في هذا المثال ، سندخل صوره واحده في جدول images. الحد الاقصى للصوره 1MB.كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; int len, size; char data[1000*1024]; char chunk[2*1000*1024+1]; char query[1024*5000]; FILE *fp; conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0); fp = fopen("image.png", "rb"); size = fread(data, 1, 1024*1000, fp); mysql_real_escape_string(conn, chunk, data, size); char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')"; len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk); mysql_real_query(conn, query, len); fclose(fp); mysql_close(conn); }
هنا نفتح الصوره و نقرأ مصفوفات البيانات.كود:fp = fopen("image.png", "rb"); size = fread(data, 1, 1024*1000, fp);
البيانات الثنائيه(binary data) تحصل على حروف مميزه، التي قد تسبب مشاكل في البيانات،كود:mysql_real_escape_string(conn, chunk, data, size);
لذلك سجب علينا الغائهم ب mysql_real_escape_string() تضع في بيانات مشفره في قطعة المصفوفات(Chunk array).
كل حرف يكون حرف قد يكون حرف مميز. هدا سبب قطعة المصفوفات اكبر بمرتين كـ مصفوفة بيانات(Data Array).
و الداله ايضا تقوم بانهاء الحروف الملغيه(null characters).
هذا سطران من الكود تهيئ استعلام MySQL.كود:char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')"; len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
اخيراً ،، ننفذ الاستعلامكود:mysql_real_query(conn, query, len);
نحدد(نستخرج) الصور من قاعده البيانات:
في المثال السابق ،، نحن ادخلنا الصوره في قاعدة البيانات ،، في هدا المثال سوف نستخرج الصوره من قاعدة البيانات.
في هذا المثال ،، سنقوم بانشاء ملف صوره من قاعدة البيانات.كود:#include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *conn; MYSQL_RES *result; MYSQL_ROW row; unsigned long *lengths; FILE *fp; conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0); fp = fopen("image.png", "wb"); mysql_query(conn, "SELECT data FROM images WHERE id=1"); result = mysql_store_result(conn); row = mysql_fetch_row(result); lengths = mysql_fetch_lengths(result); fwrite(row[0], lengths[0], 1, fp); mysql_free_result(result); fclose(fp); mysql_close(conn); }
نفتح الملف للكتابه.كود:fp = fopen("image.png", "wb");
نختار صوره مع id 1.(الصوره الموجوده مع رقم الid 1)كود:mysql_query(conn, "SELECT data FROM images WHERE id=1");
نحتوى الصف معلومات الصف.كود:row = mysql_fetch_row(result);
نجلب طول(حجم) الصوره.كود:lengths = mysql_fetch_lengths(result);
ننشئ ملف الصوره بستعمال الداله fwrite() من الدوال القياسيهكود:fwrite(row[0], lengths[0], 1, fp);
انتهينا![]()
------------------------------------------------------------------------
ملاحظه: ربما توجد بعض الاخطاء بالترجمه او اخطاء املائيه،، ارجوا اخباري بها
![]()
حلو جدا.. الترجمة حاسس ان الكلمات اللى فيها محتاجة تتبسط زى تلقين مقبض الإتصال ؟
بعد ماتخلصها تقدر تبعت ال html او pdf او حتى اللينك النهائى اللى هتحط عليه الترجمة ل jan عشان يتم وضعها/او وضع لينك ليها على zetcode
حلو جدا.. الترجمة حاسس ان الكلمات اللى فيها محتاجة تتبسط زى تلقين مقبض الإتصال ؟
بعد ماتخلصها تقدر تبعت ال html او pdf او حتى اللينك النهائى اللى هتحط عليه الترجمة ل jan عشان يتم وضعها/او وضع لينك ليها على zetcodeالتوتوريال في بعض الجمل او الكلمات ما عرفت كيف احولها عربي تمام ،،
بس اعدل بعض الجمل او الكلمات ،، و برسلها لJan![]()
الذين يشاهدون الموضوع الآن: 1 (0 من الأعضاء و 1 زائر)
مواقع النشر (المفضلة)