JeuWeb - Crée ton jeu par navigateur
Vos ptites fonctions - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Vos ptites fonctions (/showthread.php?tid=1995)

Pages : 1 2 3 4 5 6 7


Vos ptites fonctions - Psykose - 01-04-2008

Salut à tous,
JeuPHP étant un forum d'entraide et de partage je lance ce sujet pour partager nos ptites fonctions (pas assez complexes que pour allez dans script) et qui peuvent nous simplifier la vie.

En voici deux (et leurs applications) :
Code PHP :
<?php 
//Cette fonction à pour but de voir si une entrée existe déja dans une table
function UniqueEntry($entry, $field, $table){
$SQLQuery = mysql_query("SELECT $field FROM $table WHERE $field='$entry'");
$SQLFetch = mysql_fetch_array($SQLQuery);
if(empty(
$SQLFetch)){
return
TRUE;
}
else{
return
FALSE;
}
}

//... (connexion sql nécessaire)

//Exemple d'application :
$Utilisateur = $_POST['usr_name'];
$Utilisateur = ucwords(strtolower($Utilisateur));
$Utilisateur = mysql_real_escape_string($Utilisateur);

if(
UniqueEntry($Utilisateur, 'Usr_Name', 'Usr_Data')){
mysql_query("INSERT INTO user_data VALUES('', '$Utilisateur', '$Passwd')");
}

Et voici la deuxieme :
Code PHP :
<?php 
//permet de vérifier si la variable est un nombre
function is_number($var){
if(
preg_match("#^[0-9]+$#", $var)){
return
TRUE;
}
else{ return
FALSE; }
}

Voila pour moi ^^


RE: Vos ptites fonctions - Sephi-Chan - 01-04-2008

La première peut être utile, même si on peut utiliser les mécanismes de la base de donnée (la clause UNIQUE) peut suffire.

La seconde, en revanche, est totalement inutile puisqu'il existe is_numeric. Smile


Sephi-Chan


RE: Vos ptites fonctions - Psykose - 01-04-2008

Oui mais c'est utile par exemple lorsque l'on plcae un joueur sur une map, si on utilise ma fonction, on peut générer une autre place sur la map
Code PHP :
<?php 
$X_coord
= mt_rand(0, 120);
$Y_coord = mt_rand(0, 120);
$XY_coord = $X_coord . '-' . $Y_coord;
if(
UniqueEntry($XY_coord, 'coordonnées', 'users')){
//rentrer les coordonnes dans mysql
}
else{
unset(
"$X_coord"); unset("$Y_coord"); unset("$XY_coord");
$X_coord = mt_rand(0, 120);
$Y_coord = mt_rand(0, 120);
$XY_coord = $X_coord . '-' . $Y_coord;
//rentrer les coordonnes dans mysql
}

et on peux également retourner un message d'erreur plus agréable qu'une erreur Sql à l'utilisateur.

is_numeric autorise les + et les -, is_number autorise uniquement les nombres.


RE: Vos ptites fonctions - Sephi-Chan - 01-04-2008

Psykose a écrit :Oui mais c'est utile par exemple lorsque l'on plcae un joueur sur une map, si on utilise ma fonction, on peut générer une autre place sur la map, et on peux également retourner un messaage d'erreur plus agréable qu'une erreur Sql à l'utilisateur.

is_numeric autorise les + et les -, is_number autorise uniquement les nombres.
Un nombre non signé équivaut à un nombre positif. Ta fonction est moins flexible qu'un is_numeric couplé à un $var > 0. Elle est aussi beaucoup plus gourmande en temps d'exécution (même si ça ne se voit pas à notre échelle Wink).

Quand à la fonction qui vérifie les duplicatas, tu as la possibilité de faire ça avec SQL, en faisant en sorte que si tu as une erreur SQL de type duplicata, tu lances une autre opération.

Exemple :
Code PHP :
<?php 
$query
= sprintf(
"INSERT INTO flight_collect_ressource (
flight_id,
territory_id,
seelie_id,
ressource_id,
quantity,
uniqueness
)
VALUES (%d, %d, %d, %d, %d, '%s')
ON DUPLICATE KEY
UPDATE quantity = %5\$d,
seelie_id = %3\$d;"
,
$this->flightId,
$this->territoryId,
$this->id,
(int)
$ressource,
(int)
$quantity,
(string) (
$this->flightId.$this->territoryId.(int) $ressource)
);

Ça me permet de créer une entrée qui dit : Sur ce territoire, le Vol (c'est le nom des guildes dans mon jeu) récolte x% des ressources de type R auquel il a le droit. C'est donc une entrée unique, et en gros, quand une Seelie du Vol édite ces préférences, on ne peut pas savoir si l'entrée existe déjà (auquel cas il faut la modifier plutôt que d'en insérer une nouvelle). Et bien avec mon script, ça fait ça de manière transparente. Et cela sans lancer 2 requêtes séparément.

