Php + Base de donnée + Purebasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Php + Base de donnée + Purebasic

Message par Jenova »

Salut les défriseurs de clavier, dans la série on y connais rien mais on veut toucher à tout quand même je vous présente : Moi :mrgreen:
Mais bon, je vous embêtes pas souvent non :oops: ?

Voila le topo,
après farfouillage sur le net j'ai cru en arriver à la conclusion suivante:
Pour développer un jeu online genre MMO, il nous faut un serveur distant pour y stocker une base de donnée.
Mais comme des petits malins arriveront tôt ou tard à craquer le jeu il pourraient bien récupérer les clés d'accès au serveur et y mettre un bordel de tout les diables.
Pour palier à ce problème il faut s'arranger pour que les accès à cette base de donnée soient fait par un programme en Php stocké lui aussi sur le même serveur. Ce programme en Php est une sorte d'intermédiaire entre le programme purebasic et la base de donnée.

Déjà, jusque là, je suis dans le vrai ou pas :?:

Si oui, mes questions sont les suivantes :
- Quel type de base de donnée serrait selon vous la plus adaptée ? (retenue pour le moment MySQL) Sachant que le jeu cible est une sorte Ogame en plus dynamique et certainement plus gourmand en accès B.D.
- Comment faire pour qu'un programme en Purebasic communique avec un programme Php ?

Alors oui j'y connais rien, je me défonce les neurones à comprendre ce qu'est un serveur apache, le php et les BD, leur liens étroit, j'ai de la lecture "PHP 5 avancé" de chez Eyrolles, de l'aide provenant du cite du zéro, de http://fr.php.net/manual/fr/index.php mais malgré tout dans mon crane ça donne un grand bordel... alors vous qui vous y connaissez, si vous êtres prêt à me formater les neurones je me cramponne à mon siège et c'est parti :D
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Php + Base de donnée + Purebasic

Message par Arbrakan »

Salut Jenova, (FF7 powa :D), pour le choix d'MySQL c'est un bon choix pour commencer, il supporte env. 1500 requêtes secondes, donc y a de la marge. Après si tu dépasse, je te conseils de t’orienté vers le PostgreSQL, l'évolution de mysql, en plus performant,et plus complexe. (si mes souvenirs sont bon, il supporte 10'000 requêtes secondes.)

Pour la communication de PureBasic avec php, je n'ai pas assez de connaissance en PB. je suis un petit nouveau dans ce domaine, par contre je viens du monde du Web, donc coté php, ect. Y a pas de soucis si tu as besoin d'aide.

A bientôt !

Arbrakan
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Php + Base de donnée + Purebasic

Message par Cls »

Arbrakan a écrit :pour le choix d'MySQL, il supporte env. 1500 requêtes secondes
Moui, tout dépend de la complexité de tes requêtes quand même..

Concernant la communication PHP/PB, c'est tout bête, ou presque. Il te faut d'abord une page PHP qui recevra tes requêtes. Tu peux par exemple créer une page query.php qui prend plusieurs paramètres (l'id du joueur, une clef de vérification éventuelle, le type de requête, les paramètres éventuelles, etc.). Ces paramètres tu choisis de les passer au script en GET ou en POST (ou les deux, selon tes besoins).

Une fois que ton script PHP à tout ce qu'il lui faut pour préparer sa requête, il l’exécute et renvoi le résultat à ton programme PB qui attends patiemment sa réponse. Le format de réponse est libre : XML, objets sérialisés, texte brut, peu importe...

Comment requêter une URL donnée avec paramètre POST ou GET ? C'est simple :

Code : Tout sélectionner

#INTERNET_OPEN_TYPE_DIRECT = 1
#HTTP_ADDREQ_FLAG_ADD = $20000000
#HTTP_ADDREQ_FLAG_REPLACE = $80000000
#INTERNET_FLAG_SECURE = $800000 ;si HTTPS
#SECURITY_FLAG_IGNORE_UNKNOWN_CA = $100 
#INTERNET_SERVICE_HTTP = 3 ; Type of connection (could be FTP Gopher etc). HTTPS is done as HTTP too.
#INTERNET_DEFAULT_HTTP_PORT = 80  ;/ 443 si HTTPS
#INTERNET_DEFAULT_HTTPS_PORT = 443
#HTTP_QUERY_COOKIE = 44 ; ;For httpqueryinfo.

Procedure.s Query(hote.s, url.s, post_data.s = "")
  
  header.s = "Host: " + hote + #CRLF$
  header + "MIME-Version: 1.0" + #CRLF$
  header + "Cache-Control: no-cache" + #CRLF$
  header + "Connection: close " + #CRLF$ + #CRLF$
  
  google_result.s = ""
 
  ; CONNEXION HTTP et création de la requete
  open_handle = InternetOpen_("User Agent", #INTERNET_OPEN_TYPE_DIRECT, "" , "",0)
  connect_handle = InternetConnect_(open_handle, hote, #INTERNET_DEFAULT_HTTP_PORT, "", "", #INTERNET_SERVICE_HTTP, 0, 0)
  request_handle = HttpOpenRequest_(connect_handle, "GET", url, "", "", 0, 0, 0)

  HttpAddRequestHeaders_(request_handle, header, Len(header), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
  
 
  ; Envoi de la requete avec les données POST
  send_handle = HttpSendRequest_(request_handle, #Null, -1, post_data, Len(post_data))
  Buffer.s = Space(1024)
  
  ; Lecture du flux descendant
  ; google_result contiendra la reponse du serveur
  bytes_read.l
  #BUFFER_SIZE = 1024
  Repeat
   
    InternetReadFile_(request_handle, @Buffer, #BUFFER_SIZE, @bytes_read)
    google_result + Left(Buffer, bytes_read)
    Buffer = Space(#BUFFER_SIZE)
   
  Until bytes_read=0
  
  
  ProcedureReturn google_result
EndProcedure

Debug Query("www.google.fr", "/search?q=purebasic")
Bon courage,
Cls
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Php + Base de donnée + Purebasic

Message par Arbrakan »

Moui, tout dépend de la complexité de tes requêtes quand même..
Effectivement, en général sur les sites que je crée, il y a entre 15 et 40 requêtes pare action, je pense que t'arrive facile a faire tourner un serveur avec 200 personnes, après faut aussi que le serveur suive.
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Re: Php + Base de donnée + Purebasic

Message par Jenova »

zètes des dieux :D
merci pour tout ces conseils :wink:
Mais au fait, comment ils font les boites qui font des WOW likes ? Je doutes qu'ils se contentent de php :mrgreen:
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Php + Base de donnée + Purebasic

Message par TO7 »

Cls a écrit :Comment requêter une URL donnée avec paramètre POST ou GET ? C'est simple :
Et si il y a un proxy ???
Ce code ne marche pas, dommage :(
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Php + Base de donnée + Purebasic

Message par Warkering »

Jenova a écrit :zètes des dieux :D
merci pour tout ces conseils :wink:
Mais au fait, comment ils font les boites qui font des WOW likes ? Je doutes qu'ils se contentent de php :mrgreen:
Bah, imagine ta maison, multiplie son périmètre par cinquante et imagine que dans tout ce terrain, bah y'a que des serveurs monstres alignés sur deux étages! Mais bon, y'a quand même de quoi faire fonctionner la France avec ça! :roll:
Maintenant, pour la Chine, ... :mrgreen:
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Php + Base de donnée + Purebasic

Message par Cls »

@Jenova : pour des WOW like, ils ne passent évidemment plus par PHP mais codent un serveur complet, comme pour des FPS. Ce serveur est conçu de manière à pouvoir tourner sur des centaines de serveurs simultanément, sur des centaines de base de données toutes interconnectées et synchronisées...

@TO7 : il est évidement possible d'outrepasser un proxy.
2 solutions : soit tu utilises les valeurs systèmes pré-configurées et dans ce cas ce code

Code : Tout sélectionner

open_handle = InternetOpen_("User Agent", #INTERNET_OPEN_TYPE_DIRECT, "" , "",0)

devient

Code : Tout sélectionner

open_handle = InternetOpen_("User Agent", #INTERNET_OPEN_TYPE_PRECONFIG, "" , "",0)
en ajoutant cette constante au début du fichier:

Code : Tout sélectionner

#INTERNET_OPEN_TYPE_PRECONFIG = 0
Le code utilise les valeurs systèmes ProxyEnable, ProxyServer et ProxyOverride définies ici "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings".

Soit tu forces l'utilisation d'un proxy :
(code non testé car pas de proxy...)

Code : Tout sélectionner

; Plus d'infos : http://msdn.microsoft.com/en-us/library/aa383996(v=vs.85).aspx

#INTERNET_OPEN_TYPE_PRECONFIG = 0  ; Utilise les valeurs du registre 
#INTERNET_OPEN_TYPE_DIRECT = 1
#INTERNET_OPEN_TYPE_PROXY = 3

#HTTP_ADDREQ_FLAG_ADD = $20000000
#HTTP_ADDREQ_FLAG_REPLACE = $80000000
#INTERNET_FLAG_SECURE = $800000 ;si HTTPS
#SECURITY_FLAG_IGNORE_UNKNOWN_CA = $100 
#INTERNET_SERVICE_HTTP = 3 ; Type of connection (could be FTP Gopher etc). HTTPS is done as HTTP too.
#INTERNET_DEFAULT_HTTP_PORT = 80  ;/ 443 si HTTPS
#INTERNET_DEFAULT_HTTPS_PORT = 443
#HTTP_QUERY_COOKIE = 44 ; ;For httpqueryinfo.

Procedure.s Query(hote.s, url.s, post_data.s = "", proxy.s = "")
  
  header.s = "Host: " + hote + #CRLF$
  header + "MIME-Version: 1.0" + #CRLF$
  header + "Cache-Control: no-cache" + #CRLF$
  header + "Connection: close " + #CRLF$ + #CRLF$
  
  google_result.s = ""

  ; CONNEXION HTTP et création de la requete
  open_handle = InternetOpen_("User Agent avec Proxy", #INTERNET_OPEN_TYPE_PROXY, proxy , #Null, #Null)
  connect_handle = InternetConnect_(open_handle, hote, #INTERNET_DEFAULT_HTTP_PORT, "", "", #INTERNET_SERVICE_HTTP, #Null, #Null)
  request_handle = HttpOpenRequest_(connect_handle, "GET", url, "", "", #Null, #Null, #Null)

  HttpAddRequestHeaders_(request_handle, header, Len(header), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
  

  ; Envoi de la requete avec les données POST
  send_handle = HttpSendRequest_(request_handle, #Null, -1, post_data, Len(post_data))
  Buffer.s = Space(1024)
  
  ; Lecture du flux descendant
  ; google_result contiendra la reponse du serveur
  bytes_read.l
  #BUFFER_SIZE = 1024
  Repeat
   
    InternetReadFile_(request_handle, @Buffer, #BUFFER_SIZE, @bytes_read)
    google_result + Left(Buffer, bytes_read)
    Buffer = Space(#BUFFER_SIZE)
   
  Until bytes_read=0
  
  
  ProcedureReturn google_result
EndProcedure

Debug Query("www.google.fr", "/search?q=purebasic", "", "http=http://localhost:8080/")
Il faut bien ajouter ce code : "http=http://localhost:8080/" dans l'appel de la fonction 'http=" permet d'indiquer le protocole qui sera touché par le proxy (ici http)
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Php + Base de donnée + Purebasic

Message par TO7 »

Merci CLS
J'avance un peu

Je viens deja de tester la version avec

Code : Tout sélectionner

open_handle = InternetOpen_("User Agent", #INTERNET_OPEN_TYPE_PRECONFIG, "" , "",0)
Maintenant j'obtiens quelque chose, mais j'ai un PROXY avec LOGIN et MDP obligatoire
J'ai donc la reponse :
Access Denied (authentication_failed)
Mauvais nom d'utilisateur ou mot de passe
J'ai remplacé "User Agent" par mon login, mais peut etre ne fallait il pas ???

EDIT : Je possede le LOGIN et le MDP pour acceder a internet, je les rentre manuellement dans un panneau que le PROXY affiche en temps normal, mais ou les ecrire dans ton code ??
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Php + Base de donnée + Purebasic

Message par Cls »

Il faut modifier cette ligne pour mettre le login / password du proxy

Code : Tout sélectionner

connect_handle = InternetConnect_(open_handle, hote, #INTERNET_DEFAULT_HTTP_PORT, "", "", #INTERNET_SERVICE_HTTP, #Null, #Null)
remplacer par

Code : Tout sélectionner

connect_handle = InternetConnect_(open_handle, hote, #INTERNET_DEFAULT_HTTP_PORT, USERNAME, PASSWORD, #INTERNET_SERVICE_HTTP, #Null, #Null)
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Php + Base de donnée + Purebasic

Message par TO7 »

Merci je vais essayer. 8)
Justement une question en appelant une autre, j'ai l'impression qu'un proxy garde un certain temps l'autorisation du login et mdp.
Je m'explique, je clique sur un site internet, le panneau proxy apparait, je rentre ce qu'il faut et ça marche.

Si je clique a nouveau en fermant tout IE, le proxy ne redemande pas le mdp 8O
Et ceci dure un certain temps ou un certain nombre de pages ...

C'est super quand on veut pas se taper le mdp toutes les 2 secondes, mais par contre comme dans ma situation actuelle, et bien je ne peux tester ton code, car quoi que je fasse le proxy "laisse passer" et ceci pendant un "certain temps" qui m'est inconnu.

Aurait tu la combine pour le forcer a me redemander le mdp, ce doit etre un fichier ou un truc comme cela qui doit trainer, un espece de "bail" comme l'affectionne bien les serveur.
Selon toi, y aurait'il un moyen de remettre a zero ce "bail" ???
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Php + Base de donnée + Purebasic

Message par Cls »

Oui c'est possible. Pour ça, il faut bien comprendre à quoi sert un proxy. Il a 2 buts :
1. mettre en cache les pages appelées afin de ne pas requêter Internet à chaque fois qu'on consulte un site => c'est d'abord dans un but d'optimisation du temps réseau qu'on utilise un proxy.
2. définir des restrictions d'accès afin de filtrer les contenus échanger en provenance ou à destination du Web => ensuite on flic les utilisateurs... ;)

Voilà à quoi ça sert. Pourquoi je raconte ça ? Parce qu'il est possible de passer au proxy des commandes en même temps que tes requêtes HTTP. Dans le code précédent, on fait une requête GET sur l'hôte www.google.fr à l'URL /search. Pour passer des commandes au proxy, il suffit d'utiliser les entêtes. Ceux - ci sont les premiers paramètres passées, avant même la requête elle - même. Le proxy intercepte ceux - qui lui sont adressés et envoi au serveur Web les autres.

Grâce aux entêtes, on va dire au proxy comment se comporter avec telle ou telle requête. Tu trouveras de l'information ici : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Cette RFC décrit les entêtes HTTP/1.1.

Je fais un exemple dès que j'ai un peu de temps ;)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Php + Base de donnée + Purebasic

Message par Cls »

Pour faire ce que tu demandes ("se déconnecter du serveur proxy"), il suffit d'ajouter l'entête suivant :

Code : Tout sélectionner

header.s = "Host: " + hote + #CRLF$
  header + "Cache-Control: no-cache" + #CRLF$
  header + "Proxy-Connection: close" + #CRLF$
  header + "Connection: close " + #CRLF$ + #CRLF$
Petite explication.
"Cache-Control" indique que le proxy ne doit pas mettre en cache la réponse à cette requête.
"Proxy-Connection" n'est pas un entête standard (au sens de la RFC 2616) mais il est implémenté par tous les navigateurs du marché. Définit à "close", il permet de ne pas garder la connexion ouverte sur le proxy.
"Connection" est un champ standard et permet de ne pas garder la connexion ouverte sur le serveur Web lorsqu'il est définit à "close".

Voilà, cumulé au code précédent, ton proxy ne devrait plus te demander de login/mot de passe puisqu'il est transmis avec la requête. Si jamais ça ne marchait pas, il y a d'autres entêtes qui permettent de gérer l'authentification au proxy (voir "Proxy-Authenticate" et "Proxy-Authorization").
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Php + Base de donnée + Purebasic

Message par TO7 »

Merci beaucoup CLS
J'essaie ça demain au taf :wink:
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Php + Base de donnée + Purebasic

Message par TO7 »

Je viens d'essayer ton code avec la connexion directe et apparement ça marche tres bien.
Je suis tres content car cela faisait plusieurs années que je voulais realiser ce genre de truc.

Par contre pour la "RAZ" du serveur, si c'est bien ce que je cherche, car en fait ce que je cherche c'est faire reapparaitre le panneau de connexion que j'ai révé faire disparaitre pendant des années :mrgreen:
Et bien j'ai remplacé comme tu me l'a dit le :

Code : Tout sélectionner

   header.s = "Host: " + hote + #CRLF$
;   header + "MIME-Version: 1.0" + #CRLF$
;   header + "Cache-Control: no-cache" + #CRLF$
;   header + "Connection: close " + #CRLF$ + #CRLF$
par

Code : Tout sélectionner

header.s = "Host: " + hote + #CRLF$
  header + "Cache-Control: no-cache" + #CRLF$
  header + "Proxy-Connection: close" + #CRLF$
  header + "Connection: close " + #CRLF$ + #CRLF$
Et bien cela n'a pas d'effet.

J'explique ce qui se passe:
Si je me connecte avec IE, j'ai le panneau, a chaque fois que j'essaie a nouveau c'est pareil.(Marche normale et tres bien)
Je demarre ton super code, et la j'arrive a me connecter sans panneau (Ca c'est super)
Je relance ton code c'est pareil (Toujours super)
Je lance IE le panneau apparait (Toujours tres bien)

Donc a cette etape, je ne peux me connecter qu'avec ton code.
Si par contre j'ouvre IE en faisant un clic droit dans la fenetre du webgadget de ton code "Ouvrir dans une autre page", cela ouvre IE sans panneau et la plus moyen d'avoir le panneau.
J'ai beau refermer ton code, refermer IE, si je clique sur IE direct ça marche, pas de panneau.

Il faut attendre un certain temps pour revenir a avoir le panneau a chaque raccourci sur IE
Donc tout marche tres bien, sauf la "RAZ" apparement, c'est peut etre dans IE qu'il y a un fichier a supprimer ??

Edit: Non je viens de verifier avec un autre explorateur...c'est bien le proxy qui garde un certain temps le login et mot de passe, car en passant par opera juste apres IE, pas de panneau
Répondre