[aide]transmettre une info du web vers SL ?

Répondre
Partager Rechercher
Bonjour,

J'ai un objet in game qui a chaque fois que nécessaire (rez, reboot sim) déclenche un llRequestURL();

Une fois l'url attribuée, celle ci (ainsi que l'UUID de l'objet et son slurl) est envoyé dans ma base mysql via llHTTPRequest(adress_url, [], "");

par ce système, je peux stocké tt ca dans ma BDD :
http://www.habercom-concept.franceserv.com/forum/request2.jpg

Ensuite, sur mon site, j'ai construis un formulaire html pour y saisir des ordres.
C la que je coince...

Comment faire pour que ces ordres saisis sur le formulaires redescendent dans SL ? Ou autrement dit comment puis-je renvoyer ces infos via l'adresse du type http://sim0001.agni.lindenlab.com:12...3-56bed1f8d618 ?


Merci de vos éclaircissements.
Bonjour Black et Bestmomo, le forum


merci de vous être penché sur le pb.

J'ai lu ton guide best, j'adore le coup de l' include ("connexion.inc.php");
Moi comme une c... je recopiais ce lignes a chaque fois


Bref, revenons a mon souci. Dans le PDF de bestmomo, à la fin on créer un objet IG et on affiche la position de cette objet ds le navigateur. OK, jusque la je savais faire.

Maintenant supposons que l'on fasse un form avec 3 champs (X, Y et Z au hasard.) et que l'on veuille transmettre ces valeurs a l'objet pour qu'il se déplace (llSetPos, par exemple).

Est-ce possible ? comment transmettre ces coordonnées a l'objet ?

Merci,
Citation :
Publié par XanorK
Maintenant supposons que l'on fasse un form avec 3 champs (X, Y et Z au hasard.) et que l'on veuille transmettre ces valeurs a l'objet pour qu'il se déplace (llSetPos, par exemple).

Est-ce possible ? comment transmettre ces coordonnées a l'objet ?

Merci,
Justyne
Finalement j'ai fait un essai. A partir des scripts que j'ai mis dans mon guide j'ai repris celui de départ pour gérer le formulaire ça donne ça :

Code PHP:

<?php

include ("connexion.inc.php");

function 
select($sql)
{
    
$result mysql_query($sql);
    if (!
$result)
        die(
'erreur');
    return 
$result;
}

$result select("SELECT * FROM urls");

$row mysql_fetch_row($result);

echo 
"<form method=\"post\" action=\"$row[0]\">\n";
echo 
"  <p><label>X :\n";
echo 
"  <input name=\"x\" type=\"text\"></label></p>\n";
echo 
"  <p>\n";
echo 
"  <label>Y :\n";
echo 
"  <input name=\"y\" type=\"text\"></label></p>\n";
echo 
"  <label>Z :\n";
echo 
"  <input name=\"z\" type=\"text\"></label>\n";
echo 
"  <p><input name=\"button\" value=\"Envoyer\"\n";
echo 
" type=\"submit\"></p>\n";
echo 
"</form>";

?>
De cette manière je crée le formulaire et je lui donne la bonne adresse et c'est lui qui construit la requête. Ensuite je reçois dans SL avec ce script (j'ai été obligé de passer par POST dans ce cas) :

Code PHP:

string URL "http://monserveur.fr/initialisation.php?url=";
float DELAI_SEND_URL 360.0;
float DELAI_REQUEST_URL 60.0;

string memoURL;
key requestID;

sendURL()
{
    
requestID llHTTPRequest(memoURL, [HTTP_METHOD"GET"], "");
    
llOwnerSay("Envoi de l'url : " memoURL);
    
llSetTimerEvent(DELAI_SEND_URL);
}

