Professional Documents
Culture Documents
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 1
ﻣﻘﺪﻣﺔ
ﻋﺰﯾﺰي اﻟﺪارس ،إن ﻓﻠﺴﻔﺔ اﻟﻨﻈﻢ اﻟﻤﻮزﻋﺔ ھﻮ أن ﯾﻜﻮن ﻟﺪﯾﻚ ﺷﺒﻜﺔ ﻣﻦ اﻟﺤﻮاﺳﯿﺐ )اﻟﻌﻘﺪ (nodesاﻟﺘﻲ ﯾﻌﻤﻞ ﺑﻌﺾ ﻣﻨﮭﺎ ﻋﻠﻰ ﻧﻈﺎم
ﺗﺸﻐﯿﻞ ﻣﺨﺘﻠﻒ ﻋﻦ ﻧﻈﻢ اﻟﺘﺸﻐﯿﻞ ﻋﻠﻰ ﺑﺎﻗﻲ اﻟﻌﻘﺪ )اﻟﺤﻮاﺳﯿﺐ( ،وﺗﻄﺒﯿﻘﺎت ﺑﻌﻀﮭﺎ ﻣﻜﺘﻮب ﺑﻠﻐﺔ ﺑﺮﻣﺠﺔ ﻗﺪ ﺗﻜﻮن ﻧﻔﺴﮭﺎ أو ﻣﺨﺘﻠﻔﺔ ﻋﻦ
ﺑﺎﻗﻲ اﻟﻌﻘﺪ .ﻓﻤﺜﻼ ،ﺷﺒﻜﺔ ﻣﺎ ،ﺗﺤﻮي ﺟﮭﺎز )ﻋﻘﺪة( ﯾﻌﻤﻞ ﺑﻨﻈﺎم ﺗﺸﻐﯿﻞ وﯾﻨﺪوز ،ﯾﻌﻤﻞ ﻋﻠﯿﮫ ﺗﻄﺒﯿﻖ ﻣﻜﺘﻮب ﺑﻠﻐﺔ C#وﯾﺮﺗﺒﻂ ﺑﻘﺎﻋﺪة
ﺑﯿﺎﻧﺎت ﻣﻦ ﻣﺎﯾﻜﺮوﺳﻮﻓﺖ .وﺟﮭﺎز آﺧﺮ ﯾﻌﻤﻞ ﺑﺄﺣﺪ أﻧﻈﻤﺔ ﻟﯿﻨﻮﻛﺲ ،ﯾﻌﻤﻞ ﻋﻠﯿﮫ ﺗﻄﺒﯿﻖ ﻣﻜﺘﻮب ﺑﻠﻐﺔ ،Javaوﯾﺮﺗﺒﻂ ﺑﻘﺎﻋﺪة ﺑﯿﺎﻧﺎت
.MySQLوﺟﮭﺎز ﺛﺎﻟﺚ ،اﻟﺦ.
ﯾﻮﺟﺪ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﻤﻨﺼﺎت platformsاﻟﺘﻲ ﺗﻌﻤﻞ ﺑﻨﻈﻢ ﺗﺸﻐﯿﻞ وﺗﻄﺒﯿﻘﺎت وﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت ﺗﺨﺘﻠﻒ ﻋﻦ ﺑﻌﻀﮭﺎ اﻟﺒﻌﺾ.
ھﻨﺎ ﯾﺄﺗﻲ دور اﻟﻨﻈﻢ اﻟﻤﻮزﻋﺔ ﻓﻲ ﺗﻮﺻﯿﻒ ﺑﺮوﺗﻮﻛﻮل ﯾﻌﻤﻞ ﻋﻠﻰ ﺟﺴﺮ اﻟﮭﻮة ﺑﯿﻦ ھﺬه اﻟﻤﻨﺼﺎت ﻣﻦ ﺧﻼل ﺣﻞ ﻣﺸﻜﻠﺔ اﻟﺘﺒﺎدﻟﯿﺔ
) (Interoperabilityوﯾﻮﻓﺮ ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل ﺑﯿﻨﮭﺎ.
ﻓﻲ ھﺬا اﻟﺪﻟﯿﻞ اﻟﻌﻤﻠﻲ ،ﺳﺘﻌﻤﻞ ﻋﺰﯾﺰي اﻟﺪارس ،وﺑﻤﺴﺎﻋﺪة ﻣﺸﺮﻓﻚ اﻷﻛﺎدﯾﻤﻲ وﻓﻨﻲ اﻟﻤﺨﺘﺒﺮ ،ﻋﻠﻰ إﺟﺮاء ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺘﺠﺎرب
اﻟﻌﻤﻠﯿﺔ ،ﻣﻦ ﺧﻼل ﻧﺸﺎطﺎت ﺻﻔﯿّﺔ .ﺣﯿﺚ ﺳﺘﻘﻮم ﺑﺘﺠﺎرب ﺗﺪﻋﻢ ﺗﻄﺒﯿﻘﺎت اﻟﻨﻈﻢ اﻟﻤﻮزﻋﺔ ﺑﺎﺳﺘﺨﺪام ﻟﻐﺔ ﺟﺎﻓﺎ ،ﻣﻦ ﺧﻼل ﺑﺮوﺗﻮﻛﻮﻟ ّﻲ
اﻻﺗﺼﺎل RMIو .CORBAوﺳﺘﻌﻤﻞ أﯾﻀﺎ ﻋﻠﻰ إﺟﺮاء ﺗﺠﺎرب ﺗﺪﻋﻢ اﻛﺒﺮ ﺷﺒﻜﺔ ﻣﻮزﻋﺔ وھﻲ اﻻﻧﺘﺮﻧﺖ .ﺑﺎﻟﺘﺎﻟﻲ ﺳﺘﺴﺘﺨﺪم ﻛﻞ ﻣﻦ
ﻟﻐﺔ PHPوﺑﺮوﺗﻮﻛﻮل اﻻﺗﺼﺎل .XML-RPC
ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﺘﺴﺘﺨﺪم ﻓﻲ ﺟﻤﯿﻊ اﻟﺤﺎﻻت ،ﺳﻮاء ﻛﺎﻧﺖ ﺗﻄﺒﯿﻘﺎت ﻋﺎدﯾﺔ أو ﺗﻄﺒﯿﻘﺎت اﻻﻧﺘﺮﻧﺖ ،ھﻲ .MySQLوﺑﺎﻟﺘﺎﻟﻲ ﻓﺈن
ﺗﻄﺒﯿﻘﺎت اﻟﻨﻈﻢ اﻟﻤﻮزﻋﺔ وﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎﺗﮭﺎ ﺳﺘﻜﻮن اﻟﮭﺪف اﻷﺳﺎﺳﻲ ﻣﻦ ھﺬا اﻟﺪﻟﯿﻞ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 2
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻷول
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 3
أوﻻ :ﻣﻘﺪﻣﺔ
ﺗﺪﻋﻢ ﻟﻐﺔ ﺟﺎﻓﺎ اﻟﻌﺪﯾﺪ ﻣﻦ ﺑﺮوﺗﻮﻛﻮﻻت اﻻﺗﺼﺎﻻت اﻟﺘﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ طﺒﻘﺔ اﻟﺸﺒﻜﺔ ،وﺗﻌﺘﺒﺮ ھﺬه اﻟﺒﺮوﺗﻮﻛﻮﻻت ﺣﻠﻘﺔ اﻟﻮﺻﻞ ﻣﺎ ﺑﯿﻦ
اﻟﺘﻄﺒﯿﻘﺎت اﻟﺒﺮﻣﺠﯿﺔ وﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت واﻟﻤﺴﺘﺨﺪم ﻣﻦ ﺟﮭﺔ وﻣﺎ ﺑﯿﻦ ﺑﺮﺗﻮﻛﻮﻻت اﻻﺗﺼﺎل ﻓﻲ طﺒﻘﺔ اﻟﺸﺒﻜﺔ .إﺣﺪى ھﺬه اﻟﺒﺮوﺗﻮﻛﻮﻻت
اﻟﺘﻲ ﺗﺪﻋﻤﮭﺎ ﺟﺎﻓﺎ ھﻲ اﺳﺘﺪﻋﺎء اﻟﻄﺮق ﻋﻦ ﺑﻌﺪ ،Remote Method Invocationواﻟﺘﻲ ﺗﻌﺘﺒﺮ ورﯾﺜﺔ ﺑﺮوﺗﻮﻛﻮل اﺳﺘﺪﻋﺎء اﻹﺟﺮاء
ﻋﻦ ﺑﻌﺪ ،Remote Procedure Callإﻻ أن ﻟﻐﺔ ﺟﺎﻓﺎ ،ﺗﻌﺮف طﺮق methodsﺑﺪﻻ ﻣﻦ اﻹﺟﺮاءات proceduresأو اﻟﺪوال
.functionsأﯾﻀﺎ ﺗﺪﻋﻢ ﻟﻐﺔ ﺟﺎﻓﺎ ﻣﻌﻤﺎرﯾﺔ وﺳﯿﻂ طﻠﺐ اﻷھﺪاف اﻟﻤﺸﺘﺮﻛﺔ Common Object Request Broker
Architectureأو اﻟﻤﻌﺮوﻓﺔ ﺑﺎﻻﺧﺘﺼﺎر .CORBAﺗﻘﺪم ﻟﻐﺔ ﺟﺎﻓﺎ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻤﻜﺘﺒﺎت اﻟﺘﻲ ﺗﯿ ّﺴﺮ ﻋﻤﻞ اﻟﻤﺒﺮﻣﺞ ﺑﺤﯿﺚ ﯾﻤﻜﻦ
ﻛﺘﺎﺑﺔ ﺑﺮاﻣﺞ ﺗﻌﻤﻞ ﻋﻠﻰ اﻻﺗﺼﺎل ﺑﯿﻦ اﻟﺤﻮاﺳﯿﺐ ﺑﺎﺳﺘﺨﺪام CORBAأو RMIوﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ اﻟﺮﺑﻂ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ،أو إﻧﺸﺎء
GUIﺧﺎص ﺑﺎﻟﻤﺴﺘﺨﺪﻣﯿﻦ .ھﺬه اﻟﺘﺠﺮﺑﺔ ،ﺳﯿﺘﻢ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ،RMIوﻓﻲ اﻟﺘﺠﺮﺑﺔ اﻟﺜﺎﻧﯿﺔ ﺳﯿﺘﻢ اﻟﺘﻌﺎﻣﻞ ﻣﻊ .CORBA
ﻋﺰﯾﺰي اﻟﺪارس ،ھﻨﺎك ﻋﺪة طﺮق ﻟﺘﺼﻨﯿﻒ ) (Compileوﺗﻨﻔﯿﺬ ) (Runﺑﺮاﻣﺞ ﺟﺎﻓﺎ .ﻣﻨﮭﺎ:
ﺑﺎﺳﺘﺨﺪام ﺑﯿﺌﺔ اﻟﺘﻄﻮﯾﺮ ) (eclipseواﻟﺬي ﯾﻤﻜﻦ ﺗﺤﻤﯿﻠﮫ ) (downloadﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺘﺎﻟﻲ: .1
http://www.eclipse.org/downloads/
ﺑﺎﺳﺘﺨﺪام ﺑﯿﺌﺔ اﻟﺘﻄﻮﯾﺮ ) ،(JBuilderوﻟﻜﻦ ﻧﺴﺨﺔ ﺗﺠﺮﯾﺒﯿﺔ ،واﻟﺬي ﯾﻤﻜﻦ ﺗﺤﻤﯿﻠﮫ ﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺘﺎﻟﻲ: .2
https://downloads.embarcadero.com/free/jbuilder
ﺑﺎﺳﺘﺨﺪام ﺑﯿﺌﺔ اﻟﺘﻄﻮﯾﺮ ) ،(JCreatorواﻟﺬي ﯾﻤﻜﻦ ﺗﺤﻤﯿﻠﮫ ﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺘﺎﻟﻲhttp://www.jcreator.com/ : .3
ﺑﺎﺳﺘﺨﺪام ﺑﯿﺌﺔ اﻟﺘﻄﻮﯾﺮ ) (NetBeansواﻟﺬي ﯾﻤﻜﻦ ﺗﺤﻤﯿﻠﮫ ﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺘﺎﻟﻲhttps://netbeans.org/downloads/ : .4
ﺑﺎﺳﺘﺨﺪام ﻣﻮﻗﻊ ﺷﺮﻛﺔ أوراﻛﻞ ) ،(Oracleﯾﻤﻜﻦ ﺗﺤﻤﯿﻞ ﻣﻌﺪات ﺗﻄﻮﯾﺮ ﺟﺎﻓﺎ ): (download JDK .5
http://www.oracle.com/technetwork/java/javase/downloads/index.htmlوﻣﻦ ﺛﻢ ﺑﻌﺪ ذﻟﻚ ﯾﻤﻜﻦ اﻟﻌﻤﻞ
ﻋﻠﻰ ﺑﯿﺌﺔ JDKﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ أو ﻣﻦ ﺧﻼل ﺑﺮﻧﺎﻣﺞ ) (Textpadﻟﻠﺘﺴﮭﯿﻞ أﺛﻨﺎء اﻟﺘﺼﻨﯿﻒ واﻟﺘﻨﻔﯿﺬ ﻣﻦ اﻟﻤﻮﻗﻊ:
http://www.textpad.com/download/
ﺳﯿﺘﻢ اﻋﺘﻤﺎد اﻟﻄﺮﯾﻘﺔ اﻷﺧﯿﺮة ﻟﺘﻨﻔﯿﺬ اﻟﺘﺠﺮﺑﺘﯿﻦ اﻷوﻟﻰ واﻟﺜﺎﻧﯿﺔ ﻣﻦ ھﺬا اﻟﺪﻟﯿﻞ اﻟﻌﻤﻠﻲ وذﻟﻚ ﻟﻐﺎﯾﺎت ﺗﺤﻘﯿﻖ اﻷھﺪاف اﻟﻤﺮﺟﻮة ﻣﻦ اﻟﻤﻘﺮر.
ﻣﻊ اﻟﻌﻠﻢ أﻧﮫ ﺑﺈﻣﻜﺎﻧﻚ اﺳﺘﺨﺪام أي واﺟﮭﺔ ﺗﻄﻮﯾﺮ أﺧﺮى ) (IDEﺗﻨﺎﺳﺒﻚ ،وذﻟﻚ ﺑﺎﻟﺘﻨﺴﯿﻖ ﻣﻊ ﻣﺸﺮﻓﻚ اﻷﻛﺎدﯾﻤﻲ .ﻓﻲ اﻟﺘﺠﺮﺑﺔ اﻷﺧﯿﺮة،
ﺳﯿﺘﻢ اﺳﺘﺨﺪام ﺑﯿﺌﺔ اﻟﺘﻄﻮﯾﺮ اﻟﻤﺘﻜﺎﻣﻠﺔ ،NetBeans IDEﺣﯿﺚ ﺳﺘﻘﻮم ،ﻋﺰﯾﺰي اﻟﺪارس ،ﺑﺮﺑﻂ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﻊ ﺧﺎدم ﺗﻘﻨﯿﺎت
اﻻﺗﺼﺎل ﻓﻲ ﺟﺎﻓﺎ.
ﺛﺎﻧﯿﺎ :اﻷھﺪاف
أن ﺗﺘﻌﺮف ﻋﻠﻰ آﻟﯿﺔ ﻋﻤﻞ إﺣﺪى ﺗﻘﻨﯿﺎت اﻻﺗﺼﺎل ﻓﻲ ﺟﺎﻓﺎ واﻟﺘﻲ ﺗﺴﻤﻰ "اﺳﺘﺪﻋﺎء اﻟﻄﺮق ﻋﻦ ﺑﻌﺪ" .RMI .1
أن ﺗﻌﺮف دور ﻛﻞ ﻣﻦ stubو skeletonو Registryﻓﻲ ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل .RMI .2
أن ﺗﺘﻌﺮف ﻛﯿﻔﯿﺔ ﺑﺮﻣﺠﺔ واﺳﺘﺨﺪام ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل ﻋﻦ ﺑﻌﺪ ﺑﺎﺳﺘﺨﺪام ﺑﺮوﺗﻮﻛﻮل ،RMIواﺳﺘﺤﻀﺎر اﻟﻄﺮق ﻋﻦ ﺑﻌﺪ. .3
أن ﺗﺤﺪد ﻣﺸﻜﻠﺔ ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل RMIاﻟﺮﺋﯿﺴﯿﺔ ،واﻟﺘﻲ ﺗﻌﺪ إﺣﺪى ﻣﺴﺎوئ .RMI .4
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 4
آﻟﯿﺔ إﻧﺸﺎء اﻻﺗﺼﺎل وﺗﺒﺎدل اﻟﺒﯿﺎﻧﺎت ﻣﻮﺿﺤﺔ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه .ﯾﺒﺪأ اﻟﺨﺎدم ﻛﺨﻄﻮة أوﻟﻰ ﺑﺘﺴﺠﯿﻞ ﻣﻨﮭﺎﺟﮫ )طﺮﯾﻘﺘﮫ ،(methodوھﻮ
اﻟﻤﻨﮭﺎج اﻟﺬي ﺳﯿﺘﻢ ﻣﻨﺎداﺗﮫ ﻣﻦ ﻗﺒﻞ اﻟﺰﺑﺎﺋﻦ ،ﻓﻲ داﺧﻞ ﺳ ِﱢﺠﻞ ،Registryﺧﺎص ﺑﻨﻈﺎم RMIواﻟﺬي ﻗﺪ ﯾﺘﻮاﺟﺪ ﻋﻠﻰ ﺟﮭﺎز آﺧﺮ طﺒﻌﺎ.
ﺑﻌﺪ ذﻟﻚ وﻋﻨﺪﻣﺎ ﯾﺮﯾﺪ اﻟﺰﺑﻮن ،clientوﻛﺨﻄﻮة ﺛﺎﻧﯿﺔ ،ﺑﺎﻟﺒﺤﺚ ﻋﻦ اﻟﻤﻨﮭﺎج ،ﯾﺒﺪأ ﺑﺎﻟﺒﺤﺚ ﻋﻨﮭﺎ ﻓﻲ اﻟﺴﺠﻞ ،Registryﻓﺘﻌﯿﺪ ﻟﮫ أرْ ِو َﻣﺔ
)ﻋﻘﺐ( اﻟﺨﺎدم ،server stubواﻟﺘﻲ ﺗﻜﻮن ﻣﻦ ﺟﮭﺔ اﻟﺰﺑﻮن .ﻓﻤﻦ ﺧﻼﻟﮭﺎ ﯾﻤﻜﻦ ﻟﻠﺰﺑﻮن وﻛﺨﻄﻮة راﺑﻌﺔ اﻻﺗﺼﺎل ﻣﻊ ﻣﻔﺘﺎح ھﯿﻜﻠﻲ
) (skeletonﺟﮭﺔ اﻟﺨﺎدم ﻟﺘﺒﺎدل اﻟﺒﯿﺎﻧﺎت.
https://camo.githubusercontent.com/fe96bc186fc00c31f975b687697565fc71343635/687474703a2f2f6c79636f672e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031312f30332f6a6176612d726d692d6f766572766965772e706e67
ﯾﺘﺒﯿﻦ ﻋﺰﯾﺰي اﻟﺪارس ،أﻧﻨﺎ ﺑﺤﺎﺟﺔ إﻟﻰ ﺛﻼﺛﺔ ﺑﺮاﻣﺞ ،ﺑﺮﻧﺎﻣﺞ اﻟﻮاﺟﮭﺔ ،remote interfaceوﯾﺠﺐ أن ﺗﺤﻤﻞ اﻻﺳﻢ اﻟﺬي ﺳﯿﺘﻢ ﻣﻨﺎداﺗﮫ.
وﺑﺮﻧﺎﻣﺞ ﺛﺎﻧﻲ ﺧﺎص ﺑﺎﻟﺨﺎدم .remote serverوﺑﺮﻧﺎﻣﺞ ﺛﺎﻟﺚ ﺑﺴﯿﻂ ﯾﻤﺜﻞ اﻟﺰﺑﻮن .clientﻧﺒﺪأ ﺑﺎﻟﮭﺪﻓﯿﻦ اﻷول واﻟﺜﺎﻧﻲ واﻟﻠﺬﯾﻦ ﯾﻤﻜﻦ
ﺗﺤﻘﯿﻘﮭﻤﺎ ﻣﻦ ﺧﻼل اﻟﺒﺮاﻣﺞ اﻟﺘﺎﻟﯿﺔ .أﻛﺘﺐ ﻛﻞ ﺑﺮﻧﺎﻣﺞ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﺘﺎﻟﯿﺔ ﻓﻲ ﻣﻠﻒ ﻣﻨﻔﺼﻞ إﻣﺎ ﺑﺎﺳﻢ اﻟﺼﻨﻒ أو ﺑﺎﺳﻢ اﻟﻮاﺟﮭﺔ.
ﯾﺠﺐ اﺳﺘﺤﻀﺎر ﻣﻜﺘﺒﺔ RMIﻛﻤﺎ ﯾﻠﻲ ;* import java.rmi.أو ﺗﻔﺼﯿﻞ اﻷﺟﺰاء اﻟﺘﻲ ﻧﺮﯾﺪھﺎ ﻣﻦ ﺗﻠﻚ اﻟﻤﻜﺘﺒﺔ ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﻓﻲ
اﻟﺒﺮﻧﺎﻣﺞ أدﻧﺎه .ﺣﯿﺚ ﻧﻌﺮف واﺟﮭﺔ ،Helloواﻟﺘﻲ ﺗﻌﺮف ﺑﺪورھﺎ اﻟﻤﻨﮭﺞ اﻟﺬي ﺳﯿﺘﻢ اﺳﺘﺤﻀﺎره ﻋﻦ ﺑﻌﺪ.
;import java.rmi.Remote
;import java.rmi.RemoteException
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 5
وﻋﻠﯿﮫ ﯾﺠﺐ ﺗﻌﺮﯾﻒ اﻟﻤﻨﮭﺞ )اﻟﻄﺮﯾﻘﺔ( اﻟﺘﻲ ﺳﯿﻘﻮم اﻟﺰﺑﻮن ﺑﻤﻨﺎداﺗﮭﺎ ﻟﻠﺘﻨﻔﯿﺬ وھﻲ،Hello ﯾﻘﻮم اﻟﺨﺎدم ﺑﺘﻨﻔﯿﺬ اﻟﻮاﺟﮭﺔ •
.sayHello()
.obj ﯾﺠﺐ ﻋﻤﻞ ﻣﺜﯿﻞ ﻣﻦ اﻟﺨﺎدم وﻟﯿﻜﻦ ﺑﺈﺳﻢ •
ﻟﺬﻟﻚ. وﻟﻜﻦ ﯾﻤﻜﻦ اﻹﺷﺎرة إﻟﻰ ھﺪف ﯾﻨﻔﺬ اﻟﻮاﺟﮭﺔ ﺑﺎﻟﺘﺤﻮﯾﻞ إﻟﻰ ﻧﻮع اﻟﻮاﺟﮭﺔ،ﻻ ﯾﻤﻜﻦ ﻋﻤﻞ ﻣﺜﯿﻞ ﻣﻦ واﺟﮭﺔ ﻓﻲ ﻟﻐﺔ ﺟﺎﻓﺎ •
إﻟﻰ ﻧﻔﺲ ﻧﻮعexportObject ﺑﺤﯿﺚ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﺤﻮﯾﻞ ﻧﻮع ﻧﺎﺗﺞ ﺗﻨﻔﯿﺬ اﻟﻤﻨﮭﺞ،stub وﻟﯿﻜﻦ ﺑﺈﺳﻢHello أﻧﺸﺊ ﻋﻘِﺐ ﻣﻦ
.اﻟﻮاﺟﮭﺔ
. اﻟﻤﺮاد ﻣﻨﺎداﺗﮭﺎ ﻟﻠﺘﻨﻔﯿﺬmethod ﻣﻦ أﺟﻞ ﺗﺴﺠﯿﻞ وﺣﻔﻆ ﻣﻜﺎن اﻟﻄﺮﯾﻘﺔRegistry أﻧﺸﺊ ﻣﺜﯿﻞ ﻣﻦ اﻟﺴﺠﻞ •
ﺑﺎﻟﺘﺎﻟﻲ أﺻﺒﺤﺖ أﺳﻢ اﻟﻮاﺟﮭﺔ وﻣﺎ ﺗﺤﻮﯾﮫ ﻣﻦ طﺮق )ﻣﻨﺎھﺞ( ﻣﺴﺠﻼ ﻓﻲ.stub ﻣﻊ أﺳﻢ اﻟﻌﻘﺐHello اﻵن أرﺑﻂ أﺳﻢ اﻟﻮاﺟﮭﺔ •
.اﻟﺴﺠﻞ
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client
{
private Client() {}
public static void main(String[] args)
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 6
{
;"String host = "192.168.1.100
try
{
;)Registry registry = LocateRegistry.getRegistry(host
;)"Hello stub = (Hello) registry.lookup("Hello
;)(String response = stub.sayHello
;)System.out.println("response: " + response
}
)catch (Exception e
{
;))(System.err.println("Client exception: " + e.toString
;)(e.printStackTrace
}
}
}
ﻟﺘﻨﻔﯿﺬ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ،اﺗﺒﻊ اﻟﺨﻄﻮات اﻟﺘﺎﻟﯿﺔ:
• ﺿﻊ ﺟﻤﯿﻊ اﻟﻤﻠﻔﺎت اﻟﺴﺎﺑﻘﺔ ) ،(Hello.java, Cient.java, Server.javaﻓﻲ ﻣﺠﻠﺪ ،binﻓﻲ ﺑﯿﺌﺔ ﺟﺎﻓﺎ اﻟﺘﻄﻮﯾﺮﯾﺔ .JDK
• اﻓﺘﺢ ﻧﺎﻓﺬة ،DOSﺛﻢ اﻧﺘﻘﻞ إﻟﻰ اﻟﻤﺠﻠﺪ اﻟﺬي ﯾﺤﻮي اﻟﻤﻠﻔﺎت اﻟﺜﻼث ﻓﻲ ال .bin
• ﺻﻨﻒ ،compileاﻟﺒﺮاﻣﺞ اﻟﺜﻼﺛﺔ ﻣﻌﺎ ﻣﺴﺘﺨﺪﻣﺎ اﻷﻣﺮjavac Hello.java Client.java Server.java :
• اﻓﺘﺢ ﺷﺎﺷﺔ اﻟﺪوس ،cmdﺛﻢ اﺑﺪأ اﻟ ِﺴ ِﺠﻞ ﻣﺴﺘﺨﺪﻣﺎ اﻷﻣﺮ .start rmiregistry
• ﻣﻦ ﻧﻔﺲ ﻧﺎﻓﺬة DOSاﻟﺴﺎﺑﻘﺔ اﻟﺘﻲ ﺑﺪأت ﺑﮭﺎ اﻟﺴﺠﻞ ،ﺷ ّﻐﻞ )اﺑﺪأ( ﺑﺮﻧﺎﻣﺞ اﻟﺨﺎدم :serverﻣﺴﺘﺨﺪﻣﺎ اﻷﻣﺮ اﻟﺘﺎﻟﻲ:
“start java -Djava.rmi.server.codebase=file:C:/Java/jdk1.8.0_40/bin/ Server”.
ﻻﺣﻆ أن ھﻨﺎك ﻧﺎﻓﺬﺗﯿﻦ ﯾﺘﻢ ﻓﺘﺤﮭﻤﺎ ﻋﻨﺪ ﺗﻨﻔﯿﺬ أﻣﺮ ﺗﺸﻐﯿﻞ ﻛﻞ ﻣﻦ اﻟﺴﺠﻞ ،registryوﻛﺬﻟﻚ اﻟﺨﺎدم .server
اﻵن وﻣﻦ ﻧﺎﻓﺬة DOSﻣﺴﺘﻘﻠﺔ ﻣﻦ ﻋﻠﻰ ﻧﻔﺲ اﻟﺠﮭﺎز أو ﺟﮭﺎز زﻣﯿﻠﻚ ،ﺷﻐﻞ ﺑﺮﻧﺎﻣﺞ اﻟﺰﺑﻮن ،clientﻣﺴﺘﺨﺪﻣﺎ اﻷﻣﺮ .java Client
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 7
ﻣﻼﺣﻈﺔ :ﻗﺪ ﻻ ﯾﻌﻤﻞ اﻟﺨﺎدم ﻋﻠﻰ ﺟﮭﺎز ﻣﻨﻔﺼﻞ ﺑﺴﺒﺐ ﻣﺸﺎﻛﻞ ﻓﻲ ،securityﻓﺤﺎول ﺣﻠﮭﺎ ﻣﻊ ﻣﺪﯾﺮ اﻟﺸﺒﻜﺔ إن ﺣﺼﻠﺖ ﺗﻠﻚ اﻟﻤﺸﻜﻠﺔ.
ﺗﺪرﯾﺐ :1اﺷﺮح آﻟﯿﺔ ﻋﻤﻞ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﺑﻌﺪ اﻻطﻼع ﻋﻠﻰ اﻟﺮاﺑﻂ اﻟﺘﺎﻟﻲ ﻣﻦ ﻣﻮﻗﻊ أوراﻛﻞ:
https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/hello/hello-world.html
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 8
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺜﺎﻧﻲ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 9
ﻣﻘﺪﻣﺔ
ﻋﺰﯾﺰي اﻟﺪارس ،ﺗﻌﺘﺒﺮ ﻟﻐﺔ ﺗﻌﺮﯾﻒ اﻟﻮاﺟﮭ�ﺎت ) Interface Definition Language (IDLﻣ�ﻦ ﺗﻘﻨﯿ�ﺎت اﻷھ�ﺪاف اﻟﻤﻮزﻋ�ﺔ ،ﺣﯿ�ﺚ
ﺗﺘﻮاﺻﻞ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻷھﺪاف ،ﻣﺘﻮاﺟﺪة ﻋﻠﻰ ﻧﻈﻢ ﺗﺸﻐﯿﻞ ﻣﺨﺘﻠﻔﺔ ،ﻣﻦ ﺧﻼل ﺷﺒﻜﺔ .ھﺬه اﻟﻠﻐﺔ ﺗﺴﮭﻞ ﻣﻦ اﻟﺘﻮاﺻﻞ ﺑ�ﯿﻦ اﻷھ�ﺪاف ﺑﻐ�ﺾ
اﻟﻨﻈﺮ ﻋﻦ اﻟﻠﻐﺎت اﻟﻤﺴ�ﺘﺨﺪﻣﺔ ﺳ�ﻮاء ﻛﺎﻧ�ﺖ Javaأو C++أو COBOLأو ﻏﯿﺮھ�ﺎ ﻣ�ﻦ اﻟﻠﻐ�ﺎت .طﺒﻌ�ﺎ ھ�ﺬا ﻣﻤﻜ�ﻦ ﻷن IDLﻻ ﺗﻌﺘﻤ�ﺪ
ﻋﻠﻰ ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﺑﻌﯿﻨﮭﺎ ،وإﻧﻤﺎ ﺗﺘﺒﻨﻰ ﻣﺒﺪأ ﻋﻤﻞ ﻣﻌﻤﺎرﯾ�ﺔ وﺳ�ﯿﻂ طﻠ�ﺐ اﻷھ�ﺪاف اﻟﻤﺸ�ﺘﺮﻛﺔ Common Object Request Broker
) .Architecture (CORBAﺗ���ﻢ ﺗﻄ���ﻮﯾﺮ ھ���ﺬه اﻟﻤﻌﻤﺎرﯾ���ﺔ ﻣ���ﻦ ﻗﺒ���ﻞ ﺗﺠﻤ���ﻊ ﺿ���ﺨﻢ ﻣ���ﻦ اﻟﺸ���ﺮﻛﺎت اﻟﺼ���ﺎﻧﻌﺔ ﯾﺴ���ﻤﻰ Object
) Management Group (OMGﻣﻦ أﺟﻞ اﻟﺘﻮاﺻﻞ ﺑﯿﻦ اﻷھ�ﺪاف اﻟﻤﻮزﻋ�ﺔ )اﻟ�ﻨﻈﻢ اﻟﻤﻮزﻋ�ﺔ( .ﻓﻜ�ﻞ ﻟﻐ�ﺔ ﻣ�ﻦ ﻟﻐ�ﺎت اﻟﺒﺮﻣﺠ�ﺔ اﻟﺘ�ﻲ
ﺗﺪﻋﻢ CORBAﻟﺪﯾﮭﺎ طﺮﯾﻘﺘﮭﺎ ﻓﻲ اﻟﻨﻘﻞ mappingﻣﻦ IDLإﻟﻰ ﺗﻠﻚ اﻟﻠﻐﺔ .ﻓﻤ�ﺜﻼ Java IDLﺗ�ﺪﻋﻢ اﻟﻨﻘ�ﻞ إﻟ�ﻰ ﻟﻐ�ﺔ ﺟﺎﻓ�ﺎ .ﻟﻠﺘﻮاﺻ�ﻞ
ﺑﯿﻦ أھﺪاف ﻣﺘﻮاﺟﺪة ﻋﻠﻰ ﻣﻨﺼﺎت ﻣﺨﺘﻠﻔ�ﺔ )اﺧ�ﺘﻼف ﻧﻈ�ﻢ اﻟﺘﺸ�ﻐﯿﻞ وﻟﻐ�ﺎت ﺑﺮﻣﺠ�ﺔ( ،ﺗ�ﻮﻓﺮ ﻣﻌﻤﺎرﯾ�ﺔ CORBAوﺳ�ﯿﻂ ﯾﺴ�ﻤﻰ ،ORB
وھﻮ ﻓﻲ ﻟﻐﺔ ﺟﺎﻓﺎ ﻋﺒﺎرة ﻋﻦ ﻣﻜﺘﺒﺔ أﺻﻨﺎف ،class libraryﺗﻤﻜﻦ اﻟﺘﻮاﺻﻞ ﺑﯿﻦ ﺗﻄﺒﯿﻘﺎت Java IDLوﺗﻄﺒﯿﻘﺎت .CORBA
ھﺬه اﻟﺘﺠﺮﺑﺔ ﺗﻌﻠﻤﻚ ،ﻋﺰﯾﺰي اﻟﺪارس ،اﻟﻘﻮاﻋﺪ اﻷﺳﺎﺳﯿﺔ ﻟﺒﻨﺎء ﺗﻄﺒﯿﻘﺎت ﻣﻮزﻋﺔ ﻗﺎﺋﻤﺔ ﻋﻠﻰ ﻣﻌﻤﺎرﯾﺔ CORBAﺑﺎﺳﺘﺨﺪام .Java IDL
ﺣﯿﺚ ﺳﺘﻌﻤﻞ ﻋﻠﻰ ﺑﻨﺎء ﻣﺜﺎل Hello Worldﻛﻨﻈﺎم ﻣﻮزع ،واﻟﺬي ﻟﮫ ﻋﻤﻠﯿﺔ واﺣﺪة ﻓﻘﻂ وھﻲ إﻋﺎدة ﺳﻠﺴﻠﺔ stringﻟﻠﻄﺒﺎﻋﺔ.
اﻟﻌﻼﻗﺔ اﻟﺘﻲ ﺗﺮﺑﻂ أي ﻧﻈﺎم ﻣﻮزع )أو أھﺪاف ﻣﻮزﻋﺔ( ﻟﮭﺎ ﺟﺎﻧﺒ�ﺎن وھﻤ�ﺎ اﻟﺰﺑ�ﻮن clientواﻟﺨ�ﺎدم .serverﯾ�ﻮﻓﺮ اﻟﺨ�ﺎدم واﺟﮭ�ﺔ ﺑﻌﯿ�ﺪة
،remote interfaceوﻋﻠﯿﮫ ﻓﺈن اﻟﺰﺑﻮن ﯾﺴﺘﺪﻋﻲ واﺟﮭﺔ ﺑﻌﯿﺪة .ھﺬه اﻟﻌﻼﻗﺔ ﻣﺸﺘﺮﻛﺔ ﻣﻊ ﺟﻤﯿﻊ اﻟﻤﻌﺎﯾﯿﺮ اﻟﺘﻲ ﺗﺘﺒﻨﻰ اﻷھ�ﺪاف اﻟﻤﻮزﻋ�ﺔ
ﻣﺜ��ﻞ CORBAو RMIو .RMI-IIOPﻻﺣ��ﻆ أن اﻟﻜﻠﻤ��ﺎت ﺧ��ﺎدم وزﺑ��ﻮن ،ﺗﻌﺮﻓ��ﺎن ھﻨ��ﺎ ﺗﻮاﺻ��ﻞ ﺑ��ﯿﻦ أھ��ﺪاف object-level
interactionوﻟﯿﺲ ﺗﻮاﺻﻞ ﺑﯿﻦ ﺗﻄﺒﯿﻘﺎت ،application-level interactionﺑﺤﯿﺚ ﯾﺼﺒﺢ أي ﺗﻄﺒﯿﻖ ﻟﮭﺬا اﻟﮭﺪف ﻋﺒﺎرة ﻋﻦ ﺧ�ﺎدم
وﻟﺬاك اﻟﮭﺪف ﻋﺒﺎرة ﻋﻦ زﺑﻮن .أي أن اﻟﺘﻄﺒﯿﻖ ﻧﻔﺴﮫ ﯾﻤﻜﻦ أن ﯾﺤﻮي زﺑﻮن وﺧﺎدم ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ .ﻓﻲ اﻟﺤﻘﯿﻘ�ﺔ ،ھ�ﺪف واﺣ�ﺪ ﻣﻤﻜ�ﻦ أن
ﯾﻜﻮن زﺑﻮن ﻟﻮاﺟﮭﺔ ﺗﺎﺑﻌﺔ ﻟﮭﺪف ﺑﻌﯿﺪ ،وﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ ،ﯾﻨﻔﺬ واﺟﮭﺔ ﺳﯿﺘﻢ اﺳﺘﺪﻋﺎﺋﮭﺎ ﻋﻦ ﺑﻌﺪ ﻣﻦ ط�ﺮف أھ�ﺪاف أﺧ�ﺮى .اﻟﺼ�ﻮرة أدﻧ�ﺎه
ﺗﻮﺿ�ﺢ ﻛﯿ�ﻒ أن ھ�ﺪف ﻣ��ﻮزع ﺑﻄﺮﯾﻘ�ﺔ واﺣ�ﺪة one-method distributed objectﻣﺸ�ﺘﺮك ﺑ��ﯿﻦ ﺧ�ﺎدم وزﺑ�ﻮن CORBAﻟﺘﻨﻔﯿ��ﺬ
ﺻﻨﻒ اﻟﺘﻄﺒﯿﻖ .Hello World
https://docs.oracle.com/javase/8/docs/technotes/guides/idl/GShome.html
ﻓﻲ ﺟﮭﺔ اﻟﺰﺑﻮن ،ﯾﺤﺘﻮي اﻟﺘﻄﺒﯿﻖ ﻋﻠﻰ ﻣﺮﺟﻊ ﻟﻠﮭﺪف اﻟﺒﻌﯿﺪ .اﻟﻤﺮﺟﻊ اﻟﮭﺪف ﻟﮫ طﺮﯾﻘﺔ ﻋﻘﺐ ،stubواﻟﺘﻲ ﻣﺆﻗﺘﺎ ﺗﺤﻞّ ﻣﻜﺎن )ﺗﺴﺘﺒﺪل(
اﻟﻄﺮﯾﻘﺔ اﻟﺘﻲ ﺳﯿﺘﻢ اﺳﺘﺪﻋﺎﺋﮭﺎ ﻋﻦ ﺑﻌﺪ .اﻟﻌﻘﺐ stubھﻮ ﻓﻲ اﻟﺤﻘﯿﻘﺔ ﻣﺒَﺮ َﻣﺞ ﻓﻲ داﺧﻞ ،ORBوﺑﺎﻟﺘﺎﻟﻲ اﺳﺘﺪﻋﺎؤه ﯾﺴﺘﺤﻀﺮ أﯾﻀﺎ
ﺗﺤﻮل اﻻﺳﺘﺤﻀﺎر إﻟﻰ اﻟﺨﺎدم.
إﻣﻜﺎﻧﯿﺎت اﺗﺼﺎل ،ORBواﻟﺘﻲ ﺑﺪورھﺎ ﱢ
ﻓﻲ ﺟﮭﺔ اﻟﺨﺎدم ،ﻓﺈن ORBﯾﺴﺘﺨﺪم ﻛﻮد اﻟﻤﻔﺘﺎح اﻟﮭﯿﻜﻠﻲ ،skeletonﻟﺘﺮﺟﻤﺔ اﻻﺳﺘﺪﻋﺎء ﻋﻦ ﺑﻌﺪ إﻟﻰ اﺳﺘﺪﻋﺎء طﺮﯾﻘﺔ methodﻋﻠﻰ
اﻟﮭﺪف اﻟﻤﺤﻠﻲ .ﯾﻌﻤﻞ اﻟﻤﻔﺘﺎح اﻟﮭﯿﻜﻠﻲ skeletonﻋﻠﻰ ﺗﺮﺟﻤﺔ اﻻﺳﺘﺪﻋﺎء ،callوأﯾﺔ ﻗﯿﻢ parametersإﻟﻰ اﻟﻨﺴﻖ اﻟﻤﻨﺎﺳﺐ ﻟﻠﺘﻨﻔﯿﺬ
وﯾﺴﺘﺪﻋﻲ اﻟﻄﺮﯾﻘﺔ اﻟﺘﻲ ﺗﻢ اﺳﺘﺤﻀﺎرھﺎ .ﻋﻨﺪﻣﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻄﺮﯾﻘﺔ ،methodوﺗﻌﯿﺪ ﻗﯿﻤﺔ ،ﻓﺈن ﻛﻮد اﻟﻤﻔﺘﺎح اﻟﮭﯿﻜﻠﻲ skeletonﯾﺤ ّﻮل
ﻧﺘﺎﺋﺞ أو أﺧﻄﺎء ،وﯾﻌﯿﺪ إرﺳﺎﻟﮭﺎ إﻟﻰ اﻟﺰﺑﻮن ﻋﻦ طﺮﯾﻖ .ORBﻣﺎ ﺑﯿﻦ ORBsﻓﺈن اﻻﺗﺼﺎل ﯾﺘﻢ ﻋﻦ طﺮﯾﻖ ﺑﺮوﺗﻮﻛﻮل IIOPوھﻮ
اﺧﺘﺼﺎر .Internet Inter ORB Protocolﺑﺮوﺗﻮﻛﻮل ،IIOPواﻟﺬي ﯾﻌﺘﻤﺪ ﻋﻠﻰ ﺑﺮوﺗﻮﻛﻮﻻت ،TCP/IPﯾﻌﺮف ﺑﺪوره ﻛﯿﻔﯿﺔ
ﻗﯿﺎم ORBsﺑﺘﻤﺮﯾﺮ ﻣﻌﻠﻮﻣﺎت ﻓﯿﻤﺎ ﺑﯿﻨﮭﺎ .ﻛﻤﺎ ھﻮ اﻟﺤﺎل ﻓﻲ ﻛﻞ ﻣﻦ CORBAو ،IDLﻓﺈن IIOPھﻮ ﻣﻌﯿﺎر اﺗﺼﺎل ﻣﻌﺮف ﻣﻦ
ﻗﺒﻞ ﺗﺠﻤﻊ .OMG
اﻷھﺪاف
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 10
أن ﺗﺘﻌﺮف ﻋﻠﻰ ﻟﻐﺔ ﺗﻌﺮﯾﻒ اﻟﻮاﺟﮭﺎت .IDL .1
أن ﺗﺘﻌﺮف ﻋﻠﻰ ﻣﻌﻤﺎرﯾﺔ وﺳﯿﻂ طﻠﺐ اﻷھﺪاف اﻟﻤﺸﺘﺮﻛﺔ ،CORBAوﺑﯿﺌﺘﮭﺎ. .2
أن ﺗﺒﻨﻲ ﻣﺜﺎﻻ ﯾﻮﺿﺢ طﺮﯾﻘﺔ اﻻﺗﺼﺎل ﺑﯿﻦ اﻷھﺪاف ﻣﺴﺘﺨﺪﻣﺎ ﺑﺮاﻣﺞ ﺟﺎﻓﺎ وﺗﻘﻨﯿﺔ .CORBA .3
أن ﺗﺬﻛﺮ اﻟﻔﺮق ﺑﯿﻦ ﺗﻘﻨﯿﺘ ّﻲ اﻻﺗﺼﺎل RMIو .CORBA .4
اﻟﺨﻄﻮة اﻷوﻟﻰ ﻋﻠﻰ طﺮﯾﻖ إﻧﺸﺎء ﺗﻄﺒﯿﻖ CORBAھﻮ أن ﺗﺤﺪد ﺟﻤﯿﻊ اﻷھﺪاف و واﺟﮭﺎﺗﮭﺎ ﺑﺎﺳﺘﺨﺪام ﻟﻐﺔ ،IDLواﻟﺘﻲ ﻟﮭﺎ ﺗﺮﻛﯿﺐ
ﻣﺸﺎﺑﮫ ﻟﻠﻐﺔ ،C++واﻟﺘﻲ ﯾﻤﻜﻨﮭﺎ ﺗﻌﺮﯾﻒ وﺣﺪات ،modulesواﺟﮭﺎت ،interfacesﺗﺮاﻛﯿﺐ ﺑﯿﺎﻧﺎت ،data structuresوأﻛﺜﺮ.
اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻣﻜﺘﻮب ﺑﻠﻐﺔ ،IDLوﯾﺼﻒ ھﺪف ﻣﻦ ﻧﻮع ،CORBAواﻟﺬي طﺮﯾﻘﺘﮫ )( sayHelloﺗﻌﯿﺪ ﺳﻠﺴﻠﺔ ﻋﻨﺪ ﻣﻨﺎداﺗﮭﺎ وطﺮﯾﻘﺘﮫ
)( shutdownﺗﻐﻠﻖ اﻟﻮﺳﯿﻂ .ORB
module HelloApp
{
interface Hello
{
;)(string sayHello
;)(oneway void shutdown
;}
;}
اﻟﻤﻠﻒ اﻟﺜﺎﻧﻲ HelloServer.java
ﯾﺘﻜﻮّ ن ﻣﻠﻒ اﻟﺨﺎدم ﻣﻦ ﺻﻨﻔﯿﻦ ،two classesاﻟﻤﺴﺘﺨﺪَم servantواﻟﺨﺎدم .serverاﻟﻤﺴﺘﺨﺪَم HelloImplھﻮ ﺗﻨﻔﯿﺬ ﻟﻤﻠﻒ IDL
اﻟﻤﺴﻤﻰ Helloاﻟﺬي ﯾﻌﺮف واﺟﮭﺔ interfaceﻓﻲ داﺧﻞ وﺣﺪة .moduleﻛﻞ ﻣﺜﯿﻞ Helloﯾﻨﻔﱠﺬ ﺑﻮﺳﺎطﺔ ﻣﺜﯿﻞ .HelloImpl
اﻟﻤﺴﺘﺨﺪَم ھﻢ ﻣﺜﯿﻞ ﺻﻨﻒ ﻣﺸﺘﻖ ﻣﻦ ،HelloPOAواﻟﺬي ﺗﻢ ﺗﻮﻟﯿﺪه ﺑﺸﻜﻞ أوﺗﻮﻣﺎﺗﯿﻜﻲ ﻋﻨﺪ ﺗﺼﻨﯿﻒ ﻣﻠﻒ IDLﺑﻮﺳﺎطﺔ اﻷﻣﺮ .idlj
اﻟﻤﺴﺘﺨﺪَم ﯾﺤﺘﻮي ﻋﻠﻰ طﺮﯾﻘﺔ واﺣﺪة ﻟﻜﻞ ﻋﻤﻠﯿﺔ ،IDLوﻓﻲ ھﺬا اﻟﻤﺜﺎل ھﻤﺎ اﻟﻄﺮﯾﻘﺘﺎن )( sayHelloو )( .shutdownﻓﻲ اﻟﺤﻘﯿﻘﺔ،
ﻓﺈن طﺮق اﻟﻤﺴﺘﺨﺪَم ھﻲ ﻧﻔﺲ طﺮق ﺟﺎﻓﺎ اﻻﻋﺘﯿﺎدﯾﺔ .اﻟﻜﻮد اﻵﺧﺮ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ،ORBﻟﻘﯿﺎدة وﺗﺮﺗﯿﺐ marshallingاﻟﻤﺘﻐﯿﺮات
واﻟﻨﺘﺎﺋﺞ ،ﯾﺘﻢ ﺗﺰوﯾﺪھﺎ ﺑﻮﺳﺎطﺔ اﻟﻤﻔﺘﺎح اﻟﮭﯿﻜﻠﻲ .skeleton
ﻣﻼﺣﻈﺔ :إن ﻣﻜﯿّﻒ اﻟﮭﺪف ،object adapterﻋﺒﺎرة ﻋﻦ وﺳﯿﻠﺔ ﻟﺮﺑﻂ طﻠﺐ ،requestﺑﺎﺳﺘﺨﺪام ﻣﺮﺟﻊ اﻟﮭﺪف ﺑﻜﻮد ﻣﻌﯿﻦ ،ﻣﻊ ﺧﺪﻣﺔ
اﻟﻄﻠﺐ .ﻣﻜﯿّﻒ اﻟﮭﺪف اﻟﻤﺤﻤﻮل ) POAﻗﺎﺑﻠﺔ ﻟﻠﻌﻤﻞ( ،ھﻮ ﻧﻮع ﻣﻦ أﻧﻮاع ،object adapterواﻟﺬي:
• ﯾﺴﻤﺢ ﻟﻠﻤﺒﺮﻣﺠﯿﻦ ﺑﺈﻧﺸﺎء أھﺪاف ﺗﻨﻔﯿﺬﯾﺔ ﻗﺎﺑﻠﺔ ﻟﻠﻌﻤﻞ ﺑﯿﻦ ﻣﻨﺘﺠﺎت ORBﻣﺨﺘﻠﻔﺔ.
• ﯾﻮﻓﺮ اﻟﺪﻋﻢ ﻷھﺪاف ﺑﻤﻌ ّﺮف ﻣﺴﺘﻤﺮ ،persistentﻛﻤﺎ ھﻮ اﻟﺤﺎل ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ واﻟﺬي ﯾﻤﺜﻞ .persistent example
• ﯾﻮﻓﺮ اﻟﺪﻋﻢ ﻟﺘﻔﻌﯿﻞ ﺷﻔﺎف transparent activationﻟﻸھﺪاف.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 11
.اﻟﺴﻤﺎح ﻟﻤﺴﺘﺨ ّﺪم ﻣﻌﯿﻦ ﺑﺪﻋﻢ اﻟﻌﺪﯾﺪ ﻣﻦ ﻣﻌﺮﻓﺎت اﻷھﺪاف ﺑﺸﻜﻞ ﻣﺘﺰاﻣﻦ •
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;
import java.util.Properties;
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 12
:ﯾﺘﻢ ﻓﻲ ﺗﻄﺒﯿﻖ اﻟﺰﺑﻮن ﻣﺎ ﯾﻠﻲ
.initializations ﺑﻘﯿﻢ ﻣﺒﺪﺋﯿﺔORB • إﻧﺸﺎء
.root naming context • اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﺮﺟﻊ إﻟﻰ ﺟﺬر ﺳﯿﺎق اﻟﺘﺴﻤﯿﺔ
.CORBA واﺳﺘﻘﺒﺎل ﻣﺮﺟﻊ إﻟﻰ ذﻟﻚ اﻟﮭﺪف ﻣﻦ،naming context ﻓﻲ ﺳﯿﺎق اﻟﺘﺴﻤﯿﺔHello • اﻟﺒﺤﺚ ﻋﻦ
. وطﺒﺎﻋﺔ اﻟﻨﺘﯿﺠﺔshutdown() وsayHello() • اﺳﺘﺤﻀﺎر طﺮق ھﺪف وھﻲ
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
}
: ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه.DOS ﺛﻢ اﻓﺘﺢ ﻧﺎﻓﺬة،bin ﺿﻊ ﺟﻤﯿﻊ ﻣﻠﻔﺎﺗﻚ ﻓﻲ ﻣﺠﻠﺪ،ﻟﺘﻨﻔﯿﺬ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ
idlj -fall Hello.idl : ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ،Hello.idl ﻣﻠﻒcompile • ﺻﻨﻒ
javac HelloServer.java ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ،HelloServer.java ﻣﻠﻒcompile • ﺻﻨﻒ
javac HelloClient.java ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ،HelloClient.java ﻣﻠﻒcompile • ﺻﻨﻒ
start orbd –ORBInitialPort 1050 : ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ1050 رﻗﻢport ﻋﻠﻰ ﻣﻨﻔﺬORB • ﺷﻐﻞ وﺳﯿﻂ
:• اﻵن ﺷﻐﻞ اﻟﺨﺎدم ﻋﻠﻰ ﻧﻔﺲ اﻟﻤﻨﻔﺬ ﻣﻦ ﻋﻠﻰ ﻣﻨﺼﺔ اﻟﺠﮭﺎز اﻟﻤﺤﻠّﻲ ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ اﻟﺘﺎﻟﻲ
start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost
: أن ﺗﺸﻐﻞ اﻟﺰﺑﻮن ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ اﻟﺘﺎﻟﻲ، ﻋﺰﯾﺰي اﻟﺪارس،• ﯾﻤﻜﻨﻚ اﻵن
java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 13
ﻋﻨﺪ ﺗﻨﻔﯿﺬ اﻟﻤﺜﺎل ،ﯾﺘﻢ إﻋﻄﺎء رﻗﻢ ﻋﻠﻰ ﺷﻜﻞ ﺳﻠﺴﻠﺔ ﻣﻦ اﻟﻘﯿﻢ ﺑﺎﻟﻨﻈﺎم اﻟﺴﺪاﺳﻲ ﻋﺸﺮي Hexadecimalﯾﺴﻤﻰ Interoperable
) ،Object Reference (IORوھﺬا ﻋﺒﺎرة ﻋﻦ ﻣﺤﺪد ﻣﻜﺎن ﻟﻤﺮﺟﻊ اﻟﮭﺪف .ﯾﺤﻮي ﻓﻲ داﺧﻠﮫ ﻣﺜﻼ ﻋﻨﻮان ،IPورﻗﻢ ﻣﻨﻔﺬ ،port
وﻣﺮﺟﻊ ھﺪف ﻟﻠﺨﺎدم ،servantاﻟﺦ.
ﺗﺪرﯾﺐ :ﺑﻤﺴﺎﻋﺪة ﻣﺸﺮﻓﻚ اﻷﻛﺎدﯾﻤﻲ ،اﺷﺮح آﻟﯿﺔ ﻋﻤﻞ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﺑﻌﺪ اﻻطﻼع ﻋﻠﻰ اﻟﺮاﺑﻂ اﻟﺘﺎﻟﻲ ﻣﻦ ﻣﻮﻗﻊ أوراﻛﻞ:
https://docs.oracle.com/javase/8/docs/technotes/guides/idl/jidlExample.html
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 14
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺜﺎﻟﺚ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 15
أوﻻ :اﻷھﺪاف
.1اﻟﺘﻌﺮف ﻋﻠﻰ ﺑﯿﺌﺔ ﻋﻤﻞ اﻟﺘﻄﺒﯿﻖ .XAMPP
.2اﻟﺘﻌﺮف ﻋﻠﻰ ﻣﺠﺎل ﻋﻤﻞ ﺧﺎدم اﻟﻮﯾﺐ .Apache
.3اﻟﺘﻌﺮف ﻋﻠﻰ ﺑﯿﺌﺔ ﻋﻤﻞ ﻟﻐﺔ اﻟﻮﯾﺐ .PHP
.4ﺗﻘﺪﯾﻢ ﻧﺒﺬة ﻋﻦ ﺑﺮاﻣﺞ ﻟﻐﺔ ،PHPوﺧﺼﻮﺻﺎ اﻟﻤﺘﻐﯿﺮات واﻟﺪوال.
.5ﻛﺘﺎﺑﺔ ﺑﺮاﻣﺞ ﺑﺴﯿﻄﺔ ﺑﻠﻐﺔ PHPوﺗﻨﻔﯿﺬھﺎ ﻣﻦ ﺧﻼل ﺧﺎدم Apacheﻋﻠﻰ ﺟﮭﺎز اﻟﺤﺎﺳﻮب اﻟﻤﺤﻠﻲ.
ﺛﺎﻧﯿﺎ :ﻣﻘﺪﻣﺔ
إن ﻟﻐﺔ ﺑﺮﻣﺠﺔ اﻟﻮﯾﺐ ﺑﻲ إش ﺑﻲ PHPﻟﻐﺔ ﻣﻔﺘﻮﺣﺔ اﻟﻤﺼﺪر ) open sourceﯾﻤﻜﻦ ﺗﺤﻤﯿﻠﮭﺎ ﻣﺠﺎﻧﺎ ﻣﻦ اﻟﻤﻮﻗﻊ ،(www.php.net
واﻻﺧﺘﺼﺎر ھﻮ ﻟﻠﻤﺼﻄﻠﺢ ” .“Hypertext Preprocessorھﻲ ﻣﻦ ﻟﻐﺎت اﻟﺘﻌﻠﯿﻤﺎت scripting languageأي أﻧﮭﺎ ﻻ ﺗﺤﺘﺎج إﻟﻰ
ﺗﺼﻨﯿﻒ compileﻣﺜﻞ ﻟﻐﺎت .Java, C, C++أﻣﺎ ﻣﻠﻔﺎﺗﮭﺎ ﻓﯿﺠﺐ أن ﯾﻜﻮن اﻣﺘﺪادھﺎ ” “.phpوﯾﻤﻜﻦ أن ﺗﺤﺘﻮي ﻧﺼﻮص أو ﻛﻮد
إﺣﺪى ﻟﻐﺎت اﻟﻮﯾﺐ ﻣﺜﻞ ،JavaScript, CSS, HTMLطﺒﻌﺎ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﻛﻮد اﻟﻠﻐﺔ ﻧﻔﺴﮭﺎ ،PHPﺣﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻟﻤﻠﻔﺎت ﻋﻠﻰ
اﻟﺨﺎدم ،serverوﻧﺘﺎﺋﺞ اﻟﺘﻨﻔﯿﺬ ﺗﻌﻮد إﻟﻰ اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ ﺟﮭﺎز اﻟﺤﺎﺳﻮب اﻟﺰﺑﻮن clientﻓﻲ ﺻﻔﺤﺔ ،HTMLوﯾﻤﻜﻨﮭﺎ إﻧﺘﺎج ﻣﻠﻔﺎت
ﻧﻮع ﺻﻮر أو PDFأو ،XMLأو ﺣﺘﻰ أﻓﻼم ﻓﻼش .ﯾﻤﻜﻦ ﻟﻠﻐﺔ PHPأن ﺗﻌﻤﻞ ﻋﻠﻰ إﻧﺸﺎء/ﺣﺬف ﻣﻠﻔﺎت ﻋﻠﻰ ﺧﺎدم ،ﻗﺮاءة/ﻛﺘﺎﺑﺔ
ﻣﻠﻔﺎت ﻋﻠﻰ ﺧﺎدم ،إﻧﺸﺎء/ﺣﺬف/ﺗﻐﯿﯿﺮ ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت ﻋﻠﻰ ﺧﺎدم ،وﯾﻤﻜﻨﮭﺎ ﻛﺬﻟﻚ اﻟﺘﺤﻜﻢ ﺑﻮﺻﻮل اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ،وﺗﺸﻔﯿﺮ اﻟﺒﯿﺎﻧﺎت.
ھﺬه اﻟﻠﻐﺔ ﻣﺪﻋﻮﻣﺔ ﻣﻦ ﻗﺒﻞ اﻟﻌﺪﯾﺪ ﻣﻦ ﺧﻮادم اﻟﻮﯾﺐ ﻣﺜﻞ IISو ،Apacheوﯾﻤﻜﻦ أن ﺗﻨﻔﺬ ﻋﻠﻰ ﻣﻌﻈﻢ ﻧﻈﻢ اﻟﺘﺸﻐﯿﻞ ﻣﺜﻞ اﻟﻮﯾﻨﺪوز
واﻟﻠﯿﻨﻮﻛﺲ واﻟﯿﻮﻧﻜﺲ واﻟﻤﺎﻛﻨﺘﻮش .ﻛﻤﺎ أﻧﮭﺎ ﺗﺪﻋﻢ اﻟﻌﺪﯾﺪ ﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﻓﻲ ﻣﻘﺪﻣﺘﮭﺎ MySQLاﻟﺘﻲ أﺻﺒﺤﺖ ﺗﺤﻤﻞ اﻻﺳﻢ
.MariaDBﻟﺬﻟﻚ وﻣﻦ أﺟﻞ اﻟﻌﻤﻞ ﺑﮭﺬه اﻟﻠﻐﺔ ،ﯾﺠﺐ ﺗﺤﻤﯿﻞ وﺗﻨﺼﯿﺐ ) (download & installﺧﺎدم وﯾﺐ ، web serverﺛﻢ ﺑﻌﺪ
ذﻟﻚ ﯾﻤﻜﻦ ﺗﺤﻤﯿﻞ ﻛﻞ ﻣﻦ PHPو .MySQLوﻟﻜﻦ وﺑﺪﻻ ﻣﻦ ﻛﻞ ھﺬه اﻟﺨﻄﻮات ،ﯾﻤﻜﻦ ﺗﺤﻤﯿﻞ ﺗﻄﺒﯿﻖ XAMPPﻣﻦ ﻣﻮﻗﻊ أﺻﺪﻗﺎء
أﺑﺎﺗﺸﻲ ،https://www.apachefriends.org/download.htmlواﻟﺬي ﯾﺤﻮي واﺟﮭﺔ ﺗﺤﻜﻢ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﻣﺎ ﯾﻠﻲ:
Apache 2.4.18, MariaDB 10.1.13, PHP 7.0.8, phpMyAdmin 4.5.1, OpenSSL 1.0.2, XAMPP Control
Panel 3.2.2, Webalizer 2.23-04, Mercury Mail Transport System 4.63, FileZilla FTP Server 0.9.41,
Tomcat 7.0.56 (with mod_proxy_ajp as connector), Strawberry Perl 7.0.56 Portable.
ﻛﻤﺎ ﺗﻼﺣﻆ ﻋﺰﯾﺰي اﻟﺪارس ،ﻓﺈن اﻟﻔﺮق اﻷﺳﺎس ﻓﻲ اﻹﺻﺪار اﻟﺤﺎﻟﻲ ﻣﻦ XAMPPواﻹﺻﺪار اﻟﺴﺎﺑﻖ ھﻮ أن اﻹﺻﺪار اﻟﺴﺎﺑﻖ ﯾﺤﻮي
ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺎﺳﻢ ،MySQLواﻹﺻﺪار اﻟﺤﺎﻟﻲ ﯾﺤﻤﻞ أﺳﻢ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .MariaDBﻓﻲ اﻟﺤﻘﯿﻘﺔ ﻓﺈﻧﮫ وﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﺴﺘﺨﺪم ﻻ ﻓﺮق
ﻓﻲ اﻷواﻣﺮ أو اﻟﺘﻌﺎﻣﻞ ﺑﯿﻨﮭﻤﺎ .إﻻ أن ﻣﺒﺮﻣﺠﻲ ﻣﺠﺘﻤﻊ أﺑﺎﺗﺸﻲ ،Apache Communityﻗﺪ ﻗﺮروا أن ﯾﺼﻤﻤﻮا MariaDBﺑﺴﺐ
ﻣﺸﺎﻛﻞ ﻣﻊ اﻟﺸﺮﻛﺔ اﻷم أوراﻛﻞ اﻟﺘﻲ اﺷﺘﺮت MySQLﻣﻦ ﺷﺮﻛﺔ ﺻﻦ ﻣﺴﺒﻘﺎ ،وﻟﻢ ﺗﮭﺘﻢ ﺑﺘﻄﻮﯾﺮه ﺑﺴﺒﺐ وﺟﻮد ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎﺗﮭﺎ أﺻﻼ.
ﻟﺬﻟﻚ ﺗﻢ ﺗﺼﻤﯿﻢ MariaDBﻣﻦ ﻗِﺒﻞ ﻣﺒﺮﻣﺠﻲ ﻣﺠﺘﻤﻊ أﺑﺎﺗﺸﻲ ﺑﺪون أي ﻓﺮوق ،وﺑﻄﺮﯾﻘﺔ ﺗﺤﺎﻛﻲ ﻧﻔﺲ ﻧﻤﻂ .MySQL
ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻠﻒ اﻟﺘﻨﻔﯿﺬي ،xampp-content.exeاﻟﻤﺆﺷﺮ ﺑﺎﻟﺴﮭﻢ اﻷﺣﻤﺮ ،ﯾﺘﻢ ﻓﺘﺢ ﻟﻮﺣﺔ اﻟﺘﺤﻜﻢ واﻟﺘﻲ ﺗﺴﻤﺢ ﻟﻠﻤﺴﺘﺨﺪم ﺑﺘﺸﻐﯿﻞ
ﺧﺎدم اﻟﻮﯾﺐ Apacheوﺑﺎﻟﺘﺎﻟﻲ ﺗﺠﺰﺋﺔ وﺗﻌﺮﯾﺐ parseﻛﻮد ﻟﻐﺔ ،PHPوﻛﺬﻟﻚ ﺗﻄﺒﯿﻖ MariaDBأو .MySQLأﻧﻘﺮ زر start
اﻟﻤﺸﺎر إﻟﯿﮫ ﺑﺪاﺋﺮة ﺑﺎﻟﻠﻮن اﻷﺧﻀﺮ ﻟﺘﺸﻐﯿﻞ ﺧﺎدم اﻟﻮﯾﺐ Apacheوﻛﺬﻟﻚ زر ﺗﺸﻐﯿﻞ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .MariaDB
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 16
واﻟﻨﺎﺗﺞ ﯾﺠﺐ أن ﯾﻜﻮن ﻛﻤﺎ ﻓﻲ اﻟﺼﻮرة اﻟﺘﺎﻟﯿﺔ:
ﻟﻠﺘﺄﻛﺪ ﻣﻦ أن اﻟﺨﺎدم ﯾﻌﻤﻞ ﺑﺼﻮرة ﺻﺤﯿﺤﺔ ،ﻣﻦ ﺧﻼل ﻣﺘﺼﻔﺢ اﻻﻧﺘﺮﻧﺖ )ﻣﺜﻼ ،(Google Chromeاطﻠﺐ اﻟﻤﻮﻗﻊ ،localhostﺛﻢ
اﺧﺘﺎر اﻟﻠﻐﺔ اﻻﻧﺠﻠﯿﺰﯾﺔ ،ﻓﯿﺠﺐ أن ﺗﻈﮭﺮ ﻣﻌﻚ اﻟﺼﻔﺤﺔ اﻟﺘﺎﻟﯿﺔ:
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 17
ﺛﺎﻟﺜﺎ :اﻟﺒﺮﻧﺎﻣﺞ اﻷول
ﻟﻜﺘﺎﺑﺔ اﻟﺒﺮﻧﺎﻣﺞ اﻷول ﺑﻠﻐﺔ ،PHPﻻ ﺑﺪ ﻣﻦ ﻓﮭﻢ ﻣﺒﺎدئ ھﺬه اﻟﻠﻐﺔ .إن ﺗﻌﻠﯿﻤﺎت scriptﻛﻮد ﻣﻜﺘﻮب ﺑﻠﻐﺔ ،PHPﯾﻤﻜﻦ أن ﺗﻮﺿﻊ ﻓﻲ
أي ﻣﻮﺿﻊ ﻓﻲ اﻟﻤﺴﺘﻨﺪ ،وﯾﺠﺐ أن ﯾﺒﺪأ اﻟﺴﻜﺮﯾﺒﺖ ﺑﺎﻹﺷﺎرة <?phpوﯾﻨﺘﮭﻲ ﺑﺎﻹﺷﺎرة >? .وھﺬا ﻣﻦ أﺟﻞ اﻟﻤﺘﺼﻔﺢ اﻟﺬي ﺳﯿﻔﮭﻢ أن
ﺳﻜﺮﯾﺒﺖ اﻟﻜﻮد اﻟﻘﺎدم ھﻮ ﻣﻦ ﻧﻮع .PHPاﻟﺸﻜﻞ اﻟﻌﺎم ﻟﺴﻜﺮﯾﺒﺖ PHPﻓﻲ اﻟﻤﺴﺘﻨﺪ ،ﯾﻈﮭﺮ ﻛﻤﺎ ﯾﻠﻲ:
<?php
// PHP code goes here
>?
ﯾﺤﺘﻮي ﻣﻠﻒ PHPﻋﺎدة ﻋﻠﻰ إﺷﺎرات HTMLوﺗﻌﻠﯿﻤﺎت ﻛﻮد ،PHPﻛﻤﺎ ﯾﻈﮭﺮ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ اﻟﺬي ﯾﺴﺘﺨﺪم دوال داﺧﻠﯿﺔ ﺟﺎھﺰة
،built-inواﺳﻢ اﻷوﻟﻰ echoﻟﯿﺨﺮج ﻧﺺ hello worldﻓﻲ ﺻﻔﺤﺔ اﻟﻮﯾﺐ ،واﺳﻢ اﻟﺜﺎﻧﯿﺔ printوﻟﮭﺎ ﻧﻔﺲ ﻋﻤﻞ اﻷوﻟﻰ .ﯾﻤﻜﻦ أن
ﯾﺘﻢ إدﺧﺎل إﺷﺎرات HTMLﻹﺧﺮاﺟﮭﺎ ﻓﻲ ﺻﻔﺤﺔ اﻟﻮﯾﺐ ﻟﻠﻤﺴﺘﺨﺪم أﯾﻀﺎ ﻣﺜﻞ ﺳﻄﺮ ﺟﺪﯾﺪ وطﺒﺎﻋﺔ اﻟﺠﻤﻠﺔ Hello Everybodyﺑﺨﻂ
ﻏﺎﻣﻖ ،وإدﺧﺎل ﺳﻄﺮ ﺟﺪﯾﺪ ،اﻟﺦ.
ﻣﻠﻒ ex0.php
><!DOCTYPE html
><html> <body> <h1>First example written in PHP</h1
<?php
;"!echo "Hello World
>?
<?php
;">print "<br> <b> Comments are not executing </b
# This is a single-line comment
>?
ﺧ ّﺰن ھﺬا اﻟﻤﻠﻒ ﻋﻠﻰ ﻣﺠﻠﺪ ﺟﺪﯾﺪ ﺑﺎﺳﻢ tutorialداﺧﻞ ﻣﺠﻠﺪ xamppوذﻟﻚ ﻋﻠﻰ ﻣﺠﻠﺪ htdocsﻛﻤﺎ ﯾﻠﻲ:
C:\xampp\htdocs\xampp\tutorial
ﻣﻼﺣﻈﺔ :ﻋﺰﯾﺰي اﻟﺪارس ،إن ﻟﻢ ﯾﻜﻦ اﻟﺘﻄﺒﯿﻖ xamppﻣﻔﺘﻮح ،اﻓﺘﺤﮫ ﺛﻢ ﺷﻐﻞ ﺧﺎدم اﻟﻮﯾﺐ .Apache
اﻵن وﻣﻦ ﺧﻼل اﻟﻤﺘﺼﻔﺢ ﻧﻔﺬ اﻟﻤﻠﻒ ،ex0.phpوﺗﺄﻛﺪ ﻣﻦ أن اﻟﻨﺎﺗﺞ ھﻮ ﻛﻤﺎ ﯾﻠﻲ:
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 18
ﯾﺤﺘﻮي ﻣﻠﻒ PHPﻋﺎدة ﻋﻠﻰ إﺷﺎرات HTMLوﺗﻌﻠﯿﻤﺎت ﻛﻮد ،PHPﻛﻤﺎ ﯾﻈﮭﺮ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ اﻟﺬي ﯾﺴﺘﺨﺪم دوال داﺧﻠﯿﺔ ﺟﺎھﺰة
،built-inواﺳﻢ اﻷوﻟﻰ echoﻟﯿﺨﺮج ﻧﺺ hello worldﻓﻲ ﺻﻔﺤﺔ اﻟﻮﯾﺐ ،واﺳﻢ اﻟﺜﺎﻧﯿﺔ printوﻟﮭﺎ ﻧﻔﺲ ﻋﻤﻞ اﻷوﻟﻰ .ﯾﻤﻜﻦ أن
ﯾﺘﻢ إدﺧﺎل إﺷﺎرات HTMLﻹﺧﺮاﺟﮭﺎ ﻓﻲ ﺻﻔﺤﺔ اﻟﻮﯾﺐ ﻟﻠﻤﺴﺘﺨﺪم أﯾﻀﺎ ﻣﺜﻞ ﺳﻄﺮ ﺟﺪﯾﺪ وطﺒﺎﻋﺔ ﺟﻤﻠﺔ ﺑﺨﻂ ﻏﺎﻣﻖ ،وإدﺧﺎل ﺳﻄﺮ
ﺟﺪﯾﺪ ،اﻟﺦ .ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ،وﻛﻤﺎ ﺗﻼﺣﻆ ،ﺗﻨﺘﮭﻲ ﺟﻤﻞ PHPﺑﻔﺎﺻﻠﺔ ﻣﻨﻘﻮطﺔ ،semicolonوﯾﻤﻜﻦ دﻣﺞ إﺷﺎرات ،HTML
داﺧﻞ ﻛﻮد .PHPﺣﯿﺚ ﺗﻢ إظﮭﺎر اﻟﻨﺺ Comments are not executingﺑﺨﻂ ﻏﺎﻣﻖ وﺗﻢ أﯾﻀﺎ إظﮭﺎر اﻟﺠﻤﻠﺔ ﻓﻲ ﺳﻄﺮ ﺟﺪﯾﺪ.
ﯾﺴﺘﻌﻤﻞ اﻟﺘﻌﻠﯿﻖ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﻣﻦ أﺟﻞ ﺗﻮﺿﯿﺢ ﺗﻌﻠﯿﻤﺎت ﻣﻌﯿﻨﺔ أو ﺟﻤﻞ ﻣﻌﯿﻨﺔ داﺧﻞ اﻟﻜﻮد ،وھﺬه اﻟﺘﻌﻠﯿﻘﺎت ﻻ ﺗﻨﻔﺬ طﺒﻌﺎ .ﻓﻲ ﻟﻐﺔ ،PHP
اﻟﺘﻌﻠﯿﻘﺎت ﯾﻤﻜﻦ أن ﺗﺘﻢ ﻣﻦ ﺧﻼل اﻟﺸﺮطﺘﯿﻦ ” “//و اﻟﺴﻠﻢ ” “#واﻟﻠﺘﺎن ﺗﺴﻤﺤﺎن ﺑﻜﺘﺎﺑﺔ ﺳﻄﺮ واﺣﺪ ﻣﻦ اﻟﺘﻌﻠﯿﻘﺎت ،أو ﻣﻦ ﺧﻼل اﻟﺸﺮطﺔ
ﻣﻊ اﻟﻨﺠﻤﺔ واﻟﺘﻲ ﺗﺴﻤﺢ ﺑﻜﺘﺎﺑﺔ أﻛﺜﺮ ﻣﻦ ﺳﻄﺮ ﻣﻦ اﻟﺘﻌﻠﯿﻘﺎت ﻛﻤﺎ ﻓﻲ ﻟﻐﺔ ،Cوﻟﻐﺔ C++
ﻣﻠﻒ ex1.php
><!DOCTYPE html
><html><body> <h1>Variables in PHP</h1
<?php
;"$str = "Defining String Variable
;$x = 5
;$X = 3.14
;">prinT "$str in PHP<br
;ecHo $x + $X
;">echo "<br
;"!" echo "I am " . $str .
>?
></body> </html
اﻵن وﻣﻦ ﺧﻼل اﻟﻤﺘﺼﻔﺢ ﻧﻔﺬ اﻟﻤﻠﻒ ،ex1.phpوﺗﺄﻛﺪ ﻣﻦ أن اﻟﻨﺎﺗﺞ ھﻮ ﻛﻤﺎ ﯾﻠﻲ:
ﻛﻤﺎ ﺗﻼﺣﻆ ﻋﺰﯾﺰي اﻟﺪارس ،ﯾﻤﻜﻦ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﻓﻲ ﻟﻐﺔ PHPﺑﺎﺳﺘﺨﺪام إﺷﺎرة $ﻣﺘﺒﻮﻋﺔ ﺑﺎﺳﻢ اﻟﻤﺘﻐﯿﺮ واﻟﺬي ﯾﺠﺐ أن ﯾﺒﺪأ ﺑﺤﺮف
أو .underscoreوﯾﻤﻜﻦ ﻟﺼﻖ أﻛﺜﺮ ﻣﻦ ﺳﻠﺴﻠﺔ ﺑﺎﺳﺘﺨﺪام اﻟﻌﺎﻣﻞ ) (.ﻛﻤﺎ ﻓﻲ اﻟﺘﻌﻠﯿﻤﺔ اﻷﺧﯿﺮة ﻣﻦ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ .ﻛﺬﻟﻚ ﻓﺈﻧﻨﺎ ﻟﻢ ﻧﺨﺒﺮ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 19
ﻟﻐﺔ PHPﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﯾﺤﻤﻠﮫ اﻟﻤﺘﻐﯿﺮ ،وذﻟﻚ ﻷن ﻟﻐﺔ PHPﺗﻘﻮم ﺑﺘﺤﻮﯾﻞ اﻟﻤﺘﻐﯿﺮ ﺑﺸﻜﻞ أوﺗﻮﻣﺎﺗﯿﻜﻲ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻨﺎﺳﺐ
ﺑﻨﺎء ﻋﻠﻰ ﻗﯿﻤﺘﮫ .ﻓﻤﺜﻼ اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﯾﻤﻜﻦ اﺳﺘﺨﺪاﻣﮫ ﻟﻤﻌﺮﻓﺔ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﯾﺤﻤﻠﮫ اﻟﻤﺘﻐﯿﺮ ﻣﻦ ﺧﻼل اﻟﺪاﻟﺔ اﻟﺠﺎھﺰة :var_dump
ﻣﻠﻒ ex2.php
><!DOCTYPE html
><html><body
<?php
;$x = 379.999
;)var_dump($x
;">echo "<br
;$x = 29
;)var_dump($x
>?
></body></html
وﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﻛﻤﺎ ﯾﻠﻲ:
)float(379.999
)int(29
ﻟﺘﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﻣﻦ ﻧﻮع ﻣﺼﻔﻮﻓﺔ ،ﻧﺴﺘﺨﺪم اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة ،arrayواﻟﺘﻲ ﺗﻤﻜﻨﻨﺎ ﻣﻦ ﺗﻌﺮﯾﻒ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻌﻨﺎﺻﺮ ﺗﺤﻤﻞ ﻧﻔﺲ ﻧﻮع
اﻟﺒﯿﺎﻧﺎت .اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﯾﻮﺿﺢ ﺗﻌﺮﯾﻒ ﻣﺼﻔﻮﻓﺔ ﺗﺤﻤﻞ ﺛﻼﺛﺔ ﻋﻨﺎﺻﺮ ﻣﻦ ﻧﻮع ﺳﻠﺴﻠﺔ ،stringﺣﯿﺚ ﯾﺘﻢ طﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ
ووﺻﻞ ﺗﻠﻚ اﻟﻌﻨﺎﺻﺮ ﺑﻌﻀﮭﺎ ﺑﺒﻌﺾ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﺳﻼﺳﻞ أﺧﺮى ﻣﻦ ﺧﻼل اﻟﻌﺎﻣﻞ ) (.ﻛﻤﺎ ﺗﻢ ﺗﻮﺿﯿﺤﮫ ﺳﺎﺑﻘﺎ.
ﻣﻠﻒ ex3.php
><!DOCTYPE html
><html><body
<?php
;)"$courses = array("Web Design", "Network Programming", "Distributed Systems
;"echo "This semester, I have three courses: " . $courses[0] . ", " . $courses[1] . " and " . $courses[2] . ".
;">echo "<br
;)$arrayLength = count($courses
)for($i = 0; $i < $arrayLength; $i++
{
;]echo $courses[$i
;">echo "<br
}
>?
></body></html
وﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﻛﻤﺎ ﯾﻠﻲ:
ھﻨﺎك ﻧﻮع ﻣﻦ اﻟﻤﺼﻔﻮﻓﺎت وھﻲ اﻟﻤﺼﻔﻮﻓﺎت اﻟﻤﺘﺰاﻣﻠﺔ )ﻣﻦ زﻣﯿﻞ( ﺗﺴﻤﻰ ،associative arraysﺗﺤﻮي ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻌﻨﺎﺻﺮ
اﻟﻤﺘﺰاﻣﻠﺔ ﻣﻊ ﻗﯿﻤﮭﺎ ،أي أن ﻟﻜﻞ ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ زﻣﯿﻞ واﺣﺪ ﻣﻦ اﻟﻘﯿﻢ اﻟﻤﻘﺎﺑﻠﺔ ﻟﮫ .ھﻨﺎك طﺮﯾﻘﺘﯿﻦ ﻟﺘﻌﺮﯾﻒ اﻟﻤﺼﻔﻮﻓﺔ اﻟﻤﺘﺰاﻣﻠﺔ،
اﻷوﻟﻰ ﺑﺎﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﻔﺘﺎح :array
;)"$price = array("BMW"=>"35000", "VW"=>"32000", "Opel"=>"24000
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 20
واﻟﺜﻨﯿﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺘﻌﺮﯾﻒ اﻟﻤﻨﻔﺮد ﻟﻜﻞ ﻋﻨﺼﺮ:
;"$price['BMW'] = "35000
;"$price['VW'] = "32000
;"$price['Opel'] = "24000
اﻵن ﯾﻤﻜﻦ اﺳﺘﺨﺪام أﺣﺪ اﻟﻌﻨﺎﺻﺮ وﻣﺎ ﯾﻘﺎﺑﻠﮫ ﻣﻦ ﻗﯿﻤﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺴﻜﺮﯾﺒﺖ اﻟﺘﺎﻟﻲ:
;"echo "Price of Opel is " . $price['Opel'] . " USD.
أو ﻣﻦ ﺧﻼل ﺟﻤﻠﺔ دوران ،ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﻣﺜﻞ xﯾﻤﺜﻞ اﻟﻌﻨﺼﺮ ،وﻣﺘﻐﯿﺮ آﺧﺮ ﻣﺜﻞ x_valueﯾﻤﺜﻞ اﻟﻘﯿﻤﺔ اﻟﻤﻘﺎﺑﻠﺔ )اﻟﺰﻣﯿﻠﺔ(،
ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ:
ﻣﻠﻒ ex4.php
><!DOCTYPE html
><html><body
<?php
;)"$price = array("BMW"=>"35000", "VW"=>"32000", "Opel"=>"24000
)foreach($price as $x => $x_value
{
;echo "Model= " . $x . ", Price= " . $x_value
;">echo "<br
}
>?
></body></html
وﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﻛﻤﺎ ﯾﻠﻲ:
ﻣﻠﻒ ex5.php
ﺑﻤﺴﺎﻋﺪة ﻣﺸﺮﻓﻚ اﻷﻛﺎدﯾﻤﻲ ،ﻧﻔﺬ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﻋﻠﻰ ﺟﮭﺎز اﻟﺤﺎﺳﻮب ،وﺣﺎول أن ﺗﺘﻌﺮف ﻋﻠﻰ آﻟﯿﺔ ﻋﻤﻞ اﻟﺪوال اﻟﺮﯾﺎﺿﯿﺔ.
><!DOCTYPE html
><html><body><h2>Mathematical Functions in PHP</h2
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 21
<?php
echo "absolute value of -3.6 is: ";
echo(abs(-3.6) ."<br>");
echo "power of two integers is: ";
echo(pow(2,-4) . "<br>");
echo "exponential of float value is: ";
echo(exp(3.46) . "<br>");
echo "log to base 10 of 10 is: ";
echo(log10(10) . "<br>");
echo "log to base 10 of 6.61 is: ";
echo(log10(6.61) . "<br>");
echo "log to base 10 of 0 is: ";
echo(log10(0) . "<br>");
echo "round of 1.8 is: ";
echo(round(1.80) ."<br>");
echo "round of 0.50 is: ";
echo(round(0.50) ."<br>");
echo "round of 0.49 is: ";
echo(round(0.49) ."<br>");
echo "round of -4.40 is: ";
echo(round(-4.40) ."<br>");
echo "floor of 0.50 is: ";
echo(floor(0.50) . "<br>");
echo "floor of 7.1 is: ";
echo(floor(7.1) . "<br>");
echo "floor of -7.7 is: ";
echo(floor(-7.7) . "<br>");
echo "ceil of 0.50 is: ";
echo(ceil(0.50) . "<br>");
echo "ceil of 5.1 is: ";
echo(ceil(5.1) . "<br>");
echo "ceil of -5.9 is: ";
echo(ceil(-5.9) . "<br>");
echo "sine of 180 degrees is: ";
echo(sin(M_PI) . "<br>");
echo "cosine of 0 degrees is: ";
echo(cos(0) . "<br>");
echo "cosine of 45 degrees is: ";
echo(cos(M_PI/4.0) . "<br>");
?>
</body></html>
:وﯾﻜﻮن ﻧﺎﺗﺞ اﻟﺘﻨﻔﯿﺬ ﻛﻤﺎ ﯾﻠﻲ
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 22
ﺑﺠﺎﻧﺐ اﺣﺘﻮاء ﻟﻐﺔ PHPﻋﻠﻰ آﻻف اﻟﺪوال اﻟﻤﺒﻨﯿﺔ ﻣﺴﺒﻘﺎ ،built-inﯾﻤﻜﻦ ﻟﻠﻤﺒﺮﻣﺞ أن ﯾﻌﺮف اﻟﺪاﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ ﻟﺘﻘﻮم ﺑﺒﻌﺾ
اﻟﻤﮭﻤﺎت .ﻓﺎﻟﺪاﻟﺔ ﻓﻲ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ﺑﺸﻜﻞ ﻋﺎم ھﻲ ﺑﻠﻮك ﯾﺤﻮي ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺠﻤﻞ اﻟﺒﺮﻣﺠﯿﺔ ،وھﺬا اﻟﺒﻠﻮك ﯾﺘﻢ اﺳﺘﺪﻋﺎؤه ﻟﻠﺘﻨﻔﯿﺬ ﻋﺪة
ﻣﺮات أﺛﻨﺎء ﻋﻤﻞ اﻟﺒﺮﻧﺎﻣﺞ وذﻟﻚ ﺑﺤﺴﺐ اﻟﺤﺎﺟﺔ .ﻓﺒﺪﻻ ﻣﻦ ﻛﺘﺎﺑﺔ ﻧﻔﺲ اﻟﻜﻮد ﻋﺪة ﻣﺮات ،ﯾﺘﻢ وﺿﻊ ذﻟﻚ اﻟﻜﻮد ﻓﻲ داﺧﻞ ﺑﻠﻮك ﯾﺴﻤﻰ
،functionوﯾﺘﻢ اﺳﺘﺪﻋﺎؤه ﻋﻨﺪ اﻟﺤﺎﺟﺔ ﻟﻠﺘﻨﻔﯿﺬ .ﺗﻌﻠﯿﻤﺎت ﻛﻮد اﻟﺪاﻟﺔ ﻻ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺗﺤﻤﯿﻞ اﻟﺼﻔﺤﺔ ،وﻟﻜﻦ ﻋﻨﺪﻣﺎ ﯾﺘﻢ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ.
ﻓﻲ اﻟﺸﻜﻞ اﻟﻌﺎم اﻟﺘﺎﻟﻲ ﻟﺘﻌﺮﯾﻒ اﻟﺪاﻟﺔ ،وﻛﻤﺎ ﺗﺮى ،ﻋﺰﯾﺰي اﻟﺪارس ،ﻓﺈن اﻟﺘﺼﺮﯾﺢ ﺑﺎﻟﺪاﻟﺔ ﯾﺘﻢ ﻣﻦ ﺧﻼل اﻟﻜﻠﻤﺔ اﻟﻤﻔﺘﺎﺣﯿﺔ .function
اﺳﻢ اﻟﺪاﻟﺔ ﯾﺒﺪأ ﺑﺤﺮف أو ) _ ( ،وﻟﻜﻦ ﻻ ﯾﻤﻜﻦ أن ﯾﺒﺪأ ﺑﺮﻗﻢ.
)(function functionName
{
;//code to be executed
}
ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ،ﺳﺘﻜﺘﺐ داﻟﺔ ،ﺗﻌﻤﻞ ﻋﻠﻰ طﺒﺎﻋﺔ ﺟﻤﻠﺔ ﻓﻲ اﻟﻤﺘﺼﻔﺢ.
ﻣﻠﻒ ex6.php
><!DOCTYPE html
><html><body><h2>User-defined Function in PHP</h2
<?php
;“ echo “2 power to 4 is:
;)”>echo(pow(2, 4) . “<br
)(function writeMessageToBrowser
{
;”>echo “<br>I am learning functions of PHP <br
}
;“ echo “<br>sine of 90 degrees is:
;)”>echo(sin(M_PI/2.0) . “<br
writeMessageToBrowser(); // call the function
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 23
;”echo “<br>End
>?
></body></html
وﺗﻜﻮن اﻟﻨﺘﯿﺠﺔ ﻛﺎﻟﺘﺎﻟﻲ:
وﻛﻤﺎ ﺗﺮى ﻋﺰﯾﺰي اﻟﺪارس ،ﯾﺠﺐ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ ﻣﻦ أﺟﻞ اﻟﺘﻨﻔﯿﺬ .ﻓﻘﺪ ﺗﻢ ﺗﻨﻔﯿﺬ ﺗﻌﻠﯿﻤﺎت scriptﻧﺎﺗﺞ 2ﻟﻠﻘﻮة ،4وﻟﻜﻦ ﻟﻢ ﯾﺘﻢ ﺗﻨﻔﯿﺬ
ﺗﻌﻠﯿﻤﺎت اﻟﺪاﻟﺔ ،ﻓﻘﻔﺰ ﻋﻦ اﻷﺳﻄﺮ اﻟﺨﺎﺻﺔ ﺑﮭﺎ ،ﺣﯿﺚ ﻗﺎم ﺑﺘﻨﻔﯿﺬ ﺗﻌﻠﯿﻤﺎت إﯾﺠﺎد ﺟﯿﺐ زاوﯾﺔ 90درﺟﺔ ،ﺑﻌﺪ ذﻟﻚ ﺻﺎدف وﺟﻮد ﺗﻌﻠﯿﻤﺔ
ﺗﺴﺘﺪﻋﻲ اﻟﺪاﻟﺔ ،ﻓﻘﺎم ﺑﺘﻨﻔﯿﺬ ﺗﻌﻠﯿﻤﺎت اﻟﺪاﻟﺔ ،ﺛﻢ ﻋﺎد ﯾﻨﻔﺬ أﺧﺮ ﺗﻌﻠﯿﻤﺔ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ وھﻲ طﺒﺎﻋﺔ اﻟﻜﻠﻤﺔ .End
ﻣﻠﻒ ex7.php
ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ،ﻋﺰﯾﺰي اﻟﺪارس ،ﺳﻮف ﺗﻜﺘﺐ داﻟﺔ ،ﺗﺄﺧﺬ ﻣﺘﻐﯿﺮﯾﻦ ،two parametersاﻟﻤﺘﻐﯿﺮ اﻷول أﺳﻢ اﻟﻌﺎﺋﻠﺔ ،familyName
واﻟﻤﺘﻐﯿﺮ اﻟﺜﺎﻧﻲ اﻟﻌﻼﻣﺔ ،Markﺣﯿﺚ ﺗﻌﻤﻞ ھﺬه اﻟﺪاﻟﺔ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻄﺎﻟﺐ ﻓﻲ اﻟﻤﺘﺼﻔﺢ.
><!DOCTYPE html
><html><body><h2>User-defined Functions in PHP</h2
<?php
;">echo "User-defined Function with Arguments<br
)function studentInformation($FamilyName, $Mark
{
;">echo "$FamilyName, his mark is $Mark <br
}
;)"studentInformation("Ahmad","86
;)"studentInformation("Mohammad","88
;)"studentInformation("Abdallah","71
>?
></body></html
ﻻﺣﻆ ﻋﺰﯾﺰي اﻟﺪارس ،أﻧﮫ ﺗﻢ ﻣﻨﺎداة اﻟﺪاﻟﺔ ﺑﺎﺳﻤﮭﺎ ﻣﻊ ﺗﻤﺮﯾﺮ ﻣﻌﺎﻣﻠﯿﻦ ،two argumentsﻓﻲ ﻛﻞ ﻣﺮة .وھﻤﺎ اﺳﻢ اﻟﻌﺎﺋﻠﺔ واﻟﻌﻼﻣﺔ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 24
ex8.php ﻣﻠﻒ
وﺗﻌﯿﺪ اﻟﻨﺎﺗﺞ إﻟﻰ،integers ﻣﻦ ﻧﻮع،two parameters ﺗﺄﺧﺬ ﻣﺘﻐﯿﺮﯾﻦ، ﺳﻮف ﺗﻜﺘﺐ داﻟﺔ، ﻋﺰﯾﺰي اﻟﺪارس،ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ
.اﻟﻤﻨﺎدي ﻟﯿﻌﻤﻞ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺣﺎﺻﻞ ﺟﻤﻊ اﻟﻌﺪدﯾﻦ ﻓﻲ اﻟﻤﺘﺼﻔﺢ
<!DOCTYPE html>
<html><body><h2>User-defined Functions in PHP</h2>
<?php
echo "User-defined Function with Parameters and Return Value<br><br>";
function Addition($number1, $number2)
{
$result = $number1 + $number2;
return $result;
}
</body></html>
ﻓﻲ اﻟﻤﺮة اﻷوﻟﻰ وﻓﻲ اﻟﻤﺮة. ﺛﻼث ﻣﺮات،two arguments أﻧﮫ ﺗﻢ ﻣﻨﺎداة اﻟﺪاﻟﺔ ﺑﺎﺳﻤﮭﺎ ﻣﻊ ﺗﻤﺮﯾﺮ ﻣﻌﺎﻣﻠﯿﻦ،ﻻﺣﻆ ﻋﺰﯾﺰي اﻟﺪارس
.floating point numbers وﻓﻲ اﻟﻤﺮة اﻟﺜﺎﻧﯿﺔ ﻛﺎﻧﺎ ﺑﻔﺎﺻﻠﺔ ﻋﺸﺮﯾﺔ، ﻛﺎن اﻟﻤﻌﻤﻼن ﻋﺪدﯾﻦ ﺻﺤﯿﺤﯿﻦ،اﻟﺜﺎﻟﺜﺔ
ex9.php ﻣﻠﻒ
ھﻮ، اﻟﻔﺮق ﺑﯿﻨﮭﻤﺎ. واﻟﺜﺎﻧﯿﺔ أﯾﻀﺎ،one parameter اﻷوﻟﻰ ﺗﺄﺧﺬ ﻣﺘﻐﯿﺮ واﺣﺪ، ﺳﻮف ﺗﻜﺘﺐ داﻟﺘﯿﻦ، ﻋﺰﯾﺰي اﻟﺪارس،ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ
.call by value or call by reference ﺗﻤﺮﯾﺮ ﺑﺎﻟﻘﯿﻤﺔ وﺗﻤﺮﯾﺮ ﺑﺎﻟﻤﺮﺟﻊ،أن ﻧﻮع اﻟﺘﻤﺮﯾﺮ
<!DOCTYPE html>
<html><body><h2>User-defined Functions in PHP</h2>
<?php
echo "Pass by Value or Pass by Reference<br><br>";
function add7($number1)
{
$number1 = $number1 + 7;
}
function add3(&$number2)
{
$number2 = $number2 + 3;
}
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 25
;$result = 9
;)Add7($result
;">echo "$result<br
;)Add3($result
;">echo "$result<br
>?
></body></html
ﻻﺣﻆ ﻋﺰﯾﺰي اﻟﺪارس ،أﻧﮫ ﺗﻢ ﻣﻨﺎداة ﻛﻞ داﻟﺔ ﺑﺎﺳﻤﮭﺎ ﻣﻊ ﺗﻤﺮﯾﺮ ﻣﻌﺎﻣﻞ ﻟﮭﺎ .وﻟﻜﻦ ﻓﻲ اﻟﻤﺮة اﻷوﻟﻰ ،ﻛﺎﻧﺖ اﻟﻤﻨﺎداة ﺑﺘﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ ،ﻓﻠﻢ
ﺗﺘﻐﯿﺮ اﻟﻘﯿﻤﺔ اﻷﺻﻠﯿﺔ ،وﻓﻲ اﻟﻤﺮة اﻟﺜﺎﻧﯿﺔ ﻛﺎﻧﺖ اﻟﻤﻨﺎداة ﺑﺘﻤﺮﯾﺮ اﻟﻤﺮﺟﻊ ،ﻓﺤﺼﻞ اﻟﺘﻐﯿﯿﺮ ﻋﻠﻰ اﻟﺮﻗﻢ اﻷﺳﺎس.
ﻣﺘﻐﯿﺮ ﺗﻢ ﺗﻌﺮﯾﻔﮫ داﺧﻞ اﻟﺪاﻟﺔ ،ﻟﮫ ﻣﺠﺎل ﻣﺤﻠﻲ ،local scopeوﯾﻤﻜﻦ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ داﺧﻞ ﺗﻠﻚ اﻟﺪاﻟﺔ ﻓﻘﻂ .ﻟﺬﻟﻚ ﻓﺈن ﺗﻨﻔﯿﺬ ﺳﻜﺮﯾﺒﺖ
PHPاﻟﺘﺎﻟﻲ ،ﺳﯿﺆدي إﻟﻰ ﺧﻄﺄ ﺑﺴﺒﺐ أن ﻣﺘﻐﯿﺮ ﺗﻢ ﺗﻌﺮﯾﻔﮫ داﺧﻞ داﻟﺔ ،وﻟﻜﻦ اﻟﻤﺒﺮﻣﺞ ﯾﻌﻤﻞ ﻋﻠﻰ ﻣﺤﺎوﻟﺔ اﺳﺘﺨﺪاﻣﮫ ﻣﻦ ﺧﺎرﺟﮭﺎ.
><!DOCTYPE html
><html><body><h2>Local variables in PHP</h2
<?php
)(function func2
{
$x = 3; // local scope
;">echo "<p>No Error printing variable x inside the function: $x</p
}
;)(func2
;">echo "<p>Error accessing variable x outside the function: $x</p
>?
></body></html
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 26
ﻣﺘﻐﯿﺮ ﺗﻢ ﺗﻌﺮﯾﻔﮫ ﺧﺎرج اﻟﺪاﻟﺔ ،ﯾﻤﻜﻦ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ داﺧﻞ اﻟﺪاﻟﺔ ،وﻟﻜﻦ ﯾﺠﺐ أن ﯾﻮﺻﻒ ﺑﺄﻧﮫ ﻋﺎم ﻣﻦ ﺧﻼل اﻟﻜﻠﻤﺔ اﻟﻤﻔﺘﺎﺣﯿﺔ ،global
وذﻟﻚ ﻓﻲ داﺧﻞ اﻟﺪاﻟﺔ اﻟﺘﻲ ﺳﺘﺴﺘﺨﺪﻣﮫ .ﻻ ﯾﻨﺘﺞ أﯾﺔ أﺧﻄﺎء ﻋﻨﺪ ﺗﻨﻔﯿﺬ اﻟﺴﻜﺮﯾﺒﺖ اﻟﺘﺎﻟﻲ:
><!DOCTYPE html
><html><body><h2>Global variables inside functions in PHP</h2
<?php
;$x = 5; $y = 7; $z = 0
)(function func3
{
;global $x, $y, $z
;$z = $x + $y
}
;)(func3
echo $z; // result is 12
>?
></body></html
ﻋﻨﺪ اﻻﻧﺘﮭﺎء ﻣﻦ ﺗﻨﻔﯿﺬ داﻟﺔ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺘﮭﺎ ،ﻓﺈن ﺟﻤﯿﻊ ﻣﺘﻐﯿﺮاﺗﮭﺎ اﻟﻤﺤﻠﯿﺔ ﺗﺤﺬف .أﺣﯿﺎﻧﺎ ،ﻧﺮﯾﺪ اﻻﺣﺘﻔﺎظ ﺑﺂﺧﺮ ﻗﯿﻤﺔ ﻟﻤﺘﻐﯿﺮ ﻣﺤﻠﻲ ﻣﻌﯿﻦ ،وﻻ
ﻧﺮﯾﺪ أن ﯾﺘﻢ ﺣﺬﻓﮫ ،ﻷﻧﻨﺎ ﻧﺮﯾﺪ اﺳﺘﺨﺪاﻣﮫ ﻻﺣﻘﺎ .ﯾﺘﻢ اﻟﺘﺼﺮﯾﺢ ﺑﮭﺬا اﻟﻤﺘﻐﯿﺮ ﻋﻠﻰ أﻧﮫ staticﻋﻨﺪ ﺗﻌﺮﯾﻔﮫ ،ﻛﻤﺎ ﯾﻠﻲ:
ﻣﻠﻒ :ex10
><!DOCTYPE html
><html><body><h2>Static variables inside functions in PHP</h2
<?php
)(function func4
{
;static $x = 0
;echo $x
;">echo "<br
;$x++
}
;)( func4
;)( func4
;)( func4
>?
></body></html
وﯾﻜﻮن ﻧﺎﺗﺞ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﻛﻤﺎ ﯾﻠﻲ:
ﻓﻜﻤﺎ ﺗﻼﺣﻆ ،ﺗﻢ اﻻﺣﺘﻔﺎظ ﺑﺎﻟﻘﯿﻤﺔ اﻟﻘﺪﯾﻤﺔ ﺛﻢ أﺿﺎف اﻟﻘﯿﻤﺔ اﻟﺠﺪﯾﺪة إﻟﯿﮭﺎ ،ﻓﻜﺎﻧﺖ اﻟﺰﯾﺎدة ﺗﻈﮭﺮ ﻓﻲ ﻛﻞ ﻣﺮة .ﻧﻔﺬ ﻋﺰﯾﺰي اﻟﺪارس ،اﻟﻤﺜﺎل
اﻟﺴﺎﺑﻖ ﻣﻦ ﻏﯿﺮ اﻟﻜﻠﻤﺔ اﻟﻤﻔﺘﺎﺣﯿﺔ ،staticﺛﻢ ﻻﺣﻆ اﻟﻔﺮق.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 27
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺮاﺑﻊ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 28
ﻣﻘﺪﻣﺔ
ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ،databaseھﻲ ﻋﺒﺎرة ﻋﻦ ﺗﺠﻤﯿﻊ ﻣﻨﻈﻢ ﻣﻦ اﻟﺒﯿﺎﻧﺎت ،واﻟﺘﻲ ﻗﺪ ﺗﻜﻮن ﻋﻠﻰ ﺷﻜﻞ ﺟﺪاول ،tablesأو اﺳﺘﻌﻼﻣﺎت
،queriesأو ﺗﻘﺎرﯾﺮ ،reportsأو ﺣﺘﻰ ﻣﺨﻄﻄﺎت .schemasﯾﺘﻢ ﺗﻨﻈﯿﻢ اﻟﺒﯿﺎﻧﺎت ﺑﺤﯿﺚ ﺗﻌﻤﻞ ﻋﻠﻰ ﻧﻤﺬﺟﺔ ﺑﻌﺾ اﻟﺘﻄﺒﯿﻘﺎت اﻟﺤﯿﺔ
ﻣﺜﻞ اﻟﻤﺴﺎﻋﺪة ﻓﻲ ﺣﺠﺰ ﻏﺮﻓﺔ ﻓﺎرﻏﺔ ﻓﻲ ﻓﻨﺪق .ﻓﻘﺪ ﺗﺸﻜﻞ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺟﺰءاً أﺳﺎﺳﯿﺎ ً ﻣﻦ ﻧﻈﺎم اﺗﺼﺎﻻت ،أو ﻧﻈﺎم ﺑﻨﻜﻲ ،أو أﻟﻌﺎب
ﺣﺎﺳﻮب ،أو ﺣﺘﻰ أﯾﺔ ﺟﮭﺎز إﻟﻜﺘﺮوﻧﻲ .إن ﻧﻈﺎم إدارة ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ) ،database management system (DBMSھﻮ ﻋﺒﺎرة
ﻋﻦ ﺗﻄﺒﯿﻖ ﺑﺮﻣﺠﻲ softwareﺣﺎﺳﻮﺑﻲ ،واﻟﺬي ﯾﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺴﺘﺨﺪم أو ﺗﻄﺒﯿﻘﺎت أو ﻧﻔﺲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﻦ أﺟﻞ ﺟﻠﺐ وﺗﺤﻠﯿﻞ
اﻟﺒﯿﺎﻧﺎت .ﯾﺘﻢ ﺗﺼﻤﯿﻢ ﻧﻈﺎم ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت ﻋﺎم اﻟﻤﮭﻤﺎت ) ،(general-purpose DBMSﻣﻦ أﺟﻞ اﻟﻘﯿﺎم ﺑﻤﮭﻤﺎت ﻋﺎﻣﺔ ﻣﺜﻞ ﺗﻌﺮﯾﻒ
ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ،إﻧﺸﺎء ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ،اﻻﺳﺘﻌﻼم ﻋﻦ ﻣﺤﺘﻮﯾﺎت ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ،ﺗﺤﺪﯾﺚ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ،ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ إدارة ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت.
ﺑﻌﺾ اﻷﻣﺜﻠﺔ ﻋﻠﻰ ﻧﻈﻢ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت MySQL, PostgreSQL, Oracle, MS SQL Server, Sybase, SAP HANA,
.IBM DB2
ﻟﯿﺲ ﺑﺎﻟﻀﺮورة أن ﺗﻌﻤﻞ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﻣﻌﯿﻨﺔ ﻋﻠﻰ ﺟﻤﯿﻊ ﻧﻈﻢ إدارة ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ،DBMSوﻟﻜﻦ ﯾﻤﻜﻦ اﺳﺘﺨﺪام ﻣﻌﺎﯾﯿﺮ ﻋﺎﻟﻤﯿﺔ
ﻟﻠﺘﻮاﺻﻞ ﻣﻊ ﺗﻠﻚ اﻟﻨﻈﻢ وﻓﯿﻤﺎ ﺑﯿﻨﮭﺎ أﯾﻀﺎ ﻣﺜﻞ ﻣﻌﺎﯾﯿﺮ .SQL, JDBC, ODBCﺑﺎﻟﺘﺎﻟﻲ ﻧﺴﻤﺢ ﻷﯾﺔ ﺗﻄﺒﯿﻖ أن ﯾﺘﻮاﺻﻞ ﻣﻊ ﻗﺎﻋﺪة
اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﻏﯿﺮ ﻣﻌﺮﻓﺔ اﻟﻜﺜﯿﺮ ﻋﻦ ﺗﺼﻤﯿﻤﮭﺎ أو ﻧﻮﻋﮭﺎ .ﻣﻦ أﻛﺜﺮ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﺷﮭﺮة ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت اﻟﻌﻼﺋﻘﯿﺔ Relational
DBMSأو ) ،(RDBMSواﻟﺬي ﯾﻌﺘﺒﺮ MySQLأﺷﮭﺮھﺎ ﺧﺼﻮﺻﺎ ﻓﻲ ﺗﻄﺒﯿﻘﺎت اﻟﻮﯾﺐ واﻻﻧﺘﺮﻧﺖ.
اﻷھﺪاف
.1أن ﺗﺘﻌﺮف ﻋﻠﻰ ﺑﯿﺌﺔ ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت ،MySQLوطﺮﯾﻘﺔ ﺗﺸﻐﯿﻠﮭﺎ واﻟﻌﻤﻞ ﻋﻠﯿﮭﺎ.
.2أن ﺗﻌﻤﻞ ﻋﻠﻰ إﻧﺸﺎء ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﺧﺎﺻﺔ ﺑﺎﻟﺰﺑﺎﺋﻦ ﻓﻲ ﺑﯿﺌﺔ ،MySQLوﺗﻨﺸﺊ ﺟﺪول ﯾﺤﻮي ﺑﯿﺎﻧﺎﺗﮭﻢ اﻟﺸﺨﺼﯿﺔ وآﺧﺮ ﯾﺤﻮي
طﻠﺒﯿﺎﺗﮭﻢ.
.3أن ﺗﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔ اﺳﺘﻌﺮاض ﻛﺎﻓﺔ ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪول أو أن ﺗﺨﺘﺎر ﺟﺰء ﻣﻨﮭﺎ.
.4أن ﺗﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔ اﻟﺮﺑﻂ ﺑﯿﻦ اﻟﺠﺪوﻟﯿﻦ ﻓﻲ ﻧﻔﺲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ،ﺑﺤﯿﺚ ﺗﺮﺑﻂ ﻛﻞ زﺑﻮن ﻓﻲ اﻟﺠﺪول اﻷول ﺑﻄﻠﺒﯿﺎﺗﮫ ﻓﻲ
اﻟﺠﺪول اﻟﺜﺎﻧﻲ.
ﺧﻄﻮات ﻋﻤﻞ اﻟﺠﺰء اﻷول
ﺳﯿﺘﻢ ﻓﻲ ھﺬا اﻟﺠﺰء اﻟﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔ اﻟﺪﺧﻮل إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .ﺷ ّﻐﻞ ،ﻋﺰﯾﺰي اﻟﺪارس ،ﺷﺎﺷﺔ ،DOSﺛﻢ أدﺧﻞ إﻟﻰ ﻣﺠﻠﺪ bin
اﻟﻤﻮﺟﻮد ﻓﻲ ﻣﺠﻠﺪ ،mysqlواﻟﻤﻮﺟﻮد ﻓﻲ ﻣﺠﻠﺪ xamppﻋﻦ طﺮﯾﻖ أﻣﺮ DOSوھﻮ .CDﻣﻦ ھﻨﺎ ﯾﻤﻜﻦ إطﻼق ﻋﻤﻞ MySQL
ﻣﻦ ﺧﻼل اﻷﻣﺮ ،mysql –u root –pواﻟﺬي ﯾﺤﺪد اﺳﻢ اﻟﻤﺴﺘﺨﺪم " ،"rootوﻛﻠﻤﺔ اﻟﻤﺮور .ﻋﻨﺪﻣﺎ ﯾﻄﻠﺐ ﻛﻠﻤﺔ اﻟﻤﺮور ،ﻻ ﻧﻜﺘﺐ
ﺷﻲء ﻟﻌﺪم وﺟﻮد ﻛﻠﻤﺔ ﻣﺮور أﺻﻼ ﻋﻠﻰ اﻟﻤﺴﺘﺨﺪم .rootاﻵن ﯾﻤﻜﻨﻚ اﻟﺒﺪء ﺑﺈﻋﻄﺎء أو ﻛﺘﺎﺑﺔ أواﻣﺮ sqlﻓﻲ ﻧﺎﻓﺬة .mysql
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 29
ﻧﺮﯾﺪ إﻧﺸﺎء ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﻟﻠﺰﺑﺎﺋﻦ ﺑﺄﺳﻢ .customersﯾﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻷﻣﺮ ; .CREATE DATABASE customersوﺗﻜﻮن
اﻟﻨﺘﯿﺠﺔ إﯾﺠﺎﺑﺎ ً إن ﺗﻢ إﻧﺸﺎء ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .ﻋﻨﺪھﺎ ﯾﻤﻜﻦ اﻟﺒﺪء ﺑﺎﺳﺘﺨﺪاﻣﮭﺎ ﻣﻦ ﺧﻼل اﻷﻣﺮ ; .USE customersﻓﯿﻤﻜﻦ إﻧﺸﺎء ﺟﺪول
ﺑﺄﺳﻢ ،Personsوﯾﺤﺘﻮي ﻋﻠﻰ ﺧﻤﺴﺔ أﻋﻤﺪة columnsﻛﻤﺎ ﯾﻠﻲ:
اﻟﻌﻤﻮد اﻷول ﻣﻌ ﱢﺮف identifierﻟﻠﺸﺨﺺ personﺑﻌﻨﻮان ،p_idﻣﻦ ﻧﻮع ﻋﺪد ﺻﺤﯿﺢ ،intوﯾﺠﺐ أن ﻻ ﺗﻜﻮن ﻗﯿﻤﺘﮫ .1
ﻓﺮاغ ،وھﻮ ﻣﻔﺘﺎح أﺳﺎﺳﻲ .PRIMARY KEY
اﻟﻌﻤﻮد اﻟﺜﺎﻧﻲ أﺳﻢ اﻟﻌﺎﺋﻠﺔ أو اﻷﺳﻢ اﻷﺧﯿﺮ ﻟﻠﺸﺨﺺ ﺑﻌﻨﻮان ،LastNameﻣﻦ ﻧﻮع ﺣﺮوف ﻣﺘﻐﯿﺮة ،varcharوﯾﺠﺐ أن ﻻ .2
ﺗﻜﻮن ﻗﯿﻤﺘﮫ ﻓﺮاغ ،وﺑﺤ ّﺪ أﻗﺼﻰ 255ﺣﺮف.
اﻟﻌﻤﻮد اﻟﺜﺎﻟﺚ اﻷﺳﻢ اﻷول ﻟﻠﺸﺨﺺ ﺑﻌﻨﻮان ،FirstNameﻣﻦ ﻧﻮع ﺣﺮوف ﻣﺘﻐﯿﺮة ،varcharوﺑﺤ ّﺪ أﻗﺼﻰ 255ﺣﺮف. .3
اﻟﻌﻤﻮد اﻟﺮاﺑﻊ ﻟﻠﻌﻨﻮان اﻟﺒﺮﯾﺪي ،Addressﻣﻦ ﻧﻮع ﺣﺮوف ﻣﺘﻐﯿﺮة ،varcharوﺑﺤ ّﺪ أﻗﺼﻰ 255ﺣﺮف. .4
اﻟﻌﻤﻮد اﻟﺨﺎﻣﺲ ﻟﻠﻤﺪﯾﻨﺔ ،Cityﻣﻦ ﻧﻮع ﺣﺮوف ﻣﺘﻐﯿﺮة ،varcharوﺑﺤ ّﺪ أﻗﺼﻰ 255ﺣﺮف. .5
ّ
ﺻﻒ .ﻛﻞ ﺻﻒ ﯾﺤﻤﻞ ﻗﯿﻢ اﻷﻋﻤﺪة اﻟﺴﺎﻟﻔﺔ اﻟﺬﻛﺮ اﻟﺘﻲ ﺗﻢ ّ
ﺻﻒ ﯾﻠﯿﮫ اﻵن ﯾﻤﻜﻦ إدﺧﺎل اﻟﻘﯿﻢ إﻟﻰ اﻟﺠﺪول ﺑﺎﺳﺘﺨﺪام اﻟﺼﻔﻮف ،rows
إﻧﺸﺎؤھﺎ ﻓﻲ اﻟﺨﻄﻮة اﻟﺴﺎﺑﻘﺔ .ھﺬا ﯾﺘﻢ ﻣﻦ ﺧﻼل اﻷﻣﺮ ،INSERT INTO Personsواﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ إدﺧﺎل ﻗﯿﻢ ﻟﻸﻋﻤﺪة ﺑﻨﻔﺲ
ﺗﺮﺗﯿﺐ اﻷﻋﻤﺪة ،ﺣﯿﺚ ﺗﺄﺧﺬ اﻟﻘﯿﻢ VALUESﺑﺎﻟﺸﺮوط اﻟﻤﺤﺪدة ﻣﺴﺒﻘﺎ ﻋﻨﺪ إﻧﺸﺎء اﻟﺠﺪول .ﯾﺘﻢ ﺗﻜﺮار ﻧﻔﺲ اﻷﻣﺮ ﻟﻜﻞ زﺑﻮن ،وﻟﻜﻦ
ﺑﺎﺧﺘﻼف اﻟﻘﯿﻢ طﺒﻌﺎ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 30
ﻣﻦ أﺟﻞ اﺳﺘﻌﺮاض ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪول ،ﻧﺴﺘﺨﺪم أﻣﺮ SQLاﻟﺘﺎﻟﻲ ،SELECT * FROM Persons; :ﻓﻌﻼﻣﺔ اﻟﻨﺠﻤﺔ ﺗﺸﯿﺮ إﻟﻰ
ﺟﻤﯿﻊ ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪول.
ﻻﺳﺘﻌﺮاض ﺟﺰء ﻣﻦ ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪول وﻟﯿﺲ ﺟﻤﯿﻊ اﻟﻤﺤﺘﻮﯾﺎت ،ﻧﺨﺘﺎر ﻣﺤﺘﻮﯾﺎت اﻷﻋﻤﺪة اﻟﺘﻲ ﻧﺮﯾﺪ ﻋﺮﺿﮭﺎ ﻟﻜﻞ زﺑﻮن .ﻓﻤﺜﻼ إن
أردﻧﺎ أن ﻧﻌﺮف ﻣﻌﺮف اﻟﺰﺑﻮن ،p_idواﺳﻤﮫ اﻷﺧﯿﺮ ﻓﻘﻂ ،ﻧﺴﺘﺨﺪم اﻷﻣﺮ ;.SELECT p_id, LastName FROM Persons
ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أن ﺿﻊ ﺷﺮط ﻋﻠﻰ اﻻﺧﺘﯿﺎرات ،ﻓﻤﺜﻼ ﻻﺳﺘﻌﺮاض ﻛﻞ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﺘﻌﻠﻖ ﺑﺸﺨﺺ ﻣﻌﯿﻦ ،ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻷﻣﺮ اﻟﺘﺎﻟﻲ:
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 31
ﺑﻨﻔﺲ اﻟﻄﺮﯾﻘﺔ اﻟﺴﺎﺑﻘﺔ ،أدﺧﻞ اﻟﻘﯿﻢ اﻟﺘﺎﻟﯿﺔ إﻟﻰ اﻟﺠﺪول اﻟﺠﺪﯾﺪ.
ﯾﻤﻜﻨﻚ أﯾﻀﺎ اﺳﺘﻌﺮاض ﺑﻌﺾ ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪول ،ﻣﺜﻼ رﻗﻢ اﻟﻄﻠﺒﺔ ورﻗﻢ اﻟﺰﺑﻮن ﻓﻘﻂ ،ﻟﺠﻤﯿﻊ اﻟﺰﺑﺎﺋﻦ ،ﻛﻤﺎ ﯾﻠﻲ:
أو أن ﺗﺴﺘﻌﺮض ﺟﻤﯿﻊ اﻟﻄﻠﺒﺎت اﻟﺘﻲ ﺗﺘﻌﻠﻖ ﺑﺰﺑﻮن ﻣﻌﯿﻦ ﻣﻦ ﺧﻼل رﻗﻢ اﻟﺘﻌﺮﯾﻒ )اﻟﻤﻌﺮﱢ ف(:
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 32
ﻛﻤﺎ ﯾﻤﻜﻨﻚ اﺳﺘﻌﺮاض ﺑﻌﺾ ﻣﺤﺘﻮﯾﺎت اﻟﺠﺪوﻟﯿﻦ ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ .ﺗﺬﻛﺮ ﻋﺰﯾﺰي اﻟﺪارس ،أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺮﺑﻂ اﻟﺠﺪوﻟﯿﻦ ﻣﻦ ﺧﻼل اﻟﻤﻔﺘﺎح
اﻷﺟﻨﺒﻲ .FOREIGN KEYﻓﯿﻤﻜﻦ أن ﻧﺴﺘﻌﺮض أﺳﻢ اﻟﻌﺎﺋﻠﺔ ﻟﺰﺑﻮن ﻣﻦ ﺟﺪول ،Personsورﻗﻢ اﻟﻄﻠﺒﯿﺔ ﻣﻦ اﻟﺠﺪول ،Orders
ﺑﺸﺮط أن ﯾﺘﺴﺎوى اﻟﺮﻗﻢ اﻟﻤﻌﺮف ) (p_idﻓﻲ ﻛﻼ اﻟﺠﺪوﻟﯿﻦ .ﻻﺳﺘﻌﺮاض طﻠﺒﯿﺎت زﺑﻮن ﻣﻌﯿﻦ ﻧﺸﺘﺮط أن ﯾﻜﻮن اﻟﺮﻗﻢ اﻟﻤﻌﺮف ،p_id
ﺻﻔﺮ.
ﺑﻌﺪ اﻻﻧﺘﮭﺎء ﻣﻦ اﻟﻌﻤﻞ ﻋﻠﻰ ،MySQLﯾﻤﻜﻨﻚ اﻹﻧﮭﺎء ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ،quitﻛﻤﺎ ﯾﻠﻲ:
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 33
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺨﺎﻣﺲ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 34
ﻣﻘﺪﻣﺔ
ﻋﺰﯾﺰي اﻟﺪارس ،ﻻ ﯾﻜﺎد ﯾﺨﻠﻮ ﻣﻮﻗﻊ وﯾﺐ ﻣﺨﺘﺺ ﺑﺎﻟﺘﺴﻮق online shoppingﻣﻦ ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت ،وﻛﺜﯿﺮ ﻣﻦ ﻣﻮاﻗﻊ اﻟﺸﺮﻛﺎت
اﻟﻜﺒﺮى ،ﺗﺴﺘﺨﺪم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺸﻜﻞ ﻣﻠﻔﺖ .ﻧﺎھﯿﻚ ﻋﻦ ﻣﻮاﻗﻊ اﻟﺘﻮاﺻﻞ اﻻﺟﺘﻤﺎﻋﻲ اﻟﺘﻲ ﺗﻌﺘﻤﺪ ﺑﺸﻜﻞ ﻛﻠﻲ ﺗﻘﺮﯾﺒﺎ ﻋﻠﻰ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت.
وﻟﻜﻦ ﺳ ّﺮ ﻗﻮة ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﯾﻜﻤﻦ ﻓﻲ إﻧﺸﺎء واﺟﮭﺔ رﺳﻮﻣﺎت ﺗﺨﺎطﺒﯿﺔ GUIﻣﻊ اﻟﻤﺴﺘﺨﺪم ﻟﯿﺴﮭﻞ اﻟﺘﻌﺎﻣﻞ ﻣﺎ ﺑﯿﻦ اﻟﻤﺴﺘﺨﺪم وﻗﻮاﻋﺪ
اﻟﺒﯿﺎﻧﺎت .وھﻨﺎ ﯾﺄﺗﻲ دور ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ ﻓﻲ ﺗﻘﺪﯾﻢ واﺟﮭﺔ اﻟﺘﺨﺎطﺐ GUIﺗﺴﮭﯿﻞ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺤﺮك ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Database
.Engineﻓﻲ ھﺬه اﻟﺘﺠﺮﺑﺔ ،ﺳﺘﻌﻤﻞ ﺑﻤﺴﺎﻋﺪة ﻣﺸﺮﻓﻚ اﻷﻛﺎدﯾﻤﻲ وﻓﻨﻲ اﻟﻤﺨﺘﺒﺮ ،ﻋﻠﻰ إﻧﺸﺎء واﺟﮭﺖ ﺗﺨﺎطﺐ GUIﻣﻊ اﻟﻤﺴﺘﺨﺪم ﻓﻲ
اﻟﻤﺘﺼﻔﺢ ،Browserﻣﻦ ﺧﻼل ﻟﻐﺔ ﺑﺮﻣﺠﺔ اﻟﻮﯾﺐ ،PHPﺑﺤﯿﺚ ﯾﻜﻮن اﻟﻤﺴﺘﺨﺪم ﻗﺎدرا ﻋﻠﻰ إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو
ﺣﺬف ﺑﯿﺎﻧﺎت ﻣﻦ ﺗﻠﻚ اﻟﻘﺎﻋﺪة.
اﻷھﺪاف
.1أن ﺗﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔ رﺑﻂ ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ PHPﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .MySQL
.2أن ﺗﺘﻌﺮف ﻋﻠﻰ اﻟﺪوال اﻟﺠﺎھﺰة ﻓﻲ ﻟﻐﺔ ،PHPواﻟﺘﻲ ﺗﺨﺘﺺ ﺑﻤﻌﺎﻟﺠﺔ ﻗﻮاﻋﺪ ﺑﯿﺎﻧﺎت .MySQL
.3أن ﺗﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔﺟﻠﺐ fetchﺑﯿﺎﻧﺎت ﻣﻌﯿﻨﺔ ﺑﻮاﺳﻄﺔ ﻟﻐﺔ PHPﻣﻦ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﺗﻢ إﻧﺸﺎﺋﮭﺎ ﻣﺴﺒﻘﺎ ﻓﻲ .MySQL
.4أن ﺗﻌﻤﻞ ﻋﻠﻰ إدﺧﺎل ﺑﯿﺎﻧﺎت إﻟﻰ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﺗﻢ إﻧﺸﺎﺋﮭﺎ ﻣﺴﺒﻘﺎ ﻣﻦ ﺧﻼل ﺻﻔﺤﺔ .PHP
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 35
;' >echo '<br><b>Connection Closed!</b><br
>?
ﻣﻼﺣﻈﺔ :ﻋﺰﯾﺰي اﻟﺪارس ،ﯾﺠﺐ أن ﯾﻜﻮن ﻛﻞ ﻣﻦ MySQLو Apacheﻓﻲ ﺣﺎﻟﺔ اﻟﺘﺸﻐﯿﻞ ﻣﻦ أﺟﻞ ﺗﻨﻔﯿﺬ أﻣﺜﻠﺔ ھﺬه اﻟﺘﺠﺮﺑﺔ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 36
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql_statement = 'SELECT P_Id, LastName, Address FROM persons';
mysql_select_db('customers');
$retval = mysql_query( $sql_statement, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "<br> Person ID :{$row['P_Id']} ";
echo "<br> Last Name : {$row['LastName']} ";
echo "<br> Address : {$row['Address']} ";
echo "<br> ========================= <br> ";
}
echo "<br> Data fetched successfully\n";
mysql_close($conn);
echo "<br> Connection closed \n";
?>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 37
{
;))(die('Could not connect: ' . mysql_error
}
$sql_statement = 'INSERT INTO Persons (P_Id, LastName, FirstName, Address, City) VALUES (4, "Ameena",
;')""Mahmoud", "Yatta 3", "Hebron
;)'mysql_select_db('customers
;) $retval = mysql_query( $sql_statement, $conn
) if(! $retval
{
;))(die('Could not enter data: ' . mysql_error
}
;"echo "<br> Data entered successfully\n
;)mysql_close($conn
;"echo "<br> Connection Closed \n
>?
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 38
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$id1 = $_POST['id1'];
$LN = $_POST['LN'];
$FN = $_POST['FN'];
$C = $_POST['C'];
$A = $_POST['A'];
$sql="INSERT INTO Persons(P_Id,LastName,FirstName,City,Address) VALUES('$id1','$LN','$FN','$C','$A')";
mysql_select_db('customers');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not enter data: ' . mysql_error());
}
echo "<br> Entered data successfully\n";
mysql_close($conn);
echo "<br> Connection closed\n";
}
else
{
?>
<form method="post" action="<?php $_PHP_SELF ?>">
<table width="400" border="0" cellspacing="1" cellpadding="2">
<tr>
<td width="100">Person Id</td>
<td><input name="id1" type="text" id="id1"></td>
</tr>
<tr>
<td width="100">Last Name</td>
<td><input name="LN" type="text" id="LN"></td>
</tr>
<tr>
<td width="100">First Name</td>
<td><input name="FN" type="text" id="FN"></td>
</tr>
<tr>
<td width="100">Address</td>
<td><input name="A" type="text" id="C"></td>
</tr>
<tr>
<td width="100">City</td>
<td><input name="C" type="text" id="A"></td>
</tr>
<tr>
<td width="100"> </td>
<td> </td>
</tr>
<tr>
<td width="100"> </td>
<td>
<input name="add" type="submit" id="add" value="Add Person">
</td>
</tr>
</table>
</form>
<?php
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 39
}
?>
</body></html>
ﺧﻄﻮات ﻋﻤﻞ اﻟﺠﺰء اﻟﺨﺎﻣﺲ
. ﺳﯿﺘﻢ ﺗﻄﺒﯿﻘﮫ ﻧﻔﺴﮫ ھﻨﺎ أﯾﻀﺎ، واﻟﻤﺒﺪأ اﻟﺬي ﺗﻢ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ،ﻻ دوال ﺟﺪﯾﺪة ھﻨﺎ
<html>
<head>
<title>Delete a Record from MySQL Database</title>
</head>
<body>
<?php
if(isset($_POST['delete'])) {
$dbhost = 'localhost:3306';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$id1 = $_POST['id1'];
$sql = "DELETE FROM Persons WHERE P_Id = $id1" ;
mysql_select_db('customers');
$retval = mysql_query( $sql, $conn );
echo "<br> $retval\n";
if(! $retval )
{
die('Could not delete data: ' . mysql_error());
}
else
echo "<br> Data deleted successfully\n";
mysql_close($conn);
}
else {
?>
<form method = "post" action = "<?php $_PHP_SELF ?>">
<table width = "400" border = "0" cellspacing = "1" cellpadding = "2">
<tr>
<td width = "100">Person ID</td>
<td><input name = "id1" type = "text" id = "id1"></td>
</tr>
<tr>
<td width = "100"> </td>
<td> </td>
</tr>
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 40
<tr>
<td width = "100"> </td>
<td>
<input name = "delete" type = "submit" id = "delete" value = "Delete">
</td>
</tr>
</table>
</form>
<?php
}
?>
</body>
</html>
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 41
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺴﺎدس
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 42
ﻣﻘﺪﻣﺔ
اﻟﺮﺑﻂ ﻣﻊ اﻹﺟﺮاءات ﻋﻦ ﺑﻌﺪ ) ،Remote Procedure Call (RPCھﻲ ﺗﻘﻨﯿﺔ اﺗﺼﺎل ﺳﮭﻠﺔ وﺑﺴﯿﻄﺔ ﺗﻤﻜﻦ اﻟﻤﺒﺮﻣﺞ ﻣﻦ اﻻﺗﺼﺎل
ﺑﯿﻦ ﺧﺎدم وﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺰﺑﺎﺋﻦ ﯾﻌﻤﻠﻮن ﻋﻠﻰ ﻣﻨﺼﺎت platformﻣﺨﺘﻠﻔﺔ )ﻧﻈﻢ ﺗﺸﻐﯿﻞ ﻣﺨﺘﻠﻔﺔ( ﺑﺤﯿﺚ ﺗﻮﻓﺮ ﺑﯿﺌﺔ ﻣﺤﻮﺳﺒﺔ ﻣﻮزﻋﺔ
ﻣﺘﻌﺪدة اﻟﻤﻨﺼﺎت ) (Cross–Platform Distributed Computingﺑﺎﻻﻋﺘﻤﺎد ﻋﻠﻰ ﺑﺮوﺗﻮﻛﻮل ﻧﻘﻞ اﻟﻨﺼﻮص ﻓﻲ اﻻﻧﺘﺮﻧﺖ
.HTTPوﺑﻤﺎ أن ﻟﻐﺔ PHPﺗﺴﺘﺨﺪم ﺑﺮوﺗﻮﻛﻮل HTTPﻟﻠﻨﻘﻞ ،وﻟﻐﺔ XMLﻟﻠﺸﯿﻔﺮة ،encodingﻓﺈن ھﺬا ﯾﺴﻤﺢ ﻧﻘﻞ ﺗﺮاﻛﯿﺐ ﺑﯿﺎﻧﺎت
ﻣﻌﻘﺪة complex data structuresﺑﯿﻦ اﻟﻌﻘﺪ ﻓﻲ اﻟﺸﺒﻜﺔ وھﺬه اﻟﻄﺮﯾﻘﺔ ﺗﺴﻤﻰ XML-RPCﻓﻲ ﻟﻐﺔ .PHPﺑﺎﻟﺘﺎﻟﻲ ﯾﻤﻜﻦ ﻟﺰﺑﻮن
clientﯾﻌﻤﻞ ﻋﻠﻰ ﺟﮭﺎزه ﻣﻦ ﻧﻮع ،Dellﺑﻤﻨﺼﺔ ﻧﻈﺎم وﯾﻨﺪوز ،أن ﯾﺘﺼﻞ ﻣﻊ ﺧﺎدم ﯾﻌﻤﻞ ﻋﻠﻰ ﺟﮭﺎز ﻧﻮع ،HPﺑﻤﻨﺼﺔ ﻧﻈﺎم ﻟﯿﻨﻮﻛﺲ
،Linuxوﯾﺘﺒﺎدل اﻟﺒﯿﺎﻧﺎت ﻣﻊ اﻟﺨﺎدم أﯾﻀﺎ ﺑﻔﻀﻞ وﺳﯿﻠﺔ اﻻﺗﺼﺎل XML-RPCﺑﺎﺳﺘﺨﺪام ﺑﺮوﺗﻮﻛﻮل .HTTPوﻟﻜﻦ ھﺬا ﯾﺘﻄﻠﺐ
وﺟﻮد ﺷﺒﻜﺔ ﺗﺪﻋﻢ ﺑﺮوﺗﻮﻛﻮل اﻻﺗﺼﺎل HTTPﻣﺜﻞ اﻻﻧﺘﺮﻧﺖ أو اﻻﻧﺘﺮاﻧﺖ .Internet/Intranet
اﻷھﺪاف
أن ﺗﺘﻌﺮف ﻋﻠﻰ ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل RPCﻓﻲ ﻟﻐﺔ PHPواﻟﺘﻲ ﺗﻐﻠﻔﮭﺎ ﺑﻠﻐﺔ ،XMLأي .XML-RPC .1
أن ﺗﺘﻌﺮف ﻋﻠﻰ اﻟﺪوال اﻟﻤﻜﺘﻮﺑﺔ ﺑﻠﻐﺔ PHPواﻟﺘﻲ ﺗﺴﮭﻞ ﻋﻠﻰ اﻟﻤﺒﺮﻣﺞ اﻻﺗﺼﺎل ﺑﺘﻘﻨﯿﺔ .XML-RPC .2
أن ﺗﻜﺘﺐ ﺑﻠﻐﺔ PHPﺑﺮﻧﺎﻣﺞ ﯾﻤﺜﻞ ﺧﺎدم وﺑﺮﻧﺎﻣﺞ آﺧﺮ ﯾﻤﺜﻞ زﺑﻮن ،ﺗﻨﻔﺬ اﻟﺒﺮﻧﺎﻣﺠﯿﻦ ﻣﻦ ﺧﻼل ﺟﮭﺎز ّ
ي ﺣﺎﺳﻮب اﺛﻨﯿﻦ ،وﺳﯿﻠﺔ .3
اﻻﺗﺼﺎل ﺑﯿﻨﮭﻤﺎ ھﻲ .XML-RPC
أن ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻄﻮﯾﺮ اﻟﺒﺮﻧﺎﻣﺠﯿﻦ اﻟﺴﺎﺑﻘﯿﻦ ﺑﺤﯿﺚ ﯾﻘﻮم اﻟﺨﺎدم ﺑﺎﻟﺮﺑﻂ ﻣﻊ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﻟﯿﻠﺒﻲ اﺣﺘﯿﺎﺟﺎت طﻠﺐ اﻟﺰﺑﻮن. .4
ﯾﻤﺜﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﺧﺎدﻣﺎ ﺑﺴﯿﻄﺎ ﯾﻌﻤﻞ ﻋﻠﻰ اﻟﺮد ﻋﻠﻰ اﺳﺘﻔﺴﺎر ﻣﻦ زﺑﻮن .ﻓﯿﺴﺘﻘﺒﻞ رﻗﻤﺎ ﻣﻦ اﻟﺰﺑﻮن وﯾﻘﻮم ﺑﻀﺮﺑﮫ ﺑﺎﻟﺮﻗﻢ " "8ﺛﻢ ﯾﻌﯿﺪ
اﻟﻨﺎﺗﺞ إﻟﻰ ﺷﺎﺷﺔ اﻟﺰﺑﻮن.
<?php
$request_xml = file_get_contents("php://input"); #inputstream
)function databases($method_name, $args, $app_data
{
;]$username = $args[0
;]$password = $args[1
$x1 ;]= $args[2
/*Perform authentication and authorization here. If failed return a fault code or exit*/
/* You may connect to databases and retrieve data here */
;return $x1*6
}
;)($xmlrpc_server = xmlrpc_server_create
;)"xmlrpc_server_register_method($xmlrpc_server, "databases", "databases
;)'header('Content-Type: text/xml
print
;))(xmlrpc_server_call_method($xmlrpc_server, $request_xml, array
>?
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 43
ﺗﻢ إﻧﺸﺎء اﻟﺪاﻟﺔ اﻟﺘﻲ ﺳﯿﻘﻮم اﻟﺰﺑﻮن ﺑﻤﻨﺎداﺗﮭﺎ وھﻲ ﺑﺄﺳﻢ ،databasesﺣﯿﺚ ﯾﺘﻢ ﺗﻤﺮﯾﺮ ﺛﻼث ﻣﺘﻐﯿﺮات ﻟﮭﺎ ،ﯾﻤﺜﻞ اﻟﻤﺘﻐﯿﺮ اﻷول أﺳﻢ
اﻟﺪاﻟﺔ ،method_nameواﻟﻤﺘﻐﯿﺮ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﻣﺼﻔﻮﻓﺔ ﻣﻦ اﻟﻤﺘﻐﯿﺮات ﺗﺤﻤﻞ أﺳﻢ اﻟﻤﺴﺘﺨﺪم ،usernameوﻛﻠﻤﺔ اﻟﺴﺮ
،passwordواﻟﻤﺘﻐﯿﺮ اﻟﺜﺎﻟﺚ ﯾﺤﻤﻞ اﻟﺮﻗﻢ اﻟﺬي ﺳﯿﺘﻢ ﺿﺮﺑﮫ ب "."8
ﺗﺴﮭﻞ ﻟﻐﺔ PHPﻋﻠﻰ اﻟﻤﺒﺮﻣﺞ إﻧﺸﺎء ﺧﺎدم ﻣﻦ ﺧﻼل اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ )( xmlrpc_server_createواﻟﺘﻲ ﺗﻌﯿﺪ ﺧﺎدم ﻋﻠﻰ ﺷﻜﻞ
ﻣﺼﺪر .resourceوﺑﻤﺎ أﻧﻨﺎ ﻧﺴﺘﺨﺪم ﺑﺮوﺗﻮﻛﻮل HTTPﻟﻠﻨﻘﻞ ،ﻓﺈن طﺮق ھﺬا اﻟﺒﺮوﺗﻮﻛﻮل ھﻲ اﻟﺘﻲ ﺳﻮف ﺗﺴﺘﺨﺪم ،وﻣﻨﮭﺎ getﻓﻲ
ﺣﺎﻟﺔ اﻟﺨﺎدم ﻻﺳﺘﻘﺒﺎل اﻟﻄﻠﺐ requestﻣﻦ ﺧﻼل اﻟﺪاﻟﺔ ،file_get_contentsوﻛﺬﻟﻚ postﻓﻲ ﺣﺎﻟﺔ اﻟﺰﺑﻮن ﻣﻦ اﺟﻞ إرﺳﺎل اﻟﻄﻠﺐ
.requestﻟﺬﻟﻚ ﺗﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﺑﺄﺳﻢ $request_xmlﯾﻌﻤﻞ ﻋﻠﻰ ﺗﺤﺪﯾﺪ getﻻﺳﺘﻘﺒﺎل اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﺧﻼل اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ
xmlrpc_encode_requestواﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﻗﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﻤﺮﺳﻠﺔ وﻓﻚ ﺷﻔﺮة XMLﻟﻠﺤﺼﻮل ﻋﻠﻰ ﺗﻠﻚ اﻟﺒﯿﺎﻧﺎت.
ﻣﻦ أﺟﻞ اﻟﺘﻌﺮف ﻋﻠﻰ اﻟﺪاﻟﺔ اﻟﺘﻲ ﺗﻨﻔﺬ ﻋﻦ ﺑﻌﺪ ،ﻻ ﺑ ّﺪ ﻣﻦ ﺗﺴﺠﯿﻞ ﺗﻠﻚ اﻟﺪاﻟﺔ ﻓﻲ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت اﻟﺨﺎدم ﻣﻦ ﺧﻼل اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ
;) xmlrpc_server_register_method(resource $server, string $method_name, string $functionواﻟﺘﻲ ﺗﺄﺧﺬ
ﺛﻼﺛﺔ ﻣﻌﺎﻣﻼت ،أﺳﻢ اﻟﺨﺎدم اﻟﺬي ﺗﻢ إﻧﺸﺎؤه ،وأﺳﻢ اﻟﻄﺮﯾﻘﺔ اﻟﺘﻲ ﺗﻮاﻓﻖ اﺳﻢ اﻟﺪاﻟﺔ اﻟﻤﻨﺎداة وھﻲ ﻧﻔﺴﮭﺎ اﻟﻤﻌﺎﻣﻞ اﻷﺧﯿﺮ.
ﯾﺘﻢ اﻟﺮد ﻋﻠﻰ اﻟﺰﺑﻮن ﺑﺎﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ printﻟﺘﻄﺒﻊ ﻋﻠﻰ اﻟﺒﺮوﺗﻮﻛﻮل ﻧﺘﯿﺠﺔ ﺗﻨﻔﯿﺬ اﻟﺪاﻟﺔ
;))( ،xmlrpc_server_call_method($xmlrpc_server, $request_xml, arrayواﻟﺘﻲ ﺗﺄﺧﺬ ﺛﻼث ﻣﻌﺎﻣﻼت ،ﻣﺼﺪر
اﻟﺨﺎدم ،resource $serverاﻟﻄﻠﺐ ﻋﻠﻰ ﺷﻜﻞ ﺷﯿﻔﺮة xmlواﻟﻤﻌﺎﻣﻼت اﻟﺘﻲ ﺳﯿﺘﻢ ارﺟﺎﻋﮭﺎ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﻔﻮﻓﺔ.
ﻣﻦ ﺟﮭﺔ اﻟﺰﺑﻮن ،ﯾﺠﺐ ﻣﻨﺎداة اﻟﺪاﻟﺔ اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إﻧﺸﺎء دﻓﻖ streamﻟﻠﻤﺤﺘﻮى contextوھﻲ اﻟﺪاﻟﺔ
)))( ،stream_context_create(array('http' => arrayواﻟﺘﻲ ﺗﺄﺧﺬ ﻣﻌﺎﻣﻞ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﻔﻮﻓﺔ ،ﺗﺤﺪد ﻛﻞ ﻣﻦ ﺑﺮوﺗﻮﻛﻮل
اﻻﺗﺼﺎل وھﻮ HTTPو ﻛﺬﻟﻚ ﻣﻌﺎﻣﻼت ھﺬا اﻟﺒﺮوﺗﻮﻛﻮل .ﻓﻄﺮﯾﻘﺔ اﻻرﺳﺎل ھﻲ POSTﻛﻤﺎ ذﻛﺮ أﻋﻼه ،واﻟﺮأﺳﯿﺔ ،headerﺗﻮﺿﺢ
أن ﻧﻮع اﻟﻤﺤﺘﻮى ھﻮ ﻧﺼﻮص xmlأو ،text/xmlوأن ﻋﺎﻣﻞ اﻟﻤﺴﺘﺨﺪم User-Agentھﻮ ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل RPCﻣﻦ ﺧﻼل ﻟﻐﺔ
PHPأو .PHPRPC
<?php
;))$request = xmlrpc_encode_request("databases", array('username', 'password', 8
($context = stream_context_create(array('http' => array
'method' => "POST",
'header' => "Content-Type: text/xml\r\nUser-Agent: PHPRPC/1.0\r\n",
'content' => $request
;)))
/*This URL may not exist. Replace it with your server URL*/
;'$server = 'http://localhost/xampp/tutorial/service.php
;)$file = file_get_contents($server, false, $context
;)$response = xmlrpc_decode($file
;echo "Result= " . $response
>?
اﻵن ﯾﺠﺐ طﺒﺎﻋﺔ اﻟﻨﺎﺗﺞ ﻋﻠﻰ ﺷﺎﺷﺔ اﻟﺰﺑﻮن ﻛﻤﺎ ھﻮ ﻣﺒﯿﻦ ﻓﻲ اﻟﺼﻮرة أدﻧﺎه .ﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل ﻣﻨﺎداة اﻟﺪاﻟﺔ )($xmlrpc_decode
واﻟﺘﻲ ﺗﺄﺧﺬ ﻣﻌﺎﻣﻞ ﻋﻠﻰ ﺷﻜﻞ ﻣﻠﻒ ﯾﺤﺪد طﺮﯾﻘﺔ اﻟﺤﺼﻮل ﻋﻠﻰ اﻟﻤﺤﺘﻮى ﺟﮭﺔ اﻟﺨﺎدم وھﻲ .getﯾﺘﻢ ﺗﻌﺮﯾﻒ ھﺬا اﻟﻤﻌﺎﻣﻞ ﻣﻦ ﺧﻼل
اﻟﺪاﻟﺔ )( ،get_file_contentsواﻟﺘﻲ ﺗﻌﯿﺪ ﻣﺎ ﺗﻘﺮأه ﻣﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻠﻒ ﻋﻠﻰ ﺷﻜﻞ ﺳﻠﺴﻠﺔ ،stringوﻟﻜﻨﮭﺎ ﺗﺄﺧﺬ ﺑﺪورھﺎ ﺛﻼث ﻣﻌﺎﻣﻼت،
اﻟﻤﻌﺎﻣﻞ اﻷول ھﻮ أﺳﻢ اﻟﺨﺎدم ،واﻟﻤﻌﺎﻣﻞ اﻟﺜﺎﻧﻲ falseﻟﻌﺪم ﺗﺤﺪﯾﺪ اﻟﻤﺴﺎر ،واﻟﺜﺎﻟﺚ اﻟﻤﺤﺘﻮى contextاﻟﺬي ﺗﻢ إﻧﺸﺎؤه ﺳﺎﺑﻘﺎ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 44
ﻣﻼﺣﻈﺔ :اﺳﺘﺒﺪل اﺳﻢ اﻟﺠﮭﺎز اﻟﻤﺤﻠﻲ ،localhostﺑﺎﺳﻢ اﻟﺠﮭﺎز اﻟﺬي ﯾﻮﺟﺪ ﻋﻠﯿﮫ اﻟﺨﺎدم .ﯾﻤﻜﻨﻚ اﻻﺳﺘﻌﺎﻧﺔ ﺑﻤﺸﺮف اﻟﻤﺨﺘﺒﺮ ﻟﯿﻌﻄﯿﻚ
اﺳﻢ اﻟﺠﮭﺎز.
ﺗﺪرﯾﺐ :1اﻋﻤﻞ ﻋﻠﻰ إﺿﺎﻓﺔ اﻟﺠﺰء اﻟﺒﺮﻣﺠﻲ اﻟﺨﺎص ﺑﻚ ﻟﻜﻞ ﻣﻦ ﺑﺮﻧﺎﻣﺞ اﻟﺨﺎدم وﺑﺮﻧﺎﻣﺞ اﻟﺰﺑﻮن ﺑﺤﯿﺚ ﯾﻄﻠﺐ اﻟﺰﺑﻮن ،طﺎﻟﺐ ﺟﺎﻣﻌﻲ
ﻓﺮﺿﺎ ،ﺟﻠﺐ ﻋﻼﻣﺎﺗﮫ ﻣﻦ اﻟﺨﺎدم .اﻧﻈﺮ اﻟﺼﻮرة أدﻧﺎه.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 45
اﻟﻨﺸﺎط اﻟﺼﻔﻲ اﻟﺴﺎﺑﻊ
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 46
ﻣﻘﺪﻣﺔ
إن ﻣﺼﺪر ﻗﻮة ﺑﺮوﺗﻮﻛﻮل اﻻﺗﺼﺎل ﺳﻮاء ﻛﺎن RMIأو CORBAأو ،RPCﺗﻜﻤﻦ ﻓﻲ رﺑﻂ ﺧﺎدﻣﮫ ﺑﻘﺎﻋﺪة ﺑﯿﺎﻧﺎت .ﻓﻲ ھﺬه اﻟﺘﺠﺮﺑﺔ،
ﺳﺘﻘﻮم ﻋﺰﯾﺰي اﻟﺪارس ﺑﺎﺳﺘﺨﺪام ﻧﻔﺲ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﻛﺘﺒﺘﮭﺎ ﻓﻲ اﻟﺘﺠﺮﺑﺘﯿﻦ اﻷوﻟﻰ واﻟﺜﺎﻧﯿﺔ ﻣﻦ أﺟﻞ رﺑﻂ اﻟﺨﺎدم ﺑﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت
.customersوﻟﻜﻦ ﻻ ﺑﺪ ﻣﻦ أن ﺗﺘﻌﺮف أوﻻ ﻋﻠﻰ طﺮﯾﻘﺔ اﻟﺮﺑﻂ ﺑﯿﻦ ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ ﺟﺎﻓﺎ ،وﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت customersﻓﻲ .MySQL
اﻷھﺪاف
أن ﺗﺘﻌﺮف ﻋﻠﻰ طﺮﯾﻘﺔ ﺟﺎﻓﺎ ﻓﻲ اﻟﺮﺑﻂ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .MySQL .1
أن ﺗﺘﻌﺮف ﻋﻠﻰ اﻟﻄﺮق methodsواﻷﺻﻨﺎف classesاﻟﺘﻲ ﺗﻌﺮﻓﮭﺎ ﺟﺎﻓﺎ ﻟﻠﺮﺑﻂ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .MySQL .2
ي ﺣﺎﺳﻮب اﺛﻨﯿﻦ،أن ﺗﻜﺘﺐ ﺑﻠﻐﺔ Javaﺑﺮﻧﺎﻣﺠﺎ ﯾﻤﺜﻞ ﺧﺎدم وﺑﺮﻧﺎﻣﺠﺎ آﺧﺮ ﯾﻤﺜﻞ زﺑﻮن ،ﺗﻨﻔﺬ اﻟﺒﺮﻧﺎﻣﺠﯿﻦ ﻣﻦ ﺧﻼل ﺟﮭﺎز ّ .3
وﺳﯿﻠﺔ اﻻﺗﺼﺎل ﺑﯿﻨﮭﻤﺎ ھﻲ ،RMIﺣﯿﺚ ﯾﺮﺗﺒﻂ ﺧﺎدم RMIﻣﻊ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت.
أن ﺗﻜﺘﺐ ﺑﻠﻐﺔ Javaﺑﺮﻧﺎﻣﺠﺎ ﯾﻤﺜﻞ ﺧﺎدم وﺑﺮﻧﺎﻣﺠﺎ آﺧﺮ ﯾﻤﺜﻞ زﺑﻮن ،ﺗﻨﻔﺬ اﻟﺒﺮﻧﺎﻣﺠﯿﻦ ﻣﻦ ﺧﻼل ﺟﮭﺎزيّ ﺣﺎﺳﻮب اﺛﻨﯿﻦ، .4
وﺳﯿﻠﺔ اﻻﺗﺼﺎل ﺑﯿﻨﮭﻤﺎ ھﻲ ،CORBAﺣﯿﺚ ﯾﺮﺗﺒﻂ ﺧﺎدم CORBAﻣﻊ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت.
ﯾﻮﺿﺢ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ طﺮﯾﻘﺔ رﺑﻂ ﺟﺎﻓﺎ ﻣﻊ ،MySQLﺑﺎﺳﺘﺨﺪام طﺮﯾﻘﺔ اﻟﺮﺑﻂ اﻟﻤﻌﯿﺎرﯾﺔ وھﻲ .Connector/Jﯾﺠﺐ ﺗﺤﻤﯿﻞ ھﺬا
اﻟﻤﻠﻒ اﻟﻤﻀﻐﻮط ﻣﻦ اﻟﻤﻮﻗﻊ اﻟﺘﺎﻟﻲ .http://dev.mysql.com/downloads/file/?id=462850ﻗﻢ ﺑﻔﻚ ﺿﻐﻂ اﻟﻤﻠﻒ ،ﻋﻠﻰ
ﻣﺠﻠﺪ ﻣﻌﯿﻦ ﻟﺤﯿﻦ اﻟﺨﻄﻮة اﻟﺘﺎﻟﯿﺔ.
ﺛﻢ وﺑﻌﺪ ذﻟﻚ اﻓﺘﺢ ﺑﺮﻣﺠﯿﺔ ،NetBeans IDEأﻏﻠﻖ ﺟﻤﯿﻊ اﻟﻤﺸﺎرﯾﻊ اﻟﻤﻔﺘﻮﺣﺔ إن وﺟﺪ ،واﻋﻤﻞ ﻋﻠﻰ إﻧﺸﺎء ﻣﺸﺮوع ﺟﺪﯾﺪ .أﻋﻂ أﺳﻢ
ﻟﻠﺤﺰﻣﺔ ،connector_mysqlﻣﺒﻘﯿﺎ ﻋﻠﻰ اﻻﻓﺘﺮاﺿﺎت وﻣﻨﮭﺎ أﺳﻢ اﻟﺼﻨﻒ إن أردت Connector_mysqlوﻣﻨﮭﺞ .mainاﻧﺴﺦ
اﻟﺒﺮﻧﺎﻣﺞ اﻟﺘﺎﻟﻲ ﻓﻲ داﺧﻞ اﻟﺼﻔﺤﺔ أن أﺑﻘﯿﺖ ﻋﻠﻰ اﻟﻤﺴﻤﯿﺎت اﻟﺴﺎﺑﻘﺔ .اﻵن اﻋﻤﻞ ﻋﻠﻰ إﺿﺎﻓﺔ ﻣﻜﺘﺒﺔ إﻟﻰ اﻟﻤﻜﺘﺒﺎت librariesﻣﻦ ﺧﻼل
ﺟﻠﺐ ﻣﻠﻒ .jar
ﺛﻢ اﺧﺘﺎر ﻣﻠﻒ mysql-connector-java-5.1.39-bin.jarﻣﻦ داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﺖ ﺑﻔﻚ ﺿﻐﻄﮫ.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 47
package connector_mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author Dr. Eng. Samer Jaloudi
* QOU, Nablus, Palestine
*/
public class Connector_mysql
{
public static void main(String[] args)
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String connectionUrl = "jdbc:mysql://localhost:3306/customers";
String connectionUser = "root";
String connectionPassword = "";
conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM persons");
while (rs.next())
2016 ، ﻓرع ﻧﺎﺑﻠس- ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ- ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي. م. د:إﻋداد 48
{
;)"String id = rs.getString("P_ID
;)"String firstName = rs.getString("FirstName
;)"String lastName = rs.getString("LastName
;)"String address = rs.getString("Address
;)"String city = rs.getString("City
;)System.out.print("ID: " + id + ", First Name: " + firstName + ", Last Name: " + lastName
;)System.out.println(", address: " + address + ", city: " + city
}
}
};)(catch (Exception e){e.printStackTrace
finally
{
} ;)(try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace
} ;)(try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace
} ;)(try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace
}
}
}
اﻟﺨﻄﻮات اﻟﺘﻲ ﯾﺠﺐ إﺗﺒﺎﻋﮭﺎ ﻓﻲ اﻟﺮﺑﻂ ﻣﻊ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﻟﺠﻠﺐ ﺑﯿﺎﻧﺎت ﻣﻨﮭﺎ:
.1أﻧﺸﺊ ﻣﺜﯿﻞ ﻣﻦ أداة اﻟﺮﺑﻂ ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Connectionﺑﺈﺳﻢ ،connوﻣﺜﯿﻞ ﻣﻦ ﺟﻤﻠﺔ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Statementﺑﺈﺳﻢ
،stmtوﻣﺜﯿﻞ آﺧﺮ ﻣﻦ ﻣﺠﻤﻮﻋﺔ اﻟﻨﺘﯿﺠﺔ ResultSetﺑﺄﺳﻢ rsﻟﺤﻔﻆ اﻟﻨﺘﯿﺠﺔ ﻓﻲ ھﺬا اﻟﻤﺘﻐﯿﺮ.
.2أﻧﺸﺊ ﻣﺜﯿﻞ ﻣﻦ ﺳﺎﺋﻖ اﻟﺮﺑﻂ Driverﻣﻊ ،MySQLﺑﺎﺳﺘﺨﺪام اﻟﻜﻮد اﻟﺒﺮﻣﺠﻲ
;)(Class.forName("com.mysql.jdbc.Driver").newInstance
.3ﻣﻦ ﺧﻼل ﺳﻠﺴﻠﺔ ،Stringﻋﺮف ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات ،ﻣﺘﻐﯿﺮ ﯾﺤﻤﻞ ﻋﻨﻮان ﻣﻀﯿﻒ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﻣﻨﻔﺬھﺎ ) ،(3306وﻣﺘﻐﯿﺮ
آﺧﺮ ﯾﺤﻤﻞ اﺳﻢ اﻟﻤﺴﺘﺨﺪم ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت " ،"rootوﻣﺘﻐﯿﺮ ﺛﺎﻟﺚ ﯾﺤﻤﻞ ﻛﻠﻤﺔ اﻟﻤﺮور ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت "" .طﺒﻌﺎ ﻧﺘﺮﻛﮭﺎ ﻓﺎرﻏﺔ
ھﻨﺎ ﻷﻧﻨﺎ ﻟﻢ ﻧﺤﺪد ﻛﻠﻤﺔ ﻣﺮور ﻣﺴﺒﻘﺎ ﻋﻠﻰ .customers
.4اﻵن ﯾﻤﻜﻦ ﺗﻨﻔﯿﺬ اﻟﺮﺑﻂ ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﺧﻼل اﻟﻤﻨﮭﺞ getConnectionاﻟﺘﺎﺑﻌﺔ ﻟﻠﺼﻨﻒ ،DriverManagerﺣﯿﺚ
ﺗﺄﺧﺬ ھﺬه اﻟﻄﺮﯾﻘﺔ ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات وھﻲ اﻟﺘﻲ ﺗﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻨﻘﻄﺔ اﻟﺴﺎﺑﻘﺔ )ﻧﻘﻄﺔ .(3
.5ﺛﻢ ﻧﻔﺬ ﺟﻤﻠﺔ اﺳﺘﻌﻼم SQLﻣﻦ ﺧﻼل اﺳﺘﺪﻋﺎء اﻟﻤﻨﮭﺞ ،executeQueryوھﺬا اﻟﻤﻨﮭﺞ ﯾﺄﺧﺬ ﻣﺘﻐﯿﺮ ﻣﻦ ﻧﻮع ﺳﻠﺴﻠﺔ ،ﯾﺤﻤﻞ
ﺟﻤﻠﺔ اﻻﺳﺘﻌﻼم ،Queryاﻟﺘﻲ ﻧﺮﯾﺪ ﺗﻨﻔﯿﺬھﺎ ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .ﻧﺘﯿﺠﺔ اﻟﺘﻨﻔﯿﺬ ﺗﻮﺿﻊ ﻓﻲ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺗﻢ اﻧﺸﺎؤه ﻣﺴﺒﻘﺎ ﺑﺎﺳﻢ
ﻗﺲ ﻛﻨﻮع ﻣﻦ ﻣﺠﻤﻮﻋﺔ اﻟﻨﺘﯿﺠﺔ .ResultSet
.6ﻣﺴﺘﺨﺪﻣﺎ ﺟﻤﻠﺔ دوران ،اطﺒﻊ ﺟﻤﯿﻊ اﻟﻤﺤﺘﻮﯾﺎت اﻟﺘﻲ ﺗﻢ ﺟﻠﺒﮭﺎ ﻣﻦ اﻟﻘﺎﻋﺪة.
.7إﻏﻠﻖ ﺟﻤﯿﻊ ﻣﻨﺎﻓﺬ اﻟﺮﺑﻂ واﻟﺘﻌﺮﯾﻔﺎت اﻟﺘﻲ ﺗﺘﻌﻠﻖ ﺑﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت.
.8ھﺬا اﻟﻤﺜﺎل ﯾﺴﺘﺨﺪم ﻣﻜﺘﺒﺔ ،sqlﻓﯿﻤﻜﻦ اﺳﺘﯿﺮاد ﻣﺎ ﻧﺤﺘﺎﺟﮫ ﻣﻦ اﻟﻤﻜﺘﺒﺔ ﻣﻦ ﺧﻼل ﺟﻤﻠﺔ واﺣﺪة ;*.import java.sql.
ﺗﺪرﯾﺐ :1ﻋﺪل ﻋﻠﻰ ﻛﻞ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﺧﺎدم RMIوﺑﺮﻧﺎﻣﺞ اﻟﺰﺑﻮن RMIﺑﺤﯿﺚ ﯾﻄﻠﺐ اﻟﺰﺑﻮن ،طﺎﻟﺐ ﺟﺎﻣﻌﻲ ﻓﺮﺿﺎ ،ﺟﻠﺐ ﻋﻼﻣﺎﺗﮫ
ﻣﻦ اﻟﺨﺎدم .اﻧﻈﺮ اﻟﺼﻮرة أدﻧﺎه.
ﺗﺪرﯾﺐ :2ﻋﺪل ﻋﻠﻰ ﻛﻞ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﺧﺎدم CORBAوﺑﺮﻧﺎﻣﺞ اﻟﺰﺑﻮن CORBAﺑﺤﯿﺚ ﯾﻄﻠﺐ اﻟﺰﺑﻮن ،طﺎﻟﺐ ﺟﺎﻣﻌﻲ ﻓﺮﺿﺎ ،ﺟﻠﺐ
ﻋﻼﻣﺎﺗﮫ ﻣﻦ اﻟﺨﺎدم .اﻧﻈﺮ اﻟﺼﻮرة أدﻧﺎه.
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 49
ﺗﺪرﯾﺐ :3ﻋﺪل ﻋﻠﻰ ﻛﻞ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﺧﺎدم XML-RPCوﺑﺮﻧﺎﻣﺞ زﺑﻮن XML-RPCﻓﻲ اﻟﺘﺠﺮﺑﺔ اﻟﺴﺎﺑﻘﺔ ﺑﺤﯿﺚ ﯾﻄﻠﺐ اﻟﺰﺑﻮن،
طﺎﻟﺐ ﺟﺎﻣﻌﻲ ﻓﺮﺿﺎ ،ﺟﻠﺐ ﻋﻼﻣﺎﺗﮫ ﻣﻦ ﺧﺎدم ﻋﻠﯿﮫ ﺑﯿﺎﻧﺎﺗﮫ اﻟﺸﺨﺼﯿﺔ ،وھﺬا اﻟﺨﺎدم ﺑﺪوره ﯾﺠﻠﺐ اﻟﻌﻼﻣﺎت ﻣﻦ ﺧﺎدم آﺧﺮ ﺑﻨﻔﺲ ﺗﻘﻨﯿﺔ
اﻻﺗﺼﺎل اﻟﻤﺴﺘﺨﺪﻣﺔ .اﻧﻈﺮ اﻟﺼﻮرة أدﻧﺎه .ﯾﻤﻜﻨﻚ اﺳﺘﺨﺪام ﺗﻘﻨﯿﺔ اﻻﺗﺼﺎل RMIأو ﺗﻘﻨﯿﺔ .CORBA
إﻋداد :د .م .ﺳﺎﻣر ﺣﺳﻧﻲ ﺟﺎﻟودي -ﺟﺎﻣﻌﺔ اﻟﻘدس اﻟﻣﻔﺗوﺣﺔ -ﻓرع ﻧﺎﺑﻠس2016 ، 50