Concernant les messages d'erreurs, un jeu (ou même un site) en production ne doit jamais les afficher, donc déjà à la base, tu n'auras pas à le faire. Et ensuite, après un UPDATE/INSERT ou un SELECT dans ta fonction, il faut faire :

Pour un UPDATE ou INSERT :
Code PHP :
<?php 
$sql
= mysql_query($query);
if(
mysql_affected_rows() > 0){ return TRUE; }
else { return
FALSE; }

Pour un SELECT :
Code PHP :
<?php 
$sql
= mysql_query($query);
if(
mysql_num_rows($sql) > 0){ return TRUE; }
else { return
FALSE; }

Comme ça, dans ton code, tu fais :
Code PHP :
<?php 
if(taFonction()){ echo "C'est bon."; }
else { echo
"Une erreur est survenue." }


Sephi-Chan


RE: Vos ptites fonctions - Anthor - 01-04-2008

Quitte à proposer des fonctions qui pour ma part sont inutiles, autant qu'elle soit propre, et optimisée...
Code PHP :
<?php 
function UniqueEntry($entry, $field, $table){
$SQLQuery = mysql_query('SELECT `'.$field.'` FROM `'.$table.'` WHERE `'.$field.'` = `'.$entry.'`');
if(
mysql_num_rows($SQLQuery) !== 1)
return
false;

return
true;
}

Ben oui unique c'est un résultat pas deux... et en plus c'est magnifique mysql te fournit une fonction pour connaitre le nombre de lignes retournée ! C'est quand même bien pensé...


RE: Vos ptites fonctions - Eluox - 01-04-2008

Tant qu'on ai dans les fonctions en mousse :

Code PHP :
<?php 
function doquery($query, $fetch = false)
{
global
$link, $root_path;
if(!
$link)
{
require(
$root_path.'includes/config.php');
$link = mysql_connect($dbsettings["server"], $dbsettings["user"], $dbsettings["pass"])
or die (
"Erreur de connexion a la bdd: ".mysql_error());
mysql_select_db($dbsettings["name"],$link) or die ("Erreur de selection de bdd: ".mysql_error());
}

$result = mysql_query($query) or die ('Erreur SQL: '.mysql_error().'<br />Requete: '.$query);
if(
$fetch)
{
$result = mysql_fetch_assoc($result);
}
return
$result;
}

function
pretty_number($n,$floor=true)
{
if(
$floor)
{
$n = floor($n);
}
return
number_format($n,0,",",".");
}

function
array_search_multidim($array, $sub_key, $sub_value) {
$result = "N/D";
foreach(
$array as $key => $sub_array) {
if(
$sub_array[$sub_key] == $sub_value) {
$result = $key;
break;
}
}
return
$result;
}


[php]


RE: Vos ptites fonctions - Anthor - 01-04-2008

...

Multidimensionnel ?
A deux niveaux, mais a 3 ou 4 ?


RE: Vos ptites fonctions - phenix - 01-04-2008

Aller vu que je suis un gros producteur de fonction a la con je mis met aussi :p:


Code PHP :
<?php 
//Détecter l'ip
function get_ip()
{
return (isset(
$_SERVER['HTTP_X_FORWARDED_FOR'])) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
}

//fonction de calcule de %tage

function pourcent($nombre,$pourcent)

{

$nbr = ($nombre*$pourcent)/100;

return
round($nbr);

}
//Crée une barre de statut
function statut_barre($valeur,$max,$echelle)

{

$size = ($valeur/$max)*$echelle;

return
'<div style="height:13px; width:'.$echelle.'px; float:left; background-color:#FF0000;
-moz-border-radius:15px;"><div style="float:left; height:10px; width:'
. $size .
'px; background-color:#008000;border:#006400 2px solid; -moz-border-radius:15px;">&nbsp;</div></div>';

}

//Fontion affichage de message alerte

function alert($mess)

{

echo
'<script language=\'javascript\'>alert(\'',str_replace('"','\"',str_replace('\'','\\\'',$mess)),'\');</script>';

}

//Fonction bbcode

function bbcode($t)

{

$t = preg_replace("!\[(url|email)\](.+)\[/(?:url|email)\]!Ui","[$1=$2]$2[/$1]",$t);

$t = preg_replace("!\[url=([^\]]+)\](.+)\[/url\]!Ui","<a href=\"$1\" target=\"_blank\">$2</a>",$t);

$t = preg_replace("!\[email=([^\]]+)\](.+)\[/email\]!Ui","<a href=\"mailto:$1\" target=\"_blank\">$2</a>",$t);

$t = preg_replace("!\[img\](.+)\[/img\]!Ui","<img src=\"$1\" alt=\"\" border=\"0\">",$t);

$t = preg_replace("!\[(/?[biu])\]!mi","<$1>",$t);

$t = preg_replace("!\[color=([^\]]+)\]!mi","<font style=\"color: $1;\">",$t);

$t = preg_replace("!\[size=([^\]]+)\]!mi","<font style=\"font-size: $1px;\">",$t);

$t = preg_replace("!\[/(?:color|size)\]!i","</font>",$t);

//$q1 et $c1 sont à personnaliser...

$q1 = "<table align=center border=0 cellpadding=3 cellspacing=1 width=90%><tbody><tr><td><span style=\"font-size : 11px\"><b>";

$q2 = "</b></span></td></tr><tr><td style=\"font-family: Verdana, sans-serif; font-size: 11px; color: #444444;
background-color: #FAFAFA; border: #D1D7DC; border-style: solid; border-width: 1px\">"
;

$q3 = "</td></tr></tbody></table>";

$t = preg_replace("!\[quote=([^\]]+)\](.+)\[/quote\]!Umi","$q1 $1 a écrit :$q2 $2 $q3",$t);

$t = preg_replace("!\[quote\](.+)\[/quote\]!Umi","$q1 Citation : $q2 $1 $q3",$t);

$c1 = "<table align=center border=0 cellpadding=3 cellspacing=1 width=90%><tbody>
<tr><td style=\"font-family: TimesNewRoman, sans-serif; font-size: 11px;
color: #444444; background-color: #FAFAFA;
border: #D1D7DC; border-style: solid; border-width: 1px\">"
;

$t = preg_replace("!\[code\](.+)\[/code\]!Umi","$c1 $1 $q3",$t);

$t = preg_replace("!\[list\](.+)\[/list\]!Umi","<ul> $1 </ul>",$t);

$t = preg_replace("!\[\*\](.+)(?=(\[\*\]|</ul>))!Umi","<li>$1</li>",$t);

return
$t;

}

//Fonction de redirection

function redirect($url)

{


echo
'<script language=\'javascript\' type=\'text/javascript\'>

<!--

window.location.replace(\''
,$url,'\');

-->

</script>'
;

exit;

}
//Fonction qui supprime tout les saut de ligne (dans tout les OS !)

function new_trim($src)

{

$src = str_replace(array("\r\n", "\n", "\r"), " ", $src);

return
$src;

}

//Detecter si un objet est proche d'un autre a partir de leur coordonnée
function isProche($xA,$yA,$xB,$yB,$d)
{

return
max(abs($xA-$xB),abs($yA-$yB)) <= $d;

}
//supprime les n° d'un chaine
function no_num($chaine)

{

$num = '1234567890';

$nonum= ' ';

$chaine = strtr(trim($chaine),$num,$nonum);

$chaine = str_replace(' ', '', $chaine);



return
$chaine;

}


Y en a des très conne je sais :good:

Phenix


RE: Vos ptites fonctions - Psykose - 01-04-2008

pour nonum tu fais tout simplement :
Code PHP :
<?php 
function no_num($chaine){
$chaine = preg_replace("#[0-9]+#", "");

return
$chaine;
}



RE: Vos ptites fonctions - Zamentur - 02-04-2008

#rediriger()
Code PHP :
<?php 
function rediriger($url_relative) {
header('location: http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\').'/'.$url_relative);
exit();
}
Cette fonction permet de rediriger une page avec une URL relative. Car normalement il faut mettre une URL absolue car certains hebergeur couplé à IE (ou FF je sais plus lequel) ne redirige pas dans le cas contraire...

Le exit(); est peut être de trop, en fait il est toujours justifié sauf avec une méthode de mise à jour assynchrone situé derriere une redirection...

#ses_debut()
Code PHP :
<?php 
function ses_debut() {
if (!isset(
$_SESSION['start'])) {
session_start();
$_SESSION['start']=true;
}
}
Fonction qui evite le message d'erreur lorsqu'on lance 2 session_start d'affiler (par exemple avec une inclusion)

#get_var()
Code PHP :
<?php 
function get_var($id,$sql=false) {
if (
$sql) return mysql_real_escape_string((!isset($_POST[$id]))?@$_GET[$id]:$_POST[$id]);
else return (!isset(
$_POST[$id]))?@$_GET[$id]:$_POST[$id];
}
Permet de recuperer une variable transmise par POST ou par GET , et de la proteger contre l'injection sql si elle est destinée à une fonction sql
En fait je suis en train de faire bien mieux avec une classe, d'ailleur pour des questions de sécurité les id devraient être dynamique...