default
{
    
state_entry() {llRequestURL();}
    
http_request(key idstring methodestring corps)
    {
        if (
methode == URL_REQUEST_GRANTED)
        {
            
memoURL URL corps;
            
sendURL();
        }
        else if (
methode == URL_REQUEST_DENIED)
        {
            
llOwnerSay("Pas d'URL ! Je redemande dans " + (string)DELAI_REQUEST_URL " secondes");
            
llSleep(DELAI_REQUEST_URL);
            
llRequestURL();
        }
        else if (
methode == "POST")
        {
             list 
llParseString2List(corps, ["&","="], []);
            
vector v = <(float)llList2String(l1), (float)llList2String(l3), (float)llList2String(l5)>;
            
llSetPos(v);
            
llHTTPResponse(id200"Ma position est maintenant : " + (string)llGetPos());
        }
    }
    
on_rez(integer start_param) {llRequestURL();}
    
changed(integer change)
    {
        if(
change & (CHANGED_REGION CHANGED_TELEPORT CHANGED_REGION_START))
            
llRequestURL();

    }
    
http_response(key request_idinteger status, list metadatastring body)
    {
        if(
request_id == requestID && body == "URL_OK")
        {
            
llOwnerSay("URL reçue par le serveur");
            
llSetTimerEvent(.0);
        }
    }
    
timer()
    {
        
sendURL();
    }

J'obtiens bien le déplacement invoqué dans le formulaire. J'ai fixé un petit problème qui venait du fait que j'envoyais pas de réponse mais le principe marche. Pour bien faire il faudrait évidemment vérifier la saisie avec un peu de javascript au niveau du formulaire et d'autres bricoles mais c'est une autre histoire...

Bon amusement
BestMomo, je t'adoooore !


Mon info redescend bien!

Reste 2 petits problèmes (enfin c'est certainement le même) :
- Ré-afficher mon site au lieu de cette feuille blanche avec juste de texte de mon llHTTPResponse

- Enregistrer cette info dans ma BD

Une idée la-dessus ?
Merci
Citation :
Publié par XanorK
BestMomo, je t'adoooore !


Mon info redescend bien!

Reste 2 petits problèmes (enfin c'est certainement le même) :
- Ré-afficher mon site au lieu de cette feuille blanche avec juste de texte de mon llHTTPResponse

- Enregistrer cette info dans ma BD

Une idée la-dessus ?
Merci
Alors si tu m'adores je vais continuer à t'aider

Tu peux pas ré-afficher ton site directement mais tu peux constituer un lien qui t'y ramène. Dans le corps de la fonction http_response tu mets ce que tu veux, y compris du code html. Donc tu peux créer un lien ou un bouton et hop tu renvoies après où tu veux.

Pour la mémorisation des valeurs il suffit de les repérer dans ta réponse par exemple dans un champ caché.

En résumé tu dois constituer ta page HTML de retour à partir de ton code LSL. A ta place je créerais un formulaire en mettant les données dans des champs cachés et un bouton qui t'envoie vers un script PHP de traitement de ces données et vers tout ce que tu veux ensuite...
Arf,

Je dois pas tout comprendre la

en LSL, j'ai écris, en guise de test :
Code:
llHTTPResponse(id, 200, "<html><body><p>Ceci devrait etre une page web</p></body></html>");
Mon navigateur affiche ceci de façon bête et méchante :
<html><body><p>Ceci devrait etre une page web</p></body></html>

Ou est mon erreur ...
Citation :
Publié par XanorK
en LSL, j'ai écris, en guise de test :
Code:
llHTTPResponse(id, 200, "<html><body><p>Ceci devrait etre une page web</p></body></html>");
Mon navigateur affiche ceci de façon bête et méchante :
<html><body><p>Ceci devrait etre une page web</p></body></html>

Ou est mon erreur ...
Oups...

J'avais pas testé mais apparemment le seul type de contenu accepté est text/plain, on a pas droit au text/html, donc ce que je te proposais ne peut pas fonctionner, désolé.
Arf

c ballot ca ...

/me est déçue, déçue, déçue


Merci BestMono pour ton aide amour075.gif


Je vais me tourner vers les forum php, y'a peut etre quelque chose a faire coté serveur
ouvrir l'adresse http://sim0001.agni.lindenlab.com:12...3-56bed1f8d618 puis le killer après quelques secondes

/me pense dire une bêtise, mais ca serait pas la première fois



Bye bye
Le problème est que tu ne pourras pas récupérer des informations en retour de cette manière puisque tu te retrouves en situation de client web sans possibilité de lancer un script. La solution peut être d'utiliser un llHTTPRequest dans la foulée à partir de ton script LSL pour envoyer les informations que tu mémorises alors dans ta base. Mais tu ne peux pas coordonner tout ça. Tu as raison c'est vraiment ballot...

Tu peux toujours créer un requête HTTP à partir de PHP avec la librairie cURL... De cette manière tu gardes le contrôle de ton site.
Citation :
Publié par bestmomo
La solution peut être d'utiliser un llHTTPRequest dans la foulée à partir de ton script LSL pour envoyer les informations que tu mémorises alors dans ta base.
Bon, ça c'est fait.

Citation :
Publié par bestmomo
Tu peux toujours créer un requête HTTP à partir de PHP avec la librairie cURL... De cette manière tu gardes le contrôle de ton site.
ça, par contre par français pour moi
goooooooooooogle, help !


Bah encore merci Best
Citation :
Publié par XanorK
ça, par contre par français pour moi
goooooooooooogle, help !
J'ai encore un peu vérifié ça et... les librairies cURL échouent

Alors j'ai utilisé les fonctions de flux de PHP pour envoyer la requête mais ça passe pas non plus pour une raison que j'ignore. J'ai posé la question sur un forum PHP mais elle est restée encore sans réponse. Je te tiens au courant de la suite
Parenthèse ouverte
{

Je ne veux pas interférer dans ce débat (intéressant) juste te donner un lien sur lequel je rappelais les fondamentaux:

https://forums.jeuxonline.info/showt...&highlight=web

C'est important de bien comprendre client et serveur en php.

J'avais fais à une époque où l'implémentation des nouvelles fonctions n'étaient pas encore dispo un petit objet pour le fun :


https://xstreetsl.com/modules.php?na...5&random=53864


Tu te déplace sur une région de ton choix et tu te peux consulter sur un site web externe ( ouvert avec ton navigateur) la carte de ta région et ta position )

Tu verras que tu es obligé de rafraichir la page web soit auto soit manu.

}
Parenthèse fermée.
bonjour Seb,


J'ai acheter l'objet et fait un premier test,
j'obtiens dans mon navigateur un joli tableau, j'ai bien compris que seule la dernière ligne me concerne.
Cette ligne affichant ma position grâce à la boule bleue (hud) qui l'envoi a ta BDD toute les 15 secondes.

l'exemple est intéressant notamment car il est toujours bon de lire des script bien écrit, dans les règles de l'art.

Toutefois, je ne vois pas comment faire le lien avec mon pb.
je le résume ici, avec un exemple.
  • Un objet In Game.
  • un formulaire sur un site web ou l'on saisirait les nouvelles coordonnées X, Y, Z.
  • Sur un clic sur le bouton du formulaire, les nouvelles XYZ sont stocker dans la BDD (mysql_query(UPDATE ....) et envoyer a l'objet (echo ' <form action='/.$ur_Objet_InGame].' method="post"> ';).
  • l'objet IG se déplace (llSetPos).
Jusque la, ça marche. En grande partie grâce à bestmomo.

Ce qui nous bloque, c'est qu'après tout ça le navigateur affiche que le texte renvoyer par l'objet sous une adresse du type : http://sim8227.agni.lindenlab.com:12046/cap/56930090-4090-0536-8bbe-0c5e39d36f6e

car comme le dit Best :
Citation :
Publié par bestmomo
Oups... :travers:

J'avais pas testé mais apparemment le seul type de contenu accepté est text/plain, on a pas droit au text/html, donc ce que je te proposais ne peut pas fonctionner, désolé.
Je pense avoir compris les échanges...

Ce que je voulais dire c'est qu'en php pur tu dois bien comprendre que sur le serveur ( qui heberge ton site web ) tu es 2 types de programmes:

type1
ceux qui sont exécutés et qui n'ont pas de relation avec un écran et qui te renvoient ou pas une info. Ils sont accessible par une simple adresse relative ou absolue.

type2
ceux qui ont une interface avec ton écran ils ont généralement génèrent des codes html et surtout une entête.

Quand tu t'adresses au serveur depuis SL tu ne peux adresser que des programmes php de type 1 pas de type 2

Ce qui veut dire que tu peux interfacer une base de données à partir de lsl sur ton serveur.... mais si tu veux avoir une page web affichant ces nouvelles infos tu es obligé de lancer ton navigateur local avec un programme de type 2 qui lira la base de données ( modifiée) et affichera les données.

Je ne sais pas si cela répond à ta question mais cela c'est le fonctionnement basique en php ( lsl ou pas...)

Un des problèmes connu et qui bloque 99% des développeurs est le suivant :

imagine 3 programmes

Tri.php
affiche1.php / ou html
affiche2.php / ou html

si tri.php n'envoie pas entète html ( header) il pourra appeler affich1 OU affiche2 mais une fois cela réalisé on ne peut PLUS changer d'entète HTML donc on ne peut rester que sur affiche1 ou affiche2.

Par conséquence affiche1 ne peut pas appeler affiche2 de son propre chef sous peine d'avoir le fameux message HTTP header already sent...

il existe des artifices plein le net pour ne jamais changé l'entête .. mais seulement les infos inside (typiquement le cas des formulaires. on appelle la même page en "passant " les valeurs du formulaires pour les réafficher).

Il existe des possibilités du coté du javascript/ ajax et d'un simple autoresfresh.
Je reviens sur cette affaire après un long silence parce que j'étais passé à autre chose et j'avais coincé sur mes tests bêtement. Je faisais ça sur un serveur de free qui me bloquait les requête HTTP envoyées par le PHP. En testant sur un "vrai" serveur ça marche. Par exemple ce petit test :

Code PHP:


<?php

$data 
= array ('x' => "valeurx"'y' => "valeury"'z' => "valeurz");

if (!
function_exists('http_build_query')) {
    function 
http_build_query($data$prefix=''$sep=''$key='') {
        
$ret = array();
        foreach ((array)
$data as $k => $v) {
            if (
is_int($k) && $prefix != null) {
                
$k urlencode($prefix $k);
            }
            if ((!empty(
$key)) || ($key === 0))  $k $key.'['.urlencode($k).']';
            if (
is_array($v) || is_object($v)) {
                
array_push($rethttp_build_query($v''$sep$k));
            } else {
                
array_push($ret$k.'='.urlencode($v));
            }
        }
        if (empty(
$sep)) $sep ini_get('arg_separator.output');
        return 
implode($sep$ret);
    }
}

$data http_build_query($data);

$opts = array (
        
'http' => array (
            
'method' => 'POST',
            
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                
"Content-Length: " strlen($data) . "\r\n",
            
'content' => $data
            
)
        );

$context  stream_context_create($opts);

$fp fopen('http://sim4057.agni.lindenlab.com:12046/cap/0d28f964-874a-8cb1-2249-efc8371b6d1b'.'/''r'false$context);
fpassthru($fp);
fclose($fp);

echo 
"Envoyé !!!";

?>
Ca se passe bien. Donc la solution est d'envoyer la requête par le PHP et ensuite régénérer la page HTML.
Pourquoi ne pas utiliser les fonctions cURL qui sont beaucoup plus pratiques pour ça ?


Code PHP:


<?php

$data 
= array ('x' => "valeurx"'y' => "valeury"'z' => "valeurz");

// Exemple d'url
$url "http://sim9041.agni.lindenlab.com:12046/cap/9b41d110-cdca-600b-3955-7429fe73aa78";


$curl curl_init();

curl_setopt$curlCURLOPT_URL$url );
curl_setopt$curlCURLOPT_POSTtrue );
curl_setopt$curlCURLOPT_POSTFIELDS$data );

curl_exec($curl);
curl_close($curl);

?>

http://fr2.php.net/manual/fr/ref.curl.php
Citation :
Publié par BlackShade Nightfire
Pourquoi ne pas utiliser les fonctions cURL qui sont beaucoup plus pratiques pour ça ?
J'ai pris un exemple plus général parce que la librairie cUrl n'est pas présente sur tous les serveurs mais il serait effectivement dommage de s'en priver quand on en dispose, je l'avais d'ailleurs mentionné précédemment :

Citation :
Publié par bestmomo
Tu peux toujours créer une requête HTTP à partir de PHP avec la librairie cURL... De cette manière tu gardes le contrôle de ton site.

Citation :
Publié par Francky Habercom

parce que cURL nous a décourager
C'est vrai que cette librairie est pratique mais il faut savoir un peu la manier

J'ai continué mes tests avec cette librairie puisque tu sembles en disposer. J'ai lancé ce script PHP :

Code PHP:


$data 
"Petit texte d'essai si ça passe...";

$url "http://sim8853.agni.lindenlab.com:12046/cap/92184e4a-18d0-874b-fe0d-1dd7cafd0981";

$headers = array("Content-type: application/x-www-form-urlencoded",
        
"charset=\"utf-8\"");

$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
curl_setopt($chCURLOPT_HEADERFALSE);
curl_setopt($chCURLOPT_POSTTRUE);
curl_setopt($chCURLOPT_HTTPHEADER$headers);
curl_setopt($chCURLOPT_POSTFIELDS$data);
$retour curl_exec($ch);
curl_close($ch);

print_r($retour); 
J'ai prévu l'encodage en UTF8 pour conserver les caractères spéciaux, il faut évidemment prévoir à l'arrivée dans le code LSL la fonction llUnescapeURL pour retrouver les caractères. D'autre part le code affiche l'information de retour pour vérification de la transmission. Avec ça je ne vois pas très bien ce qui peut vous manquer
Citation :
Publié par Francky Habercom
Je vois pas non plus, mais ca marche pas
cUrl, ca doit fonctionner chez free ? ou dois-je de nouveau déménager ?

Chez free les requêtes http sont bloquées, donc ça marche pas...
Citation :
Publié par bestmomo
Chez free les requêtes http sont bloquées, donc ça marche pas...
je suis persuadé que non .. j'ai même déjà fait des connexions socket via mon site sur free et des requetes html a gogo via mes formulaires ... apres est ce qu'ils autorisent l'utilisation de curl pas sur ...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés