GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Gilux le 03 Novembre 2010, 22:46:49
-
Salut, je me crée mon topic pour ne pas trop encombrer la section :ninja (Quoique je ne scripte plus tellement ^^)
J'aimerais savoir, comment faire des requêtes SA:MP en PHP ?
J'ai essayé avec ça : http://forum.sa-mp.com/showthread.php?t=104299 (http://forum.sa-mp.com/showthread.php?t=104299)
mon code :
<?php
require "SampQueryAPI.php"; // Ca, je l'ai
$query = new SampQueryAPI('94.23.58.129', 7776); //IP + Port de Lalu Stunt
$query = getBasicPlayers(); // Récupérer la liste des joueurs
echo($query); // afficher le contenu de $query
?>
J'ai pas trop compris d'où vient l'erreur (écran blanc, pas de chargement de la page.)
Merci d'avance !
-
<html>
<head>
<title>Server Status page.</title>
</head>
<body>
<?php
require "SampQueryAPI.php";
$query = new SampQueryAPI('82.245.157.196', 81);
if($query->isOnline())
{
print_r ($query->getDetailedPlayers());
$test = $query ->getDetailedPlayers();
echo $test;
echo "<br><br>";
$aInformation = $query->getInfo();
}
else
{
echo '<b>ERROR: UNABLE TO CONNECT TO THE SERVER</b>';
}
?>
<td><?php print_r ($aInformation['hostname']); ?></td>
</body>
</html>
Test comme sa ^^
-
Ca marche pas chez moi. Le but de ce truc c'est de voir les joueurs en ligne sur un site?
-
Il faut que votre hébergeur ai activé les sockets ^^
-
Rho dommage :(
-
Salut, voici un nouveau problème :
J'ai créé un système de log (oui oui, je sais, ça existe déja mais c'est plus clair de le faire à part :closedeyes)
Bref, les accents se transforment :
--- Déconnexion : [DX]Gilux [*.*.*.*] le 21 / 11 à 18:31:5 [Quitte]---
Que faudrait-il faire pour éviter cela ? (Sachant que pour le chat c'est pareil)
Et aussi, tant que j'y suis, ça serait possible de faire la même chose en html (avec <style></style> pour le CSS du Tableau) ?
++
-
Je pense que ceci te sera très utile pour ton problème !
http://www.commentcamarche.net/contents/html/htmlcarac.php3 (http://www.commentcamarche.net/contents/html/htmlcarac.php3)
-
Salut, je vais essayer ça :)
EDIT : Ah j'ai pigé, mes fichiers .txt s'ouvrent avec Chrome, avec le bloc notes ça passe très bien :ninja
Merci quand même ^^
-
Un gros up :D : Je viens de me rendre compte que SA:MP gère nativement des bases SQLite.
Quelqu'un peut-il m'expliquer où le fichier .db doit-il être installé, et si on peut le modifier avec PHPMyAdmin comme une base normale ?
Merci !
-
telecharge secis pour géré le SQLite ensuite
http://sourceforge.net/projects/sqlitemanager/files/ (http://sourceforge.net/projects/sqlitemanager/files/)
sinnon je n'est jamais entendue de sqlite sous samp ^^ bonne chance
++C30
-
l'include a_sampdb
/* SA-MP Native SQLite Database Functions
*
* (c) Copyright 2007, SA-MP Team
*
*/
#if defined _sampdb_included
#endinput
#endif
#define _sampdb_included
#pragma library sampdb
native DB:db_open(name[]);
native db_close(DB:db);
native DBResult:db_query(DB:db,query[]);
native db_free_result(DBResult:dbresult);
native db_num_rows(DBResult:dbresult);
native db_next_row(DBResult:dbresult);
native db_num_fields(DBResult:dbresult);
native db_field_name(DBResult:dbresult, field, result[], maxlength);
native db_get_field(DBResult:dbresult, field, result[], maxlength);
native db_get_field_assoc(DBResult:dbresult, const field[], result[], maxlength);
personnelement j'ai tester mais bon sans plus
-
lol
http://sourceforge.net/projects/sqlitebrowser/ (http://sourceforge.net/projects/sqlitebrowser/)
je me suis tromper dans le lien gilux ;)
++C30
-
Merci, et est-ce qu'on peut y accéder depuis un site distant comme le MySQL ou alors c'est juste pour le stockage des informations comme les fichiers ?
-
biensure http://php.net/manual/fr/ref.sqlite.php (http://php.net/manual/fr/ref.sqlite.php)
-
Je vais essayer un FS de register/login avec une database alors :)
-
Salut,
Continuant de porter mon tuto Pawn sur le site du zéro (Pour la seconde fois :ninja) je bute sur une chose : Qu'est-ce qu'announce.exe ?
Et aussi, petite question sans rapport : Combien de serveurs peuvent être mis sur un dédié au maximum ? (environ...)
++
-
un seul serveur samp par machine si tu remplit 500 slot ;)
++C30
-
Autant que ton dédié peut en supporter (bande passante, proco, mémoire, etc).
Pour le announce.exe, je crois qu'il sert à lister le serveur dans la liste des serveurs Internet. Je ne suis pas sûr, j'en ai même aucune idée mais ça me semble logique (vu le nom...), attends que quelqu'un confirme ou infirme. ;]
C'est parfaitement ça ^^
J'aimerai bien faire une version open source de ce soft, mais bon je ne crois pas que SAMP voudra :p
-
un seul serveur samp par machine si tu remplit 500 slot ;)
++C30
Pour une machine "commune", ça consommerait beaucoup, mais je pense que tu peux mettre plus d'un serveur par machine quand-même...
Et après, il faut bien penser à distinguer le type de machine : un VPS (RPS) est beaucoup moins puissant (autant en consommation matérielle qu'internet) qu'un véritable dédié.
Si un dédié relativement puissant (c'est à dire dans les 80-100€ / mois) est bien configuré et si les différents serveurs SA:MP sont biens codés (optimisés), je pense que les problèmes seront rencontrés au delà d'une dizaine de serveurs sur la machine. Mais tout dépend de la config et de la BP, sur un dédié moyen ou sur un VPS, tu rencontrera forcément des problèmes au delà de 3-4 serveurs...
J'ai un 750G de kimsufi, 4Go RAM, 4x 2.40 GHz, je fais tourner une quinzaine de serveurs et actuellement j'utilise actuellement exactement 624Mb et à peu près 10% du CPU. (Avec TS3, GMod, et autre applications lancées)
-
Ok, merci des infos.
Pour ceux qui veulent voir l'avancement du tuto SDZ, voici un lien : http://www.siteduzero.com/tutoriel-3-284380-1-creez-votre-serveur-sa-mp.html (http://www.siteduzero.com/tutoriel-3-284380-1-creez-votre-serveur-sa-mp.html)
Il faut être membre pour le voir, étant donné qu'il est en beta-test.
++
-
Attention, Pawn != Librairie <a_samp> :ninja
Le Pawn ne ressemble pas du tout à ce qu'on connaît ;)
-
Le Pawn n'est ni plus ni moins qu'un langage de programmation quelqu'on-que.
C'est sa nouvelle utilisation qui fait de ce langage un renouveau (AMXX ou encore SAMP).
Attention, Pawn != Librairie <a_samp>
...
-
Comme je l'ai bien précisé sur le tuto, SA:MP et sa librairie <a_samp> n'est qu'une utilisation parmi d'autres du Pawn. La preuve : on peut faire des calculettes avec du Pawn "brut" : :D
(http://www.compuphase.com/pawn/pawncalc_kde.png)
PS : C'est "quelconque" et pas "quelqu'on-que" ;)
-
Salut,
Je commence à tester le plugin MySQL de StrickenKid, et j'ai créé un petit script PHP qui permet de voir les derniers messages écrits dans le chat. De ce côté là, tout marche bien.
Par contre, au niveau du serveur, le plugin récupère bien le message, mais s'il y a un guillemet simple, cela engendre une erreur de syntaxe.
Exemple :
'Salut c'est moi Gilux.
la partie "est moi Gilux" n'est pas enregistrée.
Auriez-vous un moyen pour échapper les apostrophes ? (Comme en PHP avec addslashes pour ajouter des "\" devant les apostrophes)
++
-
À la place de le donné comme cela:
'Salut c'est moi Gilux.'
Tu l'envoi comme cela:
"Salut c'est moi Gilux."
Cela réglera surement ton problème ;).
-
À la place de le donné comme cela:
'Salut c'est moi Gilux.'
Tu l'envoi comme cela:
"Salut c'est moi Gilux."
Cela réglera surement ton problème ;).
Merci, j'y avais même pas pensé...
Je vais tester ça, j'espère que ça ne va pas faire la même chose pour les double guillemets maintenant... :ninja
++
EDIT : Eh si :D
-
Mais le problème, c'est que c'est l'utilisateur qui rentre le texte (Chat). Alors il ne va pas se soucier de mettre \ avant chaque double guillemet ;D
++
-
Tu peux te recréer une fonction mysql_real_escape_string (http://php.net/manual/fr/function.mysql-real-escape-string.php) comme en PHP. Tu remplaces simplement le guillemet par un anti-slash+guillemet. Tu peux faire pareil avec le reste comme : NULL, \x00, \n, \r, \, " et \x1a.
++
R@f
-
Ok, j'essaierai de faire ça avec strfind et strins ;)
-
Tiens, ça peut aider : http://forum.sa-mp.com/showthread.php?t=85697 (http://forum.sa-mp.com/showthread.php?t=85697)
++
R@f
-
je ne me serais pas tracasser de le sorte un simple strreplace("'","_@",text); est la meme chose dans l'autre sens
-
Merci :P
Donc mon idée, c'est de regarder le contenu du texte envoyé caractère par caractère, comme ceci :
<?php
for(new i; i <= sizeof(text); i )
{
if(text[i] == """) // Si c'est un double guillemet.
{
for(new x = i; x <= sizeof(text); x ) // On va décaler chaque caractère suivant le guillemet d'un rang.
{
text[x] = text[x 1];
}
text[i] == ""; // A l'emplacement du guillemet, on met un backslash.
}
}
Techniquement, c'est censé marcher... Je vais tester ça x)
EDIT : Chaud, j'ai réussi à me XSS tout seul xD (Marquer "<script>alert('Owned !');</script>" dans le chat :P)
(http://i47.servimg.com/u/f47/14/77/47/47/xss10.png)
-
Hihi ;) Heureusement il y a un "White Hat" pour te dire les hacks qui peut y avoir hein Mwihihi :3 . A ton service ;)
-
Ouais, merci :D
Petite mise à jour du code, je passe par une variable text2 qui m'empêche d'avoir des limitations (Au cas où quelqu'un aurait l'idée de flooder des " )
<?php
public OnPlayerText(playerid, text[])
{
new text2[200];
format(text2,sizeof(text2),"%s",text);
new query[300];
new name[20];
GetPlayerName(playerid,name,20);
for(new i; i <= sizeof(text2); i++)
{
if(text2[i] == "\"") // Ligne 83
{
for(new x = i; x <= sizeof(text2); x++)
{
text2[x] = text2[x+1];
}
text2[i] = "\\"; // Ligne 89
}
}
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text,name);
mysql_query(query,connection);
return 1;
}
J'ai toujours 2 erreurs "Array must be indexed (Variable "-unknown-")" à la ligne 83 et 89. Je ne comprend pas pourquoi... L'assignation est pourtant correcte ? ;D
EDIT : Nan mais j'te jure... Mettre "==" au lieu de "=" pour assigner une variable... ><
Ca devrait être bon maintenant, je teste :P
-
à mon avis, pour ton erreur de base de donnée qui ne s'écrit pas, comme tu me l'as dit via msn, c'est ici :
{
if(text2[i] == "\"") // Ligne 83
{
for(new x = i; x <= sizeof(text2); x++)
{
text2[x] = text2[x+1];
}
text2[i] = "\\"; // Ligne 89
}
}
Mais... je pense que tu devrais essayer ceci :
for(new x = 0; x <= sizeof(text2); x++)
{
if(text2[x] == "\"")
{
text2[x] = "\\";
}
}
-
Non, le problème ne vient pas de là ^^
<?php
public OnPlayerText(playerid, text[])
{
new text2[200];
new query[300];
new name[20];
GetPlayerName(playerid,name,20);
format(text2,sizeof(text2),"%s",text);
printf("--------------CHAT : %s --------------",text2);
for(new i; i <= sizeof(text2); i++)
{
if(text2[i] == "\"") // Si c'est un double guillemet. Ligne 85.
{
for(new x = i; x <= sizeof(text2); x++)
{
text2[x] = text2[x+1];
}
text2[i] = "\\"; // On remplace. Ligne 91.
}
}
printf("------------CHAT2 : %s---------------",text2);
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
mysql_query(query,connection);
return 1;
}
J'ai tenté de localiser le bug, le printf avec CHAT2 : %s ne s'affiche pas. Ca vient donc durant la modification.
Erreurs :
mysqltest.pwn(85) : error 033: array must be indexed (variable "-unknown-")
mysqltest.pwn(91) : error 006: must be assigned to an array
mysqltest.pwn(91) : error 029: invalid expression, assumed zero
mysqltest.pwn(91) : error 017: undefined symbol "remplace"
mysqltest.pwn(91) : fatal error 107: too many error messages on one line
En tout cas, j'abandonne pour ce soir, j'en ai marre xD
++
-
Enfin.. Si je reprends tout ton code, je ferai plutôt :
public OnPlayerText(playerid, text[])
{
new text2[200];
new query[300];
new name[20];
GetPlayerName(playerid,name,20);
text2 = text;
for(new x = 0; x <= sizeof(text2); x++)
{
if(text2[x] == "\"")
{
text2[x] = "\\";
}
}
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
mysql_query(query,connection);
return 1;
}
-
Salut,
simple précision: \" est un seul caractère, différent de " mais non pas 2 caractères. (faudrait vérifier dans ce cas.... sinon je donne la solution à la fin...)
Un peu comme l'on peut écrire \0 au lieu de 0...
En gros, tu pourrais simplement faire:
ReplaceChar(text[], char1, char2)
{
new i = 0;
while(text[i])//tant qu'on n'atteint pas la fin du texte
{
if(text[i] = char1)
text[i] = char2;
i++;
}
}
Puis dans ton OnPlayerText:
public OnPlayerText(playerid, text[])
{
new text2[128];//la bonne taille hein^^
new query[300];
new name[MAX_PLAYER_NAME];//UTILISE LES CONSTANTES!!!!
GetPlayerName(playerid, name, sizeof(name));
//text2 = text; -> à noter que ce n'est pas valide....
format(text2, sizeof(text2), "%s", text);
ReplaceChar(text2, '"', '\"');
format(query,sizeof(query),"INSERT INTO `chat` (Message, pseudo) VALUES (\"%s\", \"%s\")",text2,name);
mysql_query(query,connection);
return 1;
}
Il faut vérifier que ça peut fonctionner ainsi, sinon il faut simplement modifier légèrement la fonction pour ReplaceSubString:
ReplaceSubString(text[], sujet[], remplacement[], bool:ignorecase = false)
{
new tmpText[256];//malheureux, mais pour la taille faudra jouer...
new opos = 0, npos = 0;
new sujet_len = strlen(sujet);
new tmp = 0;
new i = strfind(text, sujet, ignorecase);
while(i >= 0 && text[i])
{
tmp = strcpy(text[opos], tmpText[npos], i - opos);
opos += tmp;
npos += tmp;
tmp = strcpy(tmpText[npos], remplacement);
npos += tmp;
/* tmp = 0;
while(opos < i)
{
tmpText[npos] = text[opos];
opos++;
npos++;
}
while(sub2[tmp])
{
tmpText[npos] = remplacement[tmp];
npos++;
tmp++;
}*/
opos += sujet_len;//on continue à chercher après le sujet trouvé...
i = strfind(text, sujet, ignorecase, opos);//recherche du sujet
}
format(text, sizeof(tmpText), tmpText);//on recopie le texte...
}
strcpy(source[], dest[], len = -1)//ptet trouver mieux comme valeur par défaut...genre 4096
{
new i = 0;
if(len == -1)
len = strlen(source);
while((source[i] = dest[i]) && i < len)
i++;
return i;
}
si vous ne voulez pas utiliser le strcpy ajouté, vous pouvez utiliser la partie en commentaire au lieu de la première partie de la boucle.
Il faut bien sur s'assurer que la chaine de caractère passée en paramètre est suffisamment longue ainsi que celle temporaire dans la fonction...
À noter que l'on pourrait inverser pour travailler sur la chaine passée en paramètre plutôt que la temporaire...
++Sim++
-
Et je ne pense pas qu'utiliser sizeof soit la meilleur des solutions, cela retourne la taille du tableau, mais pas la longueur de la chaîne de caractère !
-
Salut,
comme il s'agit de format, je suis presque certains que la fonction arrête dès la fin de la chaine de toute façon.
On peut toujours vérifier avec des test de vitesse d'exécution mais je n'ai pas vraiment envie de le faire...
++Sim++
-
Ta solution ne fonctionne pas Sim, tu remplace les guillemets (") par le caractère d'échappement \" ce qui n'a aucun effet lors de l'exécution.
#include <a_samp>
main ()
{
}
public OnGameModeInit ()
{
new MaChaine[128] = "Bonjour, voici une chaine avec des \"guillemets\"";
printf ("Avant modif : <%s>", MaChaine);
new i = 0;
while (MaChaine[i] != 0)
{
if (MaChaine[i] == '"') {printf ("Trouve"); MaChaine[i] = '\"';}
i++;
}
printf ("Apres modif : <%s>", MaChaine);
return 1;
}Résultat :
[09:52:35] Avant modif : <Bonjour, voici une chaine avec des "guillemets">
[09:52:35] Trouve
[09:52:35] Trouve
[09:52:35] Apres modif : <Bonjour, voici une chaine avec des "guillemets">
C'est la même chaîne !
Dans le cas qui nous occupe, ce qui gène c'est pas présence de " au milieu d'une requête SQL.
SQL est permissif et permet d'utiliser indifféremment des guillemet (") ou des apostrophes (').
Malheureusement, il n'y a pas de solution miracle dans le cas où c'est l'utilisateur qui saisi la chaîne car il peut saisir à la fois des guillemets et des apostrophes.
Dans ton cas, tu peux remplacer tous les guillemets (") par des apostrophes (') dans la chaîne saisie par l'utilisateur et encadrer tes chaînes par des guillemets dans ta requête SQL.
++
Syg
-
Salut,
dans ce cas, on peut utiliser la deuxième fonction que j'ai codé (ou l'équivalent, comme c'est codé sur le forum, peut contenir des erreurs) pour faire le remplacement.
Il suffirait de faire:
ReplaceSubString(text, "\"", "_01");
ReplaceSubString(text, "\'", "_02");
Avant la requête et l'inverse quand on récupère les infos depuis le serveur MySQL.
++Sim++
-
je ne me serais pas tracasser de le sorte un simple strreplace("'","_@",text); est la meme chose dans l'autre sens
sa reprend ce que je disais ^^
-
Il ne faudrait pas remplacer '"' par "\"" ? et non pas '"' par '\"' qui revient à la même chose ?
-
si on se base comme en php par exemple on peut faire comme ceci
print("il n'y a pas de soleil");//cela fonctionne
print('il n\'y a pas de soleil');//fonctionne aussi
print("il n\'y a pas de soleil");//cela afficheras l'antislash
print('il n'y pas de soleil');//ici nous avon une errore Parse error: syntax error, unexpected T_STRING qui est deja visible avec la coloration de synthaxe
-
Merci de vos aides, je vais essayer de voir ça dans l'après-midi ;)