2016-02-03 22:22:18 +00:00
|
|
|
<?php
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
namespace manager;
|
|
|
|
|
|
|
|
|
2016-07-21 19:12:53 +00:00
|
|
|
class Database{
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-02-04 20:15:43 +00:00
|
|
|
/* ATTRIBUTS STATIQUES */
|
2016-07-24 17:18:55 +00:00
|
|
|
public static function config_path(){
|
|
|
|
return [
|
|
|
|
'local' => __ROOT__.'/config/database-local.json',
|
|
|
|
'remote' => __ROOT__.'/config/database.json'
|
|
|
|
];
|
|
|
|
}
|
2016-02-12 21:07:46 +00:00
|
|
|
|
2016-02-04 20:15:43 +00:00
|
|
|
private static $pdo;
|
|
|
|
private static $instance;
|
|
|
|
|
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
/* ATTRIBUTS */
|
|
|
|
private $host;
|
|
|
|
private $dbname;
|
|
|
|
private $username;
|
|
|
|
private $password;
|
|
|
|
|
2016-02-12 21:07:46 +00:00
|
|
|
public static $error;
|
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
|
|
|
|
public function __construct($host, $dbname, $username, $password){
|
|
|
|
$this->host = $host;
|
|
|
|
$this->dbname = $dbname;
|
|
|
|
$this->username = $username;
|
|
|
|
$this->password = $password;
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
try{
|
2016-02-12 21:07:46 +00:00
|
|
|
self::$pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password);
|
|
|
|
|
|
|
|
// On signale que tout s'est bien passe
|
2016-02-13 17:41:19 +00:00
|
|
|
self::$error = ManagerError::Success;
|
2016-02-12 21:07:46 +00:00
|
|
|
|
|
|
|
}catch(Exception $e){
|
|
|
|
// On signale qu'il y a une erreur
|
2016-02-13 17:41:19 +00:00
|
|
|
self::$error = ManagerError::PDOConnection;
|
2016-02-12 21:07:46 +00:00
|
|
|
}
|
2016-02-03 22:22:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* retourne une instance de la classe */
|
|
|
|
public static function getInstance(){
|
2016-02-13 17:41:19 +00:00
|
|
|
if( self::$instance == null || self::$error != ManagerError::Success ){ // Si aucune instance existante OU erreur de connection
|
2016-02-03 22:22:18 +00:00
|
|
|
|
|
|
|
// chargement de la configuration du server SQL
|
2016-07-02 15:10:41 +00:00
|
|
|
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
|
2016-07-24 17:18:55 +00:00
|
|
|
$conf = json_decode( file_get_contents(self::config_path()['local']), true );
|
2016-02-08 20:46:11 +00:00
|
|
|
else
|
2016-07-24 17:18:55 +00:00
|
|
|
$conf = json_decode( file_get_contents(self::config_path()['remote']), true );
|
2016-02-04 20:15:43 +00:00
|
|
|
|
|
|
|
// creation de l'instance en fonction des parametres
|
2016-02-03 22:22:18 +00:00
|
|
|
self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']);
|
|
|
|
|
|
|
|
}
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
return self::$instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* retourne la connection statique */
|
|
|
|
public static function getPDO(){
|
|
|
|
$instance = self::getInstance();
|
2016-02-12 21:07:46 +00:00
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
return self::$pdo;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-12 21:07:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getConfig(){
|
2016-07-04 13:45:29 +00:00
|
|
|
return [
|
2016-02-12 21:07:46 +00:00
|
|
|
'host' => $this->host,
|
|
|
|
'username' => $this->username
|
2016-07-04 13:45:29 +00:00
|
|
|
];
|
2016-02-12 21:07:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
/*************************************************************/
|
|
|
|
/* _____ ______ _ _ ______ _____ _ */
|
|
|
|
/* / ____| ____| \ | | ____| __ \ /\ | | */
|
|
|
|
/* | | __| |__ | \| | |__ | |__) | / \ | | */
|
|
|
|
/* | | |_ | __| | . ` | __| | _ / / /\ \ | | */
|
|
|
|
/* | |__| | |____| |\ | |____| | \ \ / ____ \| |____ */
|
|
|
|
/* \_____|______|_| \_|______|_| \_\/_/ \_\______| */
|
|
|
|
/* */
|
|
|
|
/*************************************************************/
|
|
|
|
|
|
|
|
/* SUPPRIME LES VALEURS À CLÉS NUMÉRIQUES DANS UN FETCH D'UNE TABLE DE LA BDD
|
|
|
|
*
|
|
|
|
* @fetchData<Array> le résultat d'une $requeteSQL->fetchAll()
|
2016-02-11 15:00:41 +00:00
|
|
|
* @oneDimension<Boolean> FAUX <=> fetchAll ; VRAI <=> fetch
|
2016-02-03 22:22:18 +00:00
|
|
|
*
|
2016-07-02 15:10:41 +00:00
|
|
|
* @return newFetchData<Array> retourne le tableau donné en paramètre mais sans les valeurs à clés numériques
|
2016-02-03 22:22:18 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static function delNumeric($fetchData, $oneDimension=false){
|
2016-02-14 12:28:35 +00:00
|
|
|
// On quitte si ce n'est pas un tableau
|
|
|
|
if( !is_array($fetchData) )
|
2016-07-04 13:45:29 +00:00
|
|
|
return [];
|
2016-02-14 12:28:35 +00:00
|
|
|
|
2016-02-12 19:49:03 +00:00
|
|
|
$nextEquivalent = false; // Vaut VRAI si le prochain est peut-etre un equivalent numerique
|
2016-02-03 22:22:18 +00:00
|
|
|
|
|
|
|
/* [1] 2 dimensions
|
|
|
|
===============================================*/
|
2016-02-14 12:28:35 +00:00
|
|
|
if( !$oneDimension && isset($fetchData[0]) && is_array($fetchData[0]) ){
|
2016-02-03 22:22:18 +00:00
|
|
|
|
2016-02-12 19:49:03 +00:00
|
|
|
// on supprime les doublons des entrées (indice numérique)
|
2016-07-22 17:51:03 +00:00
|
|
|
for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour toutes les lignes
|
2016-02-12 19:49:03 +00:00
|
|
|
foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
if( !\mb_detect_encoding($val, 'UTF-8') )
|
2016-02-12 19:49:03 +00:00
|
|
|
$fetchData[$i][$col] = utf8_encode($val);
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
if( is_int($col) ){ // Si indice numerique
|
|
|
|
if( $nextEquivalent ) // Si suit un indice textuel
|
|
|
|
unset( $fetchData[$i][$col] ); // on supprime l'indice
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
$nextEquivalent = false; // Dans tous les cas, on dit que le prochain ne pourra pas etre supprime si numerique
|
2016-02-12 19:49:03 +00:00
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
}else // Si l'indice n'est pas un entier
|
|
|
|
$nextEquivalent = true; // On signale qu'il y aura peut etre un indice numerique suivant
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
}
|
2016-02-03 22:22:18 +00:00
|
|
|
|
|
|
|
/* [2] 1 dimensions
|
|
|
|
===============================================*/
|
|
|
|
}else{
|
|
|
|
|
|
|
|
// on supprime les doublons des entrées (indice numérique)
|
|
|
|
foreach($fetchData as $i=>$val){ // pour toutes les entrées
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
if( !\mb_detect_encoding($val, 'UTF-8') )
|
2016-02-03 22:22:18 +00:00
|
|
|
$fetchData[$i] = utf8_encode($val);
|
|
|
|
|
2016-02-12 19:49:03 +00:00
|
|
|
if( is_int($i) ){ // Si indice numerique
|
|
|
|
if( $nextEquivalent ) // Si suit un indice textuel
|
|
|
|
unset( $fetchData[$i] ); // on supprime l'indice
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-02-12 19:49:03 +00:00
|
|
|
$nextEquivalent = false; // Dans tous les cas, on dit que le prochain ne pourra pas etre supprime si numerique
|
|
|
|
|
|
|
|
}else // Si l'indice n'est pas un entier
|
|
|
|
$nextEquivalent = true; // On signale qu'il y aura peut etre un indice numerique suivant
|
|
|
|
|
2016-02-03 22:22:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return $fetchData;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-11 15:00:41 +00:00
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
|
|
|
|
/* GESTION DE L'AUTO-TYPAGE D'UN TABLEAU A UN/PLUSIEURS NIVEAU(X) OU D'UNE VALEUR
|
|
|
|
*
|
|
|
|
* @data<mixed> Tableau de données/Valeur
|
|
|
|
*
|
|
|
|
* @return autoTyped<Array> Tableau/Valeur auto-typé(e)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static function autotype($data){
|
|
|
|
$autotyped = $data;
|
|
|
|
|
|
|
|
/* [0] Gestion des types simples
|
|
|
|
=========================================================*/
|
|
|
|
if( !is_array($autotyped) ){
|
|
|
|
|
|
|
|
/* (1) Si Numérique Entier -> INT */
|
2016-07-19 16:59:56 +00:00
|
|
|
if( preg_match('/^(0|([1-9][0-9]*))$/i', $autotyped) )
|
2016-07-19 16:20:42 +00:00
|
|
|
return intval($autotyped);
|
|
|
|
|
|
|
|
/* (2) Si Numérique Décimal -> FLOAT */
|
2016-07-19 16:59:56 +00:00
|
|
|
else if( preg_match('/^(0|(?:[1-9][0-9]*))[\.\,]([0-9]+)$/i', $autotyped, $m) )
|
|
|
|
return floatval("${m[1]}.${m[2]}");
|
2016-07-19 16:20:42 +00:00
|
|
|
|
|
|
|
/* (3) Sinon on retourne la même chose */
|
|
|
|
else
|
|
|
|
return $autotyped;
|
|
|
|
|
|
|
|
/* [1] Gestion des types composés
|
|
|
|
=========================================================*/
|
|
|
|
}else{
|
|
|
|
|
2016-07-19 16:59:56 +00:00
|
|
|
/* (1) Pour chaque valeur, on applique récursivement */
|
|
|
|
foreach($autotyped as $k=>$v){
|
|
|
|
|
|
|
|
// Si on met '_nomColonne', on ne le traite pas
|
|
|
|
if( is_string($k) && $k[0] == '_' ) continue;
|
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
$autotyped[$k] = self::autotype($v);
|
|
|
|
|
2016-07-19 16:59:56 +00:00
|
|
|
}
|
|
|
|
|
2016-07-19 16:20:42 +00:00
|
|
|
}
|
|
|
|
|
2016-07-19 16:59:56 +00:00
|
|
|
|
|
|
|
/* [2] On retourne le résultat auto-typé
|
|
|
|
=========================================================*/
|
2016-07-19 16:20:42 +00:00
|
|
|
return $autotyped;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-11 15:00:41 +00:00
|
|
|
////////////////////////////////////////////////////////////////
|
2016-07-02 15:10:41 +00:00
|
|
|
// _ __ _ _ _
|
|
|
|
// __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___
|
|
|
|
// \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __|
|
|
|
|
// \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \
|
|
|
|
// \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/
|
|
|
|
//
|
2016-02-11 15:00:41 +00:00
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
/* VERIFICATIONS DES TYPES UTILES GENERIQUES
|
|
|
|
*
|
|
|
|
* @type<String> Type que l'on veut verifier
|
|
|
|
* @value<mixed*> Valeur a verifier
|
|
|
|
*
|
|
|
|
* @return match<Boolean> Retourne si oui ou non la valeur @value est du bon type @type
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static function check($type, $value){
|
2016-07-02 15:10:41 +00:00
|
|
|
$checker = true;
|
|
|
|
|
|
|
|
/* [0] On verifie que $value n'est pas nul
|
|
|
|
=========================================================*/
|
|
|
|
if( is_null($value) ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-07-02 15:46:59 +00:00
|
|
|
/* [1] Si de type VARCHAR(min, max, flags)
|
2016-07-02 15:10:41 +00:00
|
|
|
=========================================================*/
|
2016-07-02 15:46:59 +00:00
|
|
|
if( preg_match('/^varchar\((\d+), ?(\d+)((?:, ?\w+)+)?\)$/', $type, $match) ){
|
2016-07-02 15:10:41 +00:00
|
|
|
// On recupere la taille min
|
|
|
|
$min = (int) $match[1];
|
|
|
|
// On recupere la taille max
|
|
|
|
$max = (int) $match[2];
|
|
|
|
|
2016-07-02 15:46:59 +00:00
|
|
|
// On recupere le sous-type si défini
|
|
|
|
$flags = isset($match[3]) ? explode(',', substr($match[3], 1)) : null;
|
|
|
|
|
|
|
|
// On effectue la verification de taille
|
|
|
|
$lenCheck = $checker && is_string($value) && strlen($value) <= $max && strlen($value) >= $min;
|
|
|
|
|
|
|
|
// On vérifie les FLAGS s'il est donné
|
|
|
|
if( is_array($flags) )
|
|
|
|
foreach( $flags as $flag )
|
|
|
|
$lenCheck = $lenCheck && self::check($flag, $value);
|
|
|
|
|
|
|
|
return $lenCheck;
|
2016-07-02 15:10:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] Si de type ARRAY(type_elements)
|
|
|
|
=========================================================*/
|
|
|
|
if( preg_match('/^array<(.+)>$/', $type, $match) ){
|
|
|
|
|
|
|
|
// Si c'est pas un tableau on retourne une erreur
|
|
|
|
if( !is_array($value) )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
$elements_type = $match[1];
|
|
|
|
|
|
|
|
// On verifie le type pour chaque element
|
|
|
|
foreach($value as $element)
|
|
|
|
// Si erreur dans au moins 1 element, on retourne que c'est incorrect
|
2016-07-03 12:57:25 +00:00
|
|
|
if( !self::check($elements_type, trim($element) ) )
|
2016-07-02 15:10:41 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
// Si aucune erreur, on retourne que tout est bon
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* [n] Sinon, tous les autres types definis
|
|
|
|
=========================================================*/
|
2016-02-11 15:00:41 +00:00
|
|
|
switch($type){
|
2016-07-02 15:10:41 +00:00
|
|
|
// Quoi que ce soit
|
|
|
|
case 'mixed':
|
|
|
|
return $checker && !is_null($value);
|
2016-02-11 15:00:41 +00:00
|
|
|
break;
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
// Entier positif (id dans BDD)
|
|
|
|
case 'id':
|
|
|
|
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0;
|
2016-02-11 15:00:41 +00:00
|
|
|
break;
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-07-02 15:46:59 +00:00
|
|
|
// Code RFID
|
|
|
|
case 'rfid':
|
|
|
|
return $checker && is_string($value) && preg_match('/^[\dA-F]{2}(\-[\dA-F]{2}){3,5}$/i', $value);
|
|
|
|
break;
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
// String quelconque (peut etre vide)
|
|
|
|
case 'text':
|
|
|
|
return $checker && is_string($value);
|
|
|
|
|
|
|
|
// Adresse mail (255 caracteres max)
|
|
|
|
case 'mail':
|
2016-02-11 15:00:41 +00:00
|
|
|
return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value);
|
|
|
|
break;
|
2016-07-02 15:10:41 +00:00
|
|
|
|
2016-07-02 15:46:59 +00:00
|
|
|
// Hash sha1/md5
|
|
|
|
case 'hash':
|
2016-02-12 19:49:03 +00:00
|
|
|
return $checker && is_string($value) && preg_match('/^[\da-f]{40}$/i', $value);
|
2016-02-11 15:00:41 +00:00
|
|
|
break;
|
|
|
|
|
2016-07-02 15:46:59 +00:00
|
|
|
case 'alphanumeric':
|
|
|
|
case 'user.username':
|
|
|
|
case 'group.name':
|
|
|
|
return $checker && is_string($value) && preg_match('/^[\w-]+$/i', $value);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'user.firstname':
|
|
|
|
case 'user.lastname':
|
|
|
|
case 'letters':
|
|
|
|
return $checker && is_string($value) && preg_match('/^[a-z -]+$/i', $value);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'status':
|
|
|
|
return $checker && is_numeric($value) && floor($value) == $value && $value >= 0 && $value <= 100;
|
2016-02-12 22:22:14 +00:00
|
|
|
break;
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
// Tableau non vide
|
|
|
|
case 'array':
|
|
|
|
return $checker && is_array($value) && count($value) > 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Boolean
|
|
|
|
case 'boolean':
|
|
|
|
return $checker && is_bool($value);
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Objet non vide
|
|
|
|
case 'object':
|
|
|
|
return $checker && is_object($value) && count((array) $value) > 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Chaine JSON (on vérifie via le parser)
|
|
|
|
case 'json':
|
|
|
|
return $checker && is_string($value) && json_decode($value, true) !== NULL;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
break;
|
2016-02-11 15:00:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $checker;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* FONCTION QUI FORMATTE UN NUMÉRO DE TÉLÉPHONE
|
|
|
|
*
|
|
|
|
* @number<String> Numéro de téléphone en +336/336/06/0336/00336
|
|
|
|
*
|
|
|
|
* @return formatted<String> Numéro formatté (06), on FALSE si erreur
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static function formatNumber($number){
|
|
|
|
// On met en <string> quel que soit le type
|
|
|
|
$number = (string) $number;
|
|
|
|
|
|
|
|
// On supprime tous les espaces
|
|
|
|
$number = str_replace(' ', '', $number);
|
|
|
|
|
|
|
|
// On formatte le numéro
|
|
|
|
if( preg_match("/^(?:\+33|0?0?33|0)(.+)/", $number, $m) )
|
|
|
|
$number = '0'.$m[1];
|
|
|
|
|
|
|
|
// On retourne le numéro formatté
|
|
|
|
return $number;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static function readableNumber($number){
|
|
|
|
/* (1) On formatte le numéro si c'est pas fait */
|
|
|
|
$formatted = self::formatNumber($number);
|
|
|
|
|
|
|
|
for( $i = 1 ; $i < strlen($formatted) ; $i++ )
|
|
|
|
if( ($i-2) % 3 == 0 )
|
|
|
|
$formatted = substr($formatted, 0, $i).' '.substr($formatted, $i);
|
|
|
|
|
|
|
|
return $formatted;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
// _ _
|
|
|
|
// __| | __ _| |_ ___ ___
|
|
|
|
// / _` |/ _` | __/ _ \/ __|
|
|
|
|
// | (_| | (_| | || __/\__ \
|
|
|
|
// \__,_|\__,_|\__\___||___/
|
|
|
|
//
|
|
|
|
////////////////////////////////////
|
|
|
|
// 1) Convertis une date en en francais explicite
|
|
|
|
public static function frDate($date){
|
|
|
|
/* [1] On definit les traductions
|
|
|
|
=========================================================*/
|
|
|
|
// Jours de la semaine
|
2016-07-04 13:45:29 +00:00
|
|
|
$days = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"];
|
2016-07-02 15:10:41 +00:00
|
|
|
// Mois de l'annee
|
2016-07-04 13:45:29 +00:00
|
|
|
$months = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"];
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
/* [2] On recupere le timestamp et les indices
|
|
|
|
=========================================================*/
|
|
|
|
$time = strtotime($date); // timestamp
|
|
|
|
$daynum = intval( date('N', $time)-1 ); // jour dans la semaine
|
|
|
|
$monthnum = intval( date('n', $time)-1 ); // numero du mois dans l'annee
|
|
|
|
|
|
|
|
|
|
|
|
/* [3] On recupere les infos independemment
|
|
|
|
=========================================================*/
|
2016-07-04 13:45:29 +00:00
|
|
|
$result = [
|
2016-07-02 15:10:41 +00:00
|
|
|
$days[$daynum], // nom de jour
|
|
|
|
date('j', $time), // jour du mois
|
|
|
|
$months[$monthnum], // nom du mois
|
|
|
|
date('Y', $time), // annee
|
2016-07-04 13:45:29 +00:00
|
|
|
];
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
return implode(" ", $result);
|
|
|
|
}
|
|
|
|
|
2016-02-11 15:00:41 +00:00
|
|
|
}
|
2016-02-03 22:22:18 +00:00
|
|
|
?>
|