إعلانات
+ الرد على الموضوع
النتائج 1 إلى 3 من 3

الموضوع: MySQL C API Programming

  1. #1
    لينكساوي الصورة الرمزية GreyZer0
    التوزيعة : BackTrack 4

    واجهة النظام : KDE

    تاريخ التسجيل
    Aug 2007
    الدولة
    Saudi Arabia
    المشاركات
    108
    شكراً
    194
    شُكر 13 مرة في 6 موضوع

    MySQL C API Programming

    السلام عليكم ،،

    هدا الشرح مترجم من : MySQL C API Programming

    عن هذا البحث(الشرح):
    هدا بحث للبرمجه بالـC لقواعد بيانات MySQL. تغطي اساسيات برمجه الـMySQL مع الـC API





    المثال الاول:

    مثالنا الاول سيكون تجربة واحده من دوال الـMySQL:
    كود:
    #include <my_global.h>
    #include <mysql.h>
    
    int main(int argc, char **argv)
    {
      printf("MySQL client version: %s\n", mysql_get_client_info());
    }
    الــmysql_get_client_info() تظهر اصدار الـMySQL للعميل(المستخدم).

    gcc version.c -o version `mysql_config --cflags --libs`
    هنا كيف نقوم بترجمة كود النثال الاول.
    $ ./version
    MySQL client version: 5.0.38
    كود:
     #include <my_global.h>
     #include <mysql.h>
    اضفنا الملفات الرأسيه الضروريه ،، mysql.h الملف الرأسي الأكثر اهميه لاستدعاء دوال الـMySQL. ,,
    my_global.h لاستدعاء ملفات الراسيه الادخال و الاخراج ,, input/output

    كود:
    printf("MySQL client version: %s\n", mysql_get_client_info());
    لاخراج اصدار الـMySQL لدي العميل ،، لذالك استخدمنا الداله mysql_get_client_info()


    انشاء قاعدة بيانات:
    كود المثال القادم سوف يقوم بانشاء قاعدة بيانات جديده.

    كود:
    #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);
    
    }
    محتوي كود المثال السابق يقوم بانشاء قاعدة بيانات جديده تدعى testdb.
    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | testdb |
    +--------------------+
    3 rows in set (0.00 sec)
    هدا البرهان ،، على ان قاعدة البيانات انشأت

    لقد اضفنا متحقق الاخطاء في المثال ،، مهم لتحقق الاخطاء الغير متوقعه.

    كود المثال منقسم الى عدت اقسام :
    • تلقين مقبض الاتصال
    • انشاء اتصال
    • تشغيل الاستعلام
    • اغلاق الاتصال

    كود:
     MYSQL *conn;
    اعلنا عن مؤشر لتراكيب الMySQL. هده التراكيب ستخدمنا كمقبض للاتصال.

    كود:
     conn = mysql_init(NULL);
    الـmysql_init() ستحصل على مقبض الاتصال.

    كود:
     if (conn == NULL) {
         printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
         exit(1);
     }
    نتحقق القيمه المعاده. اذا الداله mysql_init() فشلت ، سنطبع رسالة خطأ و ننهي البرنامج(التطبيق).

    كود:
    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);
     }
    الداله mysql_real_connect() تقوم بأنشاء اتصال الى قاعدة البيانات. لنزود مقبض الاتصال
    برامترات الاتصال ب اسم المضيف(hostname) , اسم المستخدم(username)، كلمة المرور(password) للداله .
    الاربع البرامترات الخرى ل اسم قاعدة البيانات ، رقم المنفذ،Unix Socket ، واخيرا Client Flag .

    كود:
    if (mysql_query(conn, "create database testdb")) {
         printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
         exit(1);
     }
    الmysql_query() لتنفيد استعلام SQL , في حالتنا الاستعلام يقوم بعمل قاعدة بيانات جديده.

    كود:
    mysql_close(conn);
    واخيرا، نقوم بالغلاق الاتصال.


    انشاء جدول و ادخال بعض البيانات فيه :

    في الكود القادم سوف ننشئ جدول و ادخال بعض البيانات فيه.

    كود:
    #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);
    
    }
    لم نستدعي داله MySQL جديده هنا ،، نحن استخدمنا mysql_query() لكلا استعلامين انشاء جدول و ادخال بيانات فيه

    كود:
     mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
    اتصلنا بقاعدة البيانات testdb . اسم المستخدم هو zetcode ، و كلمة المرور هي passwd.

    كود:
     mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
    هنا اتشائنا جدول يدعى writers ، لديه عمود واحد من نوع VARCHAR.

    كود:
     mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
    ادخلنا اسم كاتب واحد الى جدول writers.

    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)
    لقد حددنا جميع البيانات الموجوده في الجدول.

    استخراج البيانات من قاعده البيانات:

    في المثال القادم سوف نقوم باستخراج البيانات من الجدول.

    الخطوات:
    • انشاء اتصال
    • تنفيذ استعلام
    • جلب النتائج
    • جلب جميع الصفوف المفعله
    • تحرير النتائج

    كود:
    #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);
    
    }
    المثال يقوم بطباعة جميع الاسماء الموجوده في الجدول writers.
    $ ./select
    Leo Tolstoy
    Jack London
    Honore de Balzac
    Lion Feuchtwanger
    Emile Zola
    كود:
    mysql_query(conn, "SELECT * FROM writers");
    نفذنا الاستعلام الذي يستخرج جميع الاسماء من الجدول 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);
    }
    المثال مماثل للمثال السابق ،، يقوم فقط بأضافة الاسماء الرأسيه للعمود فيه.

    كود:
     while(field = mysql_fetch_field(result)) {
         printf("%s ", field->name);
     }
    mysql_fetch_field() تقوم بارجاع تراكيب الـ MYSQL_FIELD ،، اخذنا اسماء العمود الرأسيه من هذه التراكيب(الستركشر).

    ./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);
    كود:
    #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);
    }
    في هذا المثال ، سندخل صوره واحده في جدول images. الحد الاقصى للصوره 1MB.

    كود:
    fp = fopen("image.png", "rb");
     size = fread(data, 1, 1024*1000, fp);
    هنا نفتح الصوره و نقرأ مصفوفات البيانات.

    كود:
     mysql_real_escape_string(conn, chunk, data, size);
    البيانات الثنائيه(binary data) تحصل على حروف مميزه، التي قد تسبب مشاكل في البيانات،
    لذلك سجب علينا الغائهم ب mysql_real_escape_string() تضع في بيانات مشفره في قطعة المصفوفات(Chunk array).
    كل حرف يكون حرف قد يكون حرف مميز. هدا سبب قطعة المصفوفات اكبر بمرتين كـ مصفوفة بيانات(Data Array).
    و الداله ايضا تقوم بانهاء الحروف الملغيه(null characters).

    كود:
    char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";
     len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
    هذا سطران من الكود تهيئ استعلام MySQL.

    كود:
    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");
    نفتح الملف للكتابه.

    كود:
    mysql_query(conn, "SELECT data FROM images WHERE id=1");
    نختار صوره مع id 1.(الصوره الموجوده مع رقم الid 1)

    كود:
    row = mysql_fetch_row(result);
    نحتوى الصف معلومات الصف.

    كود:
     lengths = mysql_fetch_lengths(result);
    نجلب طول(حجم) الصوره.

    كود:
    fwrite(row[0], lengths[0], 1, fp);
    ننشئ ملف الصوره بستعمال الداله fwrite() من الدوال القياسيه

    انتهينا

    ------------------------------------------------------------------------
    ملاحظه: ربما توجد بعض الاخطاء بالترجمه او اخطاء املائيه ،، ارجوا اخباري بها


  2. الأعضاء التالية أسماءهم وعددهم 3 يشكرون GreyZer0 على هذه المشاركة القيمة:


  3. #2
    :: خبير برمجة :: الصورة الرمزية StrikerX
    التوزيعة : Fedora 11

    واجهة النظام : GNOME

    تاريخ التسجيل
    Dec 2006
    الدولة
    /Home/Striky
    المشاركات
    1,839
    شكراً
    111
    شُكر 920 مرة في 184 موضوع

    حلو جدا.. الترجمة حاسس ان الكلمات اللى فيها محتاجة تتبسط زى تلقين مقبض الإتصال ؟
    بعد ماتخلصها تقدر تبعت ال html او pdf او حتى اللينك النهائى اللى هتحط عليه الترجمة ل jan عشان يتم وضعها/او وضع لينك ليها على zetcode

  4. #3
    لينكساوي الصورة الرمزية GreyZer0
    التوزيعة : BackTrack 4

    واجهة النظام : KDE

    تاريخ التسجيل
    Aug 2007
    الدولة
    Saudi Arabia
    المشاركات
    108
    شكراً
    194
    شُكر 13 مرة في 6 موضوع

    حلو جدا.. الترجمة حاسس ان الكلمات اللى فيها محتاجة تتبسط زى تلقين مقبض الإتصال ؟
    بعد ماتخلصها تقدر تبعت ال html او pdf او حتى اللينك النهائى اللى هتحط عليه الترجمة ل jan عشان يتم وضعها/او وضع لينك ليها على zetcode
    التوتوريال في بعض الجمل او الكلمات ما عرفت كيف احولها عربي تمام ،،
    بس اعدل بعض الجمل او الكلمات ،، و برسلها لJan

+ الرد على الموضوع

معلومات الموضوع

الأعضاء الذين يشاهدون هذا الموضوع

الذين يشاهدون الموضوع الآن: 1 (0 من الأعضاء و 1 زائر)

     

مواقع النشر (المفضلة)

مواقع النشر (المفضلة)

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك