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.
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 ).
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;"> </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...
|