Category: الدروس

كيف توقف مواقع الإنترنت عن تعقبك!

prevent-being-tracked-online-ahmadssb

مع التطور الذي تشهده التكنولوجيا و الانترنت، أصبح لدينا الكثير من مواقع التواصل الاجتماعي والتطبيقات والألعاب و الفديوهات التي تقدم الكثير من الخدمات الرائعة والمجانية للمستخدمين. هممم معذرةً ليست مجانية كما تظن!

في الواقع ليست مجانية بالكامل فبمقابل إستخدامك لخدماتهم فإنهم يقومون بالحصول على بعض المعلومات منك والتي نقدمها نحن أو يقوم الموقع بالحصول عليها بدون علمك. حيث أصبح بإمكان مواقع الانترنت جمع بيانات تفصيلية عن زوارها بطريقة سهلة. فالتقنيات المستخدمة غرضها بالأساس هو عمل إحصائيات عن الزوار في جميع صفحات الموقع ومن خلالها يعرف مدير الموقع ماهي المواضيع التي يستهدفها الزائر بموقعه ليقوم بتطويره بما يناسب زوار موقعه. ولكن التكنلوجيا ليست ثابتة لتطبيق واحد فبإمكان استخدامها لأغراض أخرى غير محببة.

تحدثت سابقا بالتفصيل الممل عن موضوع الخصوصية بالإنترنت وكيف تقوم مواقع الانترنت بالحصول على البيانات من زوارها.

في هذا المقال سأتطرق بالحديث عن بعض الأساليب المتبعة لإيقاف تتبع هذه المواقع لك والحفاظ على خصوصيتك. ولكن قبل الحديث عنها من الطبيعي أن يسأل بعضكم “من أنا؟ ولماذا قد تتعقبني تلك المواقع؟ وبماذا ستستفيد من بياناتي؟”

 في مقال قديم نشرته صحيفة THE WALL STREETJOURNAL كتبت فيه بأن قيمة مواقع الإنترنت تختلف من  موقع لآخر ليس لجودة المحتوى ولا عدده ولا عدد زوار الموقع. و إنما بعدد البيانات المسجلة عن زوار تلك المواقع و اهتماماتهم و أعمارهم.

  • كيف تستفيد هذه المواقع من بياناتي ؟

    • البريد الإلكتروني: لإرسال الدعايات و الرسائل المزعجة Spams.
    • عنوانك البريدي: لإرسال بروشورات عن المنتجات.
    • رقم الهاتف: للإتصال بك وتسويق منتجاتهم عبر الهاتف (مثل البنوك).
    • سجل الصفحات التي قمت بزيارتها لديهم: لعرض اعلانات تناسب ميولك واهتماماتك في موقعهم.

فكلما زادت عدد البيانات المسجلة عنك زادت معها الدعايات التي تتناسب مع إهتماماتك و ما قد بحثت عنه.

وهناك أيضا الكثير من الحكومات والتي تلعب دور الأهل فتقوم بمراقبتك كما يراقب الأهل أطفالهم ، ففي حين قمت اكتشافهم بأنك تقوم بأي أعمال خطيرة فسيقومون بتطبيق القانون عليك.

المشكلةMetadata ليست في أن المواقع تقوم بالحصول على بياناتي ولكن المشكلة الحقيقية أنه لا يوجد حد للبيانات التي تستطيع المواقع الحصول عليها منك من خلال الميتاداتا Metadata ،  فأي موضوع أو رد تقوم بكتابته أو أي حساب لديك في اي موقع الكتروني يتم حفظه في قاعدة بيانات تلك الموقع فهكذا تقوم كل العمليات بالانترنت.  ولكن حتى وان لم تقم بكتابة أي شي فبمجرد دخولك للموقع يتم معرفة معلومات هامة عنك مثل نوع متصفح الإنترنت الذي تستخدمه ونظام التشغيل ونوع هاتفك الذي تستخدمه والأهم من كل ذلك عنوان بروتوكول الإنترنت الخاص بك IP.

لمعرفة المزيد عن Metadata تفضل بقراءة Understanding Metadata نشرت بواسطة National Information Standards Organization (NISO).

  • ما الحل إذا؟

هناك العديد من الحيل التي تستطيع القيام بها لخداع تلك المواقع وإعطائهم بيانات خاطئة عنك سأقوم بالحديث عنها هنا.

 

 

  1. قم بحذف السجل والبيانات المسجلة في المتصفح:

فقط للتأكد من عملك على متصفح نظيف ، من قائمة المتصفح قم بالنقر على Clear Browsing Data وقم بحذف كل شي تم تسجيله بالمتصفح.

  1. عند استخدام محرك البحث احذر تأكد بأنك لست متصل ببريدك الالكتروني:

جوجل ومايكروسوفت وغيرهم من الشركات الكبرى التي توفر التسجيل ببريد الكتروني واحد والحصول على مختلف الخدمات كالبحث والبريد الاكتروني وحفظ الملفات بالسحابة الاكترونية و الفديوهات. جميع تحركاتك في خدماتهم تقوم تلك الشركات بتسجيلها في سيرفراتهم. فيفضل استخدامك لحسابك لديهم في ما تحتاجه فقط . وفقط في الأمور التي  لايمكنك الاستفادة من خدماتهم بدون الدخول بحسابك. (فاليوتيوب و البحث لا يتطلب منك تسجيل الدخول للمشاهدة او البحث).

  1. قم بتنصيب إضافة Ghostery:

ghostery-logo-250px-100310793-small.idge
هذه الإضافة ستعطيك قائمة بالمواقع والخدمات الموجودة بالموقع لتعقبك، تتوفر هذه الإضافة على حميع المتصفحات في الكومبيوتر و على أجهزة الهواتف الذكية.

  1. قم بتفعيل خيار Do Not Track بإعدادات متصفحك:

هذا الخيار يقوم بأمر جميع المواقع التي تزورها بإلغاء جميع الخدمات التي تقوم بتتبعك من خارج الموقع (مثل إحصائيات جوجل و ألاكسا)

  1. قم بتنصيب إضافة abineabineLogo

هذه الإضافة تقوم بحجب جميع المواقع التي تتعقبك. بالإضافة الى بعض الخدمات المميزة للحفاظ على بريدك الإلكتروني من الرسائل المزعجة.

 

  1. اهتم بضبط إعدادات الخصوصية في مواقع التواصل الإجتماعي:

هذه من آهم النقاط يجب أن تقووم بالانتباه لكل ما تقوم بمشاركته في مواقع التواصل الإجتماعي من بيانات و الأهم من ذلك معرفة كيف تقوم بضبط الخصوصية بمواقع التواصل الإجتماعي. قمت مسبقا بعمل شرح لضبط اعدادات الخصوصية في الفيسبوك و اليوتيوب تجدون روابطها من هنا:

 

  1. إنشاء بيانات مجهولة و عشوائية عنك: مثل Fake Name Generator  أو Data Fake Generator

حيث يقوم بإنشاء بيانات كاملة عشوائية ومجهولة عنك كالإسم والطول والوزن ورقم SSN  والعنوان و الايميل ورقم الهاتف وأيضا بامكانك انشاء أرقام لبطاقات إئتمانية .

  1. أنشيء بريد إليكتروني وهمي للتسجيل بالمواقع: مثل 10MinuteMail أو GuerrillaMail أو MailNesia

هذه المواقع تقوم بانشاء بريد إليكتروني وهمي تستطيع استخدامه كأي بريد عادي لفترة من الزمن (عدة دقائق) ثم يقوم الموقع بإعطائك بريد الكتروني جديد. هذه الخدمة أستخدمها بكثرة في كثير من المواقع التي تطلب مني التسجيل بالموقع أو بالقائمة البريدية لكي أقوم بتحميل ملف ما أو مشاهدة موضوع أو فديو. فهدفهم الرذيسي  هو جمع أكبر قدر من البريد الإلكتروني للتسويق عن منتجاتهم (Spam).

 

حتى الآن كل ما قمت به هو اخفاء هويتك الحقيقية بالمواقع فقط وإيقاف تتبع تلك المواقع لك وللصفحات التي تزورها لكن ماذا عن عنوان ال IP الخاص بك فلا يزال بإمكان المواقع ومزود خدمة الانترنت لاتصالك معرفة عنوان الIP الخاص بك وتحديد موقعك.

 

 

بعد أن قمت بتغيير عادتك بتصفح المواقع و انتبهت إلى إعدادات الخصوصية في مواقع التواصل الإجتماعي و معرفتك ما إذا كان المنشور الذي تريد تقديمه لا يفشي عن هويتك لمتابعيك حان الوقت لتغيير عنوان ال IP الخاص بك لخداع المواقع و مزود الخدمة ليكتمل تخفيك بالانترنت.

  1. قم بتنصيب اضافة Proxy Switchy (متصفح كروم) أو FoxyProxy (متصفح فايرفوكس)

بهذه الاضافة تقوم بوضع عدة بروكسيات يدويا بمتصفحك وثم تغيير ما بينهم (لن أتطرق في الحديث عن هذا الموضوع لكثرة المواضيع عنه بالانترنت).

  1. الاشتراك في Virtual Private Network (VPN) : مثل WiTopia

هي عبارة عن شبكة افتراضية تستخدمها الشركات الكبيرة للربط و الاتصال بين مكاتبها البعيدة عبر اتصال آمن ويحجب عنوان ال IP وكل ما تقوم به حتى على مزودي خدمة الانترنت. بإمكانك شراء VPN خاص بك لتتصفح بالانترنت بحرية مطلقة بعيدا عن أعين الرقابة و مراقبة مزود الخدمة لك.

 

  1. أخيرا هناك ما يدعى بالإنترنت المظلم (DarkNet) أو الإنترنت العميق (Deep Web):

هذا عالم آخر كل ما هو موجود بالانترنت العادي والذي جميع البشر يوميا نسبة ضئيلة جدا لما  تتخيل أن يكون موجود في ذلك العالم لايمكن الدخول اليه إلا من خلال برامج خارجية تسمج لك الدخول لها حتى وان حصلت عنوان موقع ما في الإنترنت المظلم لا يمكن فتحه من خلال متصفح الانترنت العادي. كما أنه يصعب (و ليس مستحيل) آن تتجسس عليك الحكومات على مستخدمي شبكات الانترنت المظلم.

تعريف Wikipedia للانترنت المظلم:

مصطلح الإنترنت المظلم أو العنوان المظلم تعود إلى الحواسيب المرتبطة بالشبكة والتي لا يمكن الوصول إليها. قد يكون السبب هو أنه لا يوجد وصلات إنترنت تصل إلى محتويات تلك العناوين أو لأن تلك المحتويات توّلد أو تنتج تلقائياً. على سبيل المثال نأخذ قواعد البيانات المتغيرة بشكل ثابت نجد أن محركات البحث لديها صعوبة في فهرستها. يمكن أيضا أن نعرّف الإنترنت المظلم كمجموعة من ارتباطات الشبكة التي تستعمل بروتوكولات غير (HTTP) ولكنها موجودة على الشبكة العامة وتأسست بطريقة مغلقة وسرية بين أطراف موثوقة بين بعضها البعض. عادة يستعمل هذا النوع لغرض (peer-to-peer file sharing) (تشارك الملفات نظير إلى نظير) أو بين نظيرين.

  • ما يمكن أن تجده في هذا العالم : كل شيء غير مشروع وبعيد عن رقابة الحكومات

    • بيع الأسلحة.
    • كل الإرهابيين يتواصلون فيما بينهم من خلال الانترنت المظلم.
    • بيع تحث ومجوهرات مسروقة.
    • المتاجرة بالمخدرات.
    • جنس الأطفال دون ١٨ سنة.
    • الجنس بأنواعه.
    • نشر وبيع مستندات ووثائق سرية عن الحكومات.
    • كل شي إجرامي قد يخطر ببالك تجده في ذلك العالم.
    • بيع  فيروسات و أكواد الفيروسات و التعامل مع الهكرز.

ملاحظة أخيرة حتى وان كنت تستخدم الانترنت المظلم للحفاظ على خصوصيتك عليك الحذر قدر الامكان وعدم تحميل أي ملف من ذلك العالم . وفي حين تحميلك لآحد الملفات احذر من تشغيلها على جهازك الخاص.

  • كلمة أخيرة:

كما ذكرت في أول المقال بأن الهدف من تتبع هذه المواقع لك فقط من أجل عمل إحصائيات لمدير الموقع بالإضافة إلى عرض إعلانات تناسب إهتماماتك عادة لا نهتم بذلك (حتى أنا لا أهتم بمعظم ما كتبته في هذا المقال) فلا يوجد شي لأخفيه عن غيري. وإن كان هناك شيء مهم وشخصي لن أفصح عنه في الشبكة العنكبوتية. ولكن أود أن أشارك معكم بعض ما تعلمته من خبرتي السنين الماضية.

إن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان

 

Updated: September 28, 2015 — 3:32 am

(المقدمة) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

هذا أول دروس برمجة تطبيقات الأندرويد في مدونتي، ولكن لن أبدأ من الصفر حيث يوجد كثير من الأخوة قاموا بشرح أساسيات برمجة الأندرويد على أكمل وجه. لذلك أحببت أن أقدم درس يهم الجميع وهو كيفية عمل تطبيق أندرويد يكون متصل مع قاعدة بيانات خارجية بحيث لا تحتاج الى إعادة برمجة التطبيق من جديد لإضافة معلومات جديدة.

كل ما عليك هو تحديث البيانات من خلال الإنترنت و سيتم تحديثه تلقائيا و أيضا إرسال البيانات من خلال التطبيق إلى قاعدة البيانات ليتم تحديثها في قاعدة البيانات.

للأسف لا يمكن الاتصال بقاعدة بيانات MySQL أو أي قاعدة بيانات خارجية مباشرة من خلال تطبيق الأندرويد. وللقيام بذلك علينا معرفة مفهوم Web Services.

قمت بعمل رسم توضيحي لطريقة العمل :

لا ترتبك من الصورة بالأعلى فعند معرفتك لمفهوم Web Services و طريقة عملها سوف تسهل عليك العمل على أي نظام تشغيل و أي لغة برمجة أخرى.

سأشرح لكم مفهوم Web Services ببساطة جدا وبدون أي تعمق في الموضوع:

في أي لغة برمجة يوجد ما يسمى بالدالة (Function أو Method)  عمل هذه الدالة هو عمل جزء محدد من البرنامج بمعنى تقسيم المشروع الكبير إلى عدة بريمجات صغيرة.

كمثال في حال كنا نريد عمل برنامج آلة حاسبة فسيكون هناك عمليات كثيرة مثل الجمع والضرب و الطرح و القسمة … الخ، سنقوم بعمل دالة لكل عملية مثلا الجمع (Java):

public int sum(int num1, int num2)

{

int result = 0;

num1 + num2;

return result;

}

 

وعندما نريد استخدام هذه الدالة في أي مكان في الكلاس أو في كلاس آخر نقوم فقط بكتابة اسم الدالة مع إضافة الباراميترز المطلوبة هكذا :

sum(2 , 5);

وسوف نحصل على الناتج (7).

فكرة عمل Web Services  نفس فكرة عمل الدالة  حيث قمنا بعمل الدالة وقمنا بكتابة جميع العمليات المطلوبة بداخل هذه الدالة ووضعنا باراميترز مطلوبة لإنجاز هذه الدالة.

وعندما قمنا بإستخدام الدالة لم نهتم بما تقوم به هذه الدالة فقط أرسلنا الباراميترز المطلوبة و قامت الدالة بعمل كل شي لنا.

الفائدة من Web Services  هو أنك ستقوم بكتابة جميع الدوال المطلوبة للتحكم بقاعدة البيانات أو حتى بالموقع تماما كما ستقوم بكتابتها للتحكم بأي شي عن طريق المتصفح فأنت ستستخدم أحد الطرق POST أو GET  للحصول على البيانات

ولكن الفرق الوحيد هو أنك لن تقوم بإرجاع البيانات على المتصفح (كصورة و تنسيق…الخ) بل ستعيد الببيانات إما بإستخدام XML كما هو مستخدم في RSS  ، أو أن تستخدم (JavaScript Object Notation (JSON حيث لاحقا من خلال العميل سواء كان Android, IOS, Windows Phone أو حتى برامج سطح المكتب أو حتى تستخدمها لبناء موقعك أو قد تكون خدمات تتيحها للمطورين حيث يستفيدوا من بعض الخدمات التي تقدمها في موقعك (مثل خدمات حالة الطقس). فهم لن يعرفوا ما هو الكود الموجود بداخل الدالة ولكن فقط اسم الدالة و الباراميترز المطلوبة.

الآن لنعد لموضوعنا و الصورة بالأعلى سأشرح طريقة سير العمل وما هو المطلوب :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

قمت ببناء التطبيق كما ترون في الفديو التوضيحي سأقوم برفع جميع الأكواد في الدروس مع توضيح لكل سطر في الكود قدر الإمكان.

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

Updated: February 4, 2015 — 5:50 am

(إعداد السيرفر المحلي WAMP و MySQL) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

في هذا الدرس سنقوم بتنصيب و إعداد السيرفر المحلي وبناء قاعدة البيانات.

  • الخطوة الأولى: تنصيب السيرفر المحلي WAMP Server والتأكد من عمله على LocalHost

يوجد الكثير من البرامج التي تسمح لك بإعداد سيرفر محلي خاص ولكن في هذه السلسلة سوف نستخدم WAMP بإمكانك تحميل البرنامج من خلال هذا الرابط :

http://www.wampserver.com/en

بعد تثبيت WAMP قم بتشغيل البرنامج حتى تصبح أيقونة البرنامج خضراء كما في الصورة

wamp-green

للتأكد من عمل السيرفر قم بفتح المتصفح و اكتب في شريط العنوان http://localhost

من المفترض أن تحصل على صفحة مثل هذه

localhost

لعمل مشروع جديد اذهب إلى مجلد www الموجود في C:\wamp\www أو مكان ما قمت بتنصيب السيرفر

قم بعمل مجلد جديد وقم بتسميته “android-webservices” أو أي اسم تود إختياره حيث سنقوم بوضع جميع ملفات PHP الخاصة بالمشروع في هذا المجلد.

بداخل المجلد الذي أنشأته قم بإضافة ملف نص جديد قم بتسميته “index.php

قم بفتح هذا الملف بإستخدام أي محرر نصوص تفضله أنا أستخدم NotePad++  بداخل ملف “index.php” قم بكتابة الكود التالي

<?php

echo "This is my first PHP code";

?>

 

الآن في المتصفح قم بكتابة العنوان التالي (قم بتغيير android-webservice إلى اسم المجلد الذي قمت بإنشائه)

http://localhost/android-webservice

ستظهر لك صفحة مكتوب فيها “This is my first PHP code” كما هو موجود في الصورة التالية:

php-first

وهكذا تأكدنا من عمل PHP ، في هذه السلسلة لن أتطرق إلى شرح تفاصيل حول لغات البرمجة PHP أو Java في الأندرويد على إفتراض أن لديك خلفية ولو بسيطة حولها ولكن سأحاول قدر الإمكان شرح المفاهيم المعقدة.

  • الخطوة الثانية: بناء قاعدة البيانات MySQL

قم بالتوجه إلى PHPMyAdmin من خلال هذا الرابط:

http://localhost/phpmyadmin

ثم انقر على Database

phpmyadmin

في حقل 

db-name

 

الآن قم بالنقر على Databases ثم انقر على اسم قاعدة البيانات التي أنشأتها. سيتم نقلك إلى صفحة إنشاء الجداول.

في هذا المشروع سأقوم بعمل جدول واحد فقط بإسم users  يحتوي على 4 أعمدة user_id , user_username, user_password, user_displayname

قم بوضع البيانات كما في الصورة التالية:

tabel

 

table-structure

كود SQL  لقاعدة البيانات و جدول users

--
-- Database: `android_webservices`
--
CREATE DATABASE IF NOT EXISTS `android_webservices` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `android_webservices`;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_username` varchar(255) NOT NULL,
  `user_password` varchar(255) NOT NULL,
  `user_displayname` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

 

  • إعداد ملف config.php للإتصال بقاعدة البيانات:

بعد أن قمنا بإنشاء قاعدة البيانات بقي علينا كتابة أكواد PHP  لنقوم بإضافة و حذف و تعديل قاعدة البيانات ولكن بدل أن نقوم بالإتصال بقاعدة البيانات في كل ملف PHP  سنقوم بكتابة بيانات الاتصال بقاعدة البيانات في ملف واحد بإسم config.php حيث سنقوم فقط بإضافة اسم الملف فقط في بداية كل ملف PHP  نقوم بإنشائه لاحقا.

وجدت في هذا الموقع شرح تفصيلي لكيفية انشاء نظام تسجيل محمي مع كتابة تعليقات مفصلة للكود (تسجيل مستخدم جديد – تسجيل دخول – تسجيل خروج و تعديل بيانات المستخدم ) وقمت بأخذ نسخة من كود الاتصال بقاعدة البيانات>

هذا رابط الموقع :

http://forums.devshed.com/php-faqs-stickies-167/program-basic-secure-login-system-using-php-mysql-891201.html

الآن في مجلد android-webservice الذي أنشأناه في www قم بإنشاء ملف نص جديد بإسم config.php وضع به الكود التالي:

قم بتغيير البيانات التالية بما تتناسب معك

$username = "root";&nbsp;// غالبا اسم المستخدم هو root ان قمت بتغيير الاسم فقم بوضعه هنا
$password = "";&nbsp; // ان أضفت كلمة مرور لقاعدة البيانات فضعها هنا 
$host = "localhost";&nbsp;
$dbname = "android_webservices"; // قم بتغيير قاعدة البيانات باسم قاعدة البيانات لديك

 

كود ملف confog.php

<?php 
/***
* @Source: devshed
* @author E-Oreo
* http://forums.devshed.com/php-faqs-stickies-167/program-basic-secure-login-system-using-php-mysql-891201.html
*/
    // These variables define the connection information for your MySQL database 
	$username = "root"; 
    $password = ""; 
    $host = "localhost"; 
    $dbname = "android_webservices"; 

// UTF-8 is a character encoding scheme that allows you to conveniently store 
    // a wide varienty of special characters, like ¢ or €, in your database. 
    // By passing the following $options array to the database connection code we 
    // are telling the MySQL server that we want to communicate with it using UTF-8 
    // See Wikipedia for more information on UTF-8: 
    // http://en.wikipedia.org/wiki/UTF-8 
    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
     
    // A try/catch statement is a common method of error handling in object oriented code. 
    // First, PHP executes the code within the try block.  If at any time it encounters an 
    // error while executing that code, it stops immediately and jumps down to the 
    // catch block.  For more detailed information on exceptions and try/catch blocks: 
    // http://us2.php.net/manual/en/language.exceptions.php 
    try 
    { 
        // This statement opens a connection to your database using the PDO library 
        // PDO is designed to provide a flexible interface between PHP and many 
        // different types of database servers.  For more information on PDO: 
        // http://us2.php.net/manual/en/class.pdo.php 
        $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) 
    { 
        // If an error occurs while opening a connection to your database, it will 
        // be trapped here.  The script will output an error and stop executing. 
        // Note: On a production website, you should not output $ex->getMessage(). 
        // It may provide an attacker with helpful information about your code 
        // (like your database username and password). 
        die("Failed to connect to the database: " . $ex->getMessage()); 
    } 
     
    // This statement configures PDO to throw an exception when it encounters 
    // an error.  This allows us to use try/catch blocks to trap database errors. 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     
    // This statement configures PDO to return database rows from your database using an associative 
    // array.  This means the array will have string indexes, where the string value 
    // represents the name of the column in your database. 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
     
    // This block of code is used to undo magic quotes.  Magic quotes are a terrible 
    // feature that was removed from PHP as of PHP 5.4.  However, older installations 
    // of PHP may still have magic quotes enabled and this code is necessary to 
    // prevent them from causing problems.  For more information on magic quotes: 
    // http://php.net/manual/en/security.magicquotes.php 
    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
    { 
        function undo_magic_quotes_gpc(&$array) 
        { 
            foreach($array as &$value) 
            { 
                if(is_array($value)) 
                { 
                    undo_magic_quotes_gpc($value); 
                } 
                else 
                { 
                    $value = stripslashes($value); 
                } 
            } 
        } 
     
        undo_magic_quotes_gpc($_POST); 
        undo_magic_quotes_gpc($_GET); 
        undo_magic_quotes_gpc($_COOKIE); 
    } 
     
    // This tells the web browser that your content is encoded using UTF-8 
    // and that it should submit content back to you using UTF-8 
    header('Content-Type: text/html; charset=utf-8'); 
     
    // This initializes a session.  Sessions are used to store information about 
    // a visitor from one web page visit to the next.  Unlike a cookie, the information is 
    // stored on the server-side and cannot be modified by the visitor.  However, 
    // note that in most cases sessions do still use cookies and require the visitor 
    // to have cookies enabled.  For more information about sessions: 
    // http://us.php.net/manual/en/book.session.php 
    session_start(); 

    // Note that it is a good practice to NOT end your PHP files with a closing PHP tag. 
    // This prevents trailing newlines on the file from being included in your output, 
    // which can cause problems with redirecting users.

?>

 

قمنا الآن بإعداد قاعدة البيانات و ملف الإتصال بقاعدة البيانات. في الدروس القادمة سوف نبدأ بتطوير ال Web Services المطلوبة و سأشرح بالتفصيل الممل طريقة عملها بالإضافة الى شرح JSON.

 

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

Updated: February 4, 2015 — 5:51 am

(بناء Web Service تقوم بعمل Login و Register) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

 

كود register.php

<?php
/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */
 
require("config.php");

// في حال عدم وجود طلب POST 
// سنقوم بعرض فورم HTML  الموجود بآخر الكود
if(!empty($_POST)){

    // تأكد من أن المستخدم قام بإدخال جميع الحقول المطلوبة 
	// username , password, displayname  هي الحقول المطلوبة لتنفيذ هذا الكودdisplayname
    if(empty($_POST['username'])||empty($_POST['password'])||empty($_POST['displayname'])){
        
		// في حال عدم تعبئة أحد الحقول سنقوم بعرض رسالة تنبيه للمستخدم
		
		//  إنشاء بعض البيانات ليتم عرضها كـ JSON Object
		/*
		* الهدف من success   
		* التأكد من أن  عملية التسجيل تمت بنجاح ام لا
		* عند الحصول على القيمة صفر ، ذلك يعني لم تتحقق جميع الشروط المطلوبة لتسجيل الدخول 
		*/
		$response["success"] = 0; 
		
	    // الرسالة التي ستظهر للمستخدم أو المطور 
		// (حيث بإمكان المطور لاحقا وضع رسالة خاصة به كل ما يحتاجه فقط قيمة success)
		
        $response["message"] = "All Fields Required";
        
        //  نقوم بإيقاف السكريبت و نطبع رسالة JSON
        /* 
		* الدالة json_encode() 
		* نقوم هذه الدالة بتحويل قيمة response 
		* إلى JSON
        */
        die(json_encode($response));
    }
	
    // في حال عدم وجود أي خطأ سنقوم بتنفيذ الأسطر التالية
    
    // نتأكد من عدم وجود اسم مستخدم آخر في قاعدة البيانات باستخدام COUNT(*)
	// إذا كانت القيمة أكثر من 0 ذلك يعني وجود مستخدم آخر بنفس الإسم
    // ":user" فقط لحجز قيمة username  وتحويلها لنص قبل تنفيذ أمر sql
	// نقوم بعمل ذلك لحماية قاعدة البيانات من SQL injections
	
    $query = "SELECT COUNT(*) AS count 
				   FROM users 
				   WHERE 
				   user_username = :user";
    
    // نقوم بتحديث قيمة :user 
    $query_params = array(
        ':user' => $_POST['username']
    ); 
    
    
    
    // الآن نقوم بتنقيذ أمر SQL
    try{
        // يقوم هذا السطر بإعداد أمر SQL
        $stmt = $db->prepare($query);
		// يقوم هذا السطر بتنفيذ أمر SQL مع المتغيرات التي قمنا بإدخالها
        $result = $stmt->execute($query_params);
		
		// نقوم  الآن بحساب ناتج قيمة count 
		// PDO::FETCH_ASSOC
		// تقوم بإرجاع كل صف ناتج من الأمر كمصفوفة [column] => value
		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
		$username_count = $row["count"];
		//print_r($row);
		}
			// الآن نتأكد ان كانت قيمة username_count
			// إذا كانت أكبر من 0  ذلك يعني وجود اسم مستخدم مسجل في قاعدة البيانات 
			if ($username_count > 0) {
			
				// نقوم بإعداد بيانات JSON 
				// ورسالة للمستخدم بإن اسم المستخدم متاح مسبقا
				$response["success"] = 0;
				$response["message"] = "That username is already taken. Please try again.";
				
				// نقوم بإيقاف السكريبت و نطبع رسالة JSON
				die(json_encode($response));
				
		}

		
    }catch(PDOException $ex){
        
		// في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم
        $response["success"] = 0;
        $response["message"] = "Something went wrong. Please try again later";

		// نقوم بإيقاف السكريبت و نطبع رسالة JSON
        die(json_encode($response));
        
    }
   
	// إذا لم يحصل أي خلل حتى هذا السطر 
	// هذا يعني أنه بإمكانه إدخال بيانات المستخدم في قاعدة البيانات
	
    // الآن نقوم بإعداد أمر SQL  لإدخال بيانات المستخدم في قاعدة البيانات
	// :user, :pass نستخدم نفس الطريقة التي شرحتها بالأعلى لإدخال البيانات في قاعدة البيانات
    $query = "INSERT INTO 
					users (user_username, user_password, user_displayname) 
					VALUES 
					(:user, :pass, :displayname)";
    
    // نقوم بتشفير كلمة المرور 
    $encr_user_pass = md5($_POST['password']);
    
    
    // نقوم بتحديث قيمة المتغيرات :user, :pass ,:displayname
    $query_params = array(
        ':user' => $_POST['username'],
		// :pass قمنا بتحديثه بكلمة المرور المشفرة 
        ':pass' =>  $encr_user_pass,
		':displayname' => $_POST['displayname']
    );
    
    // نقوم بتنفيذ أمر SQL لإدخال اسم المستخدم و كلمة المرور في قاعدة البيانات 
    try {
        $stmt = $db->prepare($query);
        $result = $stmt->execute($query_params);
               
    } catch (PDOException $ex) {
       // في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم
		
        $response["success"] = 0;
        $response["message"] = "The username is already in use, please try again later!";
		
		// نقوم بإيقاف السكريبت و نطبع رسالة JSON
        die(json_encode($response));
    }
	
	/*
	* إذا وصلنا إلى هذه السطر بدون أي مشاكل 
	* هذا يعني أنه تم ادخال اسم المسخدم وكلمة المرور بقاعدة البيانات بنجاح 
	*/
    
	// أخيرا سنقوم بتغيير قيمة success = 1
	// و رسالة تفيد بأنه تم ادخال البيانات بنجاح
    $response["success"] = 1;
    $response["message"] = "Username Successfully Added";
	
	// و أخيرا نعرض رسالة JSON  للمستخدم
    echo json_encode($response);
        
}else{
    ?>

<h1>Register</h1>
<form action="register.php" method="post">
    Username: <br/>
    <input type="text" name="username" placeholder="Username"/><br/>
    Password: <br/>
    <input name="password" type="password" placeholder="Password"/><br/>
    Display Name: <br/>
    <input type="text" name="displayname" placeholder="Display Name"/><br/>
    <input type="submit" value="Register User"/>
</form>
<?php
}

?>

 

كود login.php

<?php
/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */
 
require('config.php');

// في حال عدم وجود طلب POST 
// سنقوم بعرض فورم HTML  الموجود بآخر الكود
if(!empty($_POST)){
    
	// تأكد من أن المستخدم قام بإدخال جميع الحقول المطلوبة 
	// username , password  هي الحقول المطلوبة لتنفيذ هذا الكود
    if(empty($_POST['username'])||empty($_POST['password'])){
	// في حال عدم تعبئة أحد الحقول سنقوم بعرض رسالة تنبيه للمستخدم
		
		//  إنشاء بعض البيانات ليتم عرضها كـ JSON Object
		/*
		* الهدف من success   
		* التأكد من أن  عملية التسجيل تمت بنجاح ام لا
		* عند الحصول على القيمة صفر ، ذلك يعني لم تتحقق جميع الشروط المطلوبة لتسجيل الدخول 
		*/
		
        $response["success"] = 0;
		
	    // الرسالة التي ستظهر للمستخدم أو المطور 
		// (حيث بإمكان المطور لاحقا وضع رسالة خاصة به كل ما يحتاجه فقط قيمة success)
		
        $response["message"] = "All Fields Required";
		
		//  نقوم بإيقاف السكريبت و نطبع رسالة JSON
        /* 
		* الدالة json_encode() 
		* نقوم هذه الدالة بتحويل قيمة response 
		* إلى JSON
        */
        die(json_encode($response));
    }
	
	 // في حال عدم وجود أي خطأ سنقوم بتنفيذ الأسطر التالية
    
    // نقوم بكتابة أمر SQL للتأكد من وجود اسم المستخدم
    // ":user" فقط لحجز قيمة username  وتحويلها لنص قبل تنفيذ أمر sql
	// نقوم بعمل ذلك لحماية قاعدة البيانات من SQL injections
    
    $query = "
            SELECT * FROM `users` 
            WHERE
            user_username = :user
             ";
			 
	// نقوم بتحديث قيمة :user
    $query_params = array(
        ':user' => $_POST['username']
    );
	
	// الآن نقوم بتنقيذ أمر SQL
    try {
		// يقوم هذا السطر بإعداد أمر SQL
        $stmt = $db->prepare($query);
		
		// يقوم هذا السطر بتنفيذ أمر SQL مع المتغيرات التي قمنا بإدخالها
        $result = $stmt->execute($query_params);
    } catch (PDOException $ex) {
	
		// في حال وجود خلل في من قاعدة البيانات 
		// نقوم باعداد بيانات JSON
		// ونعرض رسالة تنبيه للمستخدم		
        $response['success'] = 0 ;
        $response['message'] = "Database Error1, Please try Again";
        die(json_encode($response));
    }
	
	/*
	* إذا لم يحصل أي خلل حتى هذا السطر 
	* ذلك يعني ان اسم المستخدم موجود في قاعدة البيانات
	*/
	
	// الآن علينا التأكد من كلمة المرور
	
	// أولا سنقوم بكتابة متغير is_login ليكون قيمته false 
	$is_login = false;
    
	// سنقوم بتشفير الباسوود المدخل بنفس طريقة التشفير المستخدمة في register.php
    $encr_user_pass = md5($_POST['password']);
    
	// سنقوم بجلب جميع الصفوف الناتجة من أمر SQL
	// في هذه الحالة سيكون  هناك صف واحد فقط لأنه لن يكون هناك اسم مستخدم مكرر
	$row = $stmt->fetch();
	
	// في حال وجود صفوف ناتجة من أمر SQL
    if ($row){
        // نقوم بمقارنة كلمة المرور المشفرة مع كلمة المرور الموجودة في قاعدة البيانات
        if($encr_user_pass === $row['user_password']){
			// في حال تطابق كلمة المرور
			// سنقوم بتغيير قيمة is_login الى true
            $is_login = true;
        }
    }
    

	/*
	* أخيرا إن كانت قيمة is_login = true
	* فهذا يعني أن اسم المستخدم و كلمة المرور صحيحة 
	* 
	*  غير ذلك فسنعرض رسالة خطأ للمستخدم
	*/
    if($is_login){
		// في حال تم تحقيق الشرط 
		// سنقوم بتغيير  success = 1
		// و رسالة تفيد بأنه تسجيل الدخول بنجاح
        $response["success"] = 1;
        $response["message"] = "Login Successful";
	
	// و أخيرا نعرض رسالة JSON  للمستخدم
        die(json_encode($response));
    }else{
		// في حال تم تحقيق الشرط 
		// سنقوم بتغيير  success = 0
		// و رسالة بأن اسم المستخدم أو كلمة المرور خاطئة
        $response["success"] = 0;
        $response["message"] = "username or password Incorrect";
		// و أخيرا نعرض رسالة JSON  للمستخدم
        die(json_encode($response));
    }
    
}else{
?>
<h1>Login</h1>
<form action="login.php" method="post">
    Username: <br/>
    <input type="text" name="username" placeholder="Username"/><br/>
    Password:<br/>
    <input type="password" name="password" placeholder="Password"/><br/>
    <input type="submit" value="Login"/>
    <a href="register.php">Register</a>
</form>
<?php
}
?>

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

Updated: February 4, 2015 — 5:52 am

(بناء Web Service تقوم بجلب بيانات المستخدمين) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

 

كود users.php

<?php
/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */
 
require("config.php");

// نقوم بكتابة أمر لجلب جميع الحقول الموجودة في جدول users
$query = "SELECT * FROM users";

//  نقوم بتنفيذ أمر SQL
try {
    $stmt = $db->prepare($query);
    $result = @$stmt->execute($query_params);
} catch (PDOException $ex) {
	// في حال وجود خلل في من قاعدة البيانات 
	// نقوم باعداد بيانات JSON
	// ونعرض رسالة تنبيه للمستخدم		
    $response["success"] = 0;
    $response["message"] = "Database Error";
}

// سنقوم بجلب جميع الصفوف الناتجة من أمر SQL
$rows = $stmt->fetchAll();

// في حال وجود صفوف ناتجة من أمر SQL
if ($rows){
	//  في حال وجود صفوف ناتجة من أمر SQL
	// نقوم بتعبئة بيانات JSON
	// بداية بوضع قيمة success = 1 
	// ونضع رسالة في message
    $response["success"] = 1;
    $response["message"] = "Users Available";
	
	/*******************************************************************************
	 * بما أننا سنقوم بجلب جميع بيانات المستخديم في جدول users
	 * فذلك يعني أننا سنستخدم JSON Array
	 * حيث أن كل مصفوفة تحتوي على بيانات مستخدم واحد مثل id , username , displayname
	 * لذلك سنقوم بوضع users كاسم للمصفوفة 
	 * وبداخل كل مصفوفة سنقوم بوضع بيانات كل مستخدم 
	 *****************************************************************************/
	
	// أولا سنقوم بتسمية المصفوفة users 
    $response["users"] = array();
    
	// بعد ذلك سنقوم بعملية تكرار في قاعدة البيانات لجلب بيانات المستخدم التالية
	// user_id	-  user_username	-  user_displayname	
    foreach ($rows as $row){
		// أولا سنقوم بدمج جميع هذه البيانات  في مصفوفة فرعية بمتغير باسم single_user
        $single_user = array();
		
		// ثم لكل key في single_user
		// سنقوم بوضع value خاصة بها في قاعدة البيانات
		// لتظهر لاحقا في JSON بهذا الشكل 
		
        $single_user["id"] = $row["user_id"];
        $single_user["username"] = $row["user_username"];
        $single_user["displayname"] = $row["user_displayname"];
        
        // أخيرا سنقوم بدمج مصفوفة $single_user مع مصفوفة $response["users"]
		array_push($response["users"], $single_user);
    }
    
    // و أخيرا نعرض رسالة JSON  للمستخدم
    echo json_encode($response);
}else{
		// في حال عدم وجود مستخدمين في قاعدة البيانات 
		// سنقوم بتغيير  success = 0
		// و رسالة للمستخدم بعدم وجود مستخدمين 
    $response["success"] = 0;
    $response["message"] = "No Users Available";
	
	// و أخيرا نعرض رسالة JSON  للمستخدم
    die(json_encode($response));
}
?>

 

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

Updated: February 4, 2015 — 5:52 am

(إعداد واجهة تطبيق الأندرويد) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

 

AndroidManifest.xml

لا تنسى تغيير اسم الباكج
package=”com.ahmaadssb.androidwebservices”

<?xml version="1.0" encoding="utf-8"?>
<!-- 

 @author Ahmadssb
 Created by ahmadssb on 2014-12-13
 Website: http://www.ahmadssb.com
 Email: [email protected]
 Facebook: https://www.facebook.com/ahmadssbblog
 Twitter: https://twitter.com/ahmadssb
 YouTube: http://www.youtube.com/user/ahmadssbblog

 لا تنسى تغيير اسم الباكج   
package="com.ahmaadssb.androidwebservices"
 -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    
    package="com.ahmaadssb.androidwebservices"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:label="Register Activity" android:name=".RegisterActivity"></activity>
        
        <activity android:label="Users Activity" android:name=".UsersActivity"></activity>
    </application>

</manifest>

 

activity_main.xml

<!-- 

 @author Ahmed Saleh
 Created by ahmadssb on 2014-12-13
 Website: http://www.ahmadssb.com
 Email: [email protected]
 Facebook: https://www.facebook.com/ahmadssbblog
 Twitter: https://twitter.com/ahmadssb
 YouTube: http://www.youtube.com/user/ahmadssbblog

 -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ahmaadssb.androidwebservices.MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="إسم المستخدم"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="كلمة المرور"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:ems="10"
        android:inputType="textPassword" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >

        <Button
            android:id="@+id/btnLogin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="تسجيل الدخول" />

        <Button
            android:id="@+id/btnRegisterUser"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="مستخدم جديد" />

    </LinearLayout>

</LinearLayout>

 

register_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 

 @author Ahmed Saleh
 Created by ahmadssb on 2014-12-13
 Website: http://www.ahmadssb.com
 Email: [email protected]
 Facebook: https://www.facebook.com/ahmadssbblog
 Twitter: https://twitter.com/ahmadssb
 YouTube: http://www.youtube.com/user/ahmadssbblog

 -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="اسم المستخدم"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtRegisterUserName"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="الإسم الكامل"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtRegisterDisplayName"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <TextView
        android:id="@+id/textView3"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="كلمة المرور"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtRegisterPassword"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btnRegister"
        android:layout_gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="تسجيل" />

</LinearLayout>

 

users_layout.xml

 

<?xml version="1.0" encoding="utf-8"?>
<!-- 

 @author Ahmed Saleh
 Created by ahmadssb on 2014-12-13
 Website: http://www.ahmadssb.com
 Email: [email protected]
 Facebook: https://www.facebook.com/ahmadssbblog
 Twitter: https://twitter.com/ahmadssb
 YouTube: http://www.youtube.com/user/ahmadssbblog

 -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

 

single_user_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 

 @author Ahmed Saleh
 Created by ahmadssb on 2014-12-13
 Website: http://www.ahmadssb.com
 Email: [email protected]
 Facebook: https://www.facebook.com/ahmadssbblog
 Twitter: https://twitter.com/ahmadssb
 YouTube: http://www.youtube.com/user/ahmadssbblog

 -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:src="@drawable/ic_launcher" />

        <android.support.v7.widget.Space
            android:id="@+id/space1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.1"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <TextView
                    android:id="@+id/txtID"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Large "
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                <android.support.v7.widget.Space
                    android:id="@+id/space2"
                    android:layout_width="5dp"
                    android:layout_height="wrap_content" />

                <TextView
                    android:id="@+id/txtUsername"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="0.6"
                    android:text="Large"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

            </LinearLayout>

            <TextView
                android:id="@+id/txtDisplayName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_gravity="center"
                android:text="Large "
                android:textAppearance="?android:attr/textAppearanceLarge" />

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

Updated: February 4, 2015 — 5:52 am