جارى التحميل
النتائج 1 إلى 3 من 3

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

  1. #1
    لينكساوي الصورة الرمزية GreyZer0
    التوزيعة
    BackTrack 4
    واجهة النظام
    KDE
    محل الإقامة
    السعودية

    تاريخ التسجيل
    Aug 2007
    المشاركات
    95
    شكراً
    204
    شُكر 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 14
    واجهة النظام
    GNOME
    محل الإقامة
    مصر

    تاريخ التسجيل
    Dec 2006
    المشاركات
    1,830
    شكراً
    111
    شُكر 1,142 مرة في 236 موضوع

    افتراضي

    حلو جدا.. الترجمة حاسس ان الكلمات اللى فيها محتاجة تتبسط زى تلقين مقبض الإتصال ؟
    بعد ماتخلصها تقدر تبعت ال html او pdf او حتى اللينك النهائى اللى هتحط عليه الترجمة ل jan عشان يتم وضعها/او وضع لينك ليها على zetcode
    Programming-Fr34ks[dot]NET
    Ma Weblog
    ابدأ بتعلم Python | Ruby
    كتاب البايثون متوافر الآن
    لا اتواجد بهذا المنتدى ... للإتصال

  4. #3
    لينكساوي الصورة الرمزية GreyZer0
    التوزيعة
    BackTrack 4
    واجهة النظام
    KDE
    محل الإقامة
    السعودية

    تاريخ التسجيل
    Aug 2007
    المشاركات
    95
    شكراً
    204
    شُكر 13 مرة في 6 موضوع

    افتراضي

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

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

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

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

الموضوعات المتشابهه

  1. [مشكلة] فشل الاتصال مع سيرفر MySQL من خلال MySQL-workbench
    بواسطة أحمد عطاالله في المنتدى .: برمجة وتطوير سطح المكتب :.
    مشاركات: 1
    آخر مشاركة: 28-12-2012, 06:34 AM
  2. [كتاب] C++ GUI Programming with Qt 4
    بواسطة أمين روخ في المنتدى .: المكتبة العامة :.
    مشاركات: 7
    آخر مشاركة: 17-09-2012, 10:38 PM
  3. [مقال] تنصيب خادم MySQL وعميل MySQL-Python والتعامل معهما
    بواسطة بـركـات في المنتدى .: المقالات والدورات البرمجية :.
    مشاركات: 6
    آخر مشاركة: 01-04-2012, 07:30 AM
  4. programming live help
    بواسطة St0rM-MaN في المنتدى .: برمجة وتطوير سطح المكتب :.
    مشاركات: 128
    آخر مشاركة: 14-02-2010, 01:26 AM
  5. MySQL Administrator لإدارة قواعد بيانات MySQL
    بواسطة lord-zk في المنتدى .: إعداد الخوادم والخدمات :.
    مشاركات: 0
    آخر مشاركة: 17-12-2009, 03:52 AM

المفضلات

المفضلات

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

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