fxQuery($sqlInsert); } } break; case 'mod': if (isset($values)) { $values_old1 = explode(',', $values_old); foreach ($values as $id) { // si c'est un nouvel item if (!in_array($id, $values_old1)) { $sqlInsert = "INSERT INTO " . $table . "(" . $link . ", " . $field . ") VALUES(" . intval($link_value) . ", " . intval($id) . ")"; $qryInsert = $GLOBALS['db_blog']->fxQuery($sqlInsert); } } // vérifier si on doit en supprimer if ($values_old != '') { foreach ($values_old1 as $id) { // si il existait avant, et plus maintenant if (!in_array($id, $values)) { $sqlDelete = "DELETE FROM " . $table . " WHERE " . $link . " = " . intval($link_value) . " AND " . $field . " = " . intval($id); $qryDelete = mysql_query($sqlDelete); } } } } elseif ($values_old != '') { $sqlDelete = "DELETE FROM " . $table . " WHERE " . $link . " = " . intval($link_value); $qryDelete = mysql_query($sqlDelete); } } } // fonction qui va cherdcher les étiquettes dans la bdd // param : page, table, langue /* function fxGetLabels($strPage, $strTable, $strLangue) { $sqlLabel1 = "SELECT info_clef,info_texte,pk_info,'client' as bd FROM info where info_prg='" . $page . "' and info_langue='" . $Langue . "'"; $tabLabel1 = $GLOBALS['db']->fxFetchArray(3, $sql_info); $sqlLabel2 = "SELECT info_clef,info_texte,'centrale' as bd FROM info where info_prg='" . $page . "' and info_langue='" . $Langue . "'"; $tabLabel2 = $GLOBALS['db']->fxFetchArray(3, $sql_info); $info = array_merge($info1, $info2); } */ // MOT DE PASSE PERDU function fxCourrielPerdu() { $sqlPerdu = "SELECT * FROM usagers WHERE usa_courriel = '" . $GLOBALS['db']->fxEscape($_POST['courriel']) . "' AND usa_actif = 1"; $recPerdu = $GLOBALS['db']->fxGetRow($sqlPerdu); if ($recPerdu != null) $perdu = -1; else { require_once('mailer/class.phpmailer.php'); //include("mailer/class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded $mail = new PHPMailer(); $body = "Bonjour " . $recPerdu['usa_prenom'] . ",\n\nsuite à votre demande, voici vos informations de connexion à l'administration de " . $GLOBALS['vClient'] . ":\n\nNom d'usager: " . $recPerdu['usa_login'] . "\nMot de passe: " . $recPerdu['usa_password'] . "\n\nVeuillez conserver ces informations.\nMerci\n\n\nMessage envoyé automatiquement le: " . fxShowDate(fxGetDate(), 'fr') . " @ " . fxGetTime(); $mail->SetFrom($GLOBALS['vEmail'], $GLOBALS['vClient']); $mail->AddReplyTo($GLOBALS['vEmail'], $GLOBALS['vClient']); $mail->Subject = $GLOBALS['vClient'] . " | Vos informations de connexion"; if (filter_var(fxUnescape($_POST['courriel']), FILTER_VALIDATE_EMAIL)) { $mail->Body = $body; $mail->AddAddress(fxUnescape($_POST['courriel']), fxUnescape($recPerdu['usa_prenom']) . ' ' . fxUnescape($recPerdu['usa_nom'])); if(!$mail->Send()) $error = 1; else $error = 0; // Clear all addresses and attachments for next loop $mail->ClearAddresses(); $mail->ClearAttachments(); } if ($error == 0) return 1; else return 0; } } // fonction pour formatter une valeur sous la forme $ 9,999.99 function fxShowMoney($value, $lang) { if ($lang == 'fr') { $value = number_format($value, 2, ',', ' ') . ' $'; } else { $value = '$ ' . number_format($value, 2, '.', ','); } return $value; } // fonction pour creer un log // param : message // créé: 2014-06-2 function fxcreer_log($strDescription, $intType = 10, $int_Email = 0, $int_eve_id = 0, $int_epr_id = 0, $int_pra_id = 0, $str_no_panier = '', $int_com_id = 0, $str_com_courriel = '') { //function fxcreer_log($strDescription, $intType = 10, $int_Email = 0, $int_eve_id = 0, $int_epr_id = 0, $int_pra_id = 0, $str_no_panier = '', $int_com_id = 0) { if (isset($_SESSION['com_id'])) $int_com_id = $_SESSION['com_id']; if (isset($_SESSION['no_panier'])) $str_no_panier = $_SESSION['no_panier']; $sqlInsert = "INSERT INTO inscriptions_log SET log_description = '" . $strDescription . "', log_email = " . $int_Email . ", log_type = " . $intType . ", eve_id = " . $int_eve_id . ", epr_id = " . $int_epr_id . ", pra_id = " . $int_pra_id . ", no_panier = '" . $str_no_panier . "', log_time = NOW(), com_id = " . $int_com_id . ", log_prg = '" . $GLOBALS['vPage'] . "', log_com_courriel = '" . $str_com_courriel . "'"; $qryInsert = $GLOBALS['db']->fxQuery($sqlInsert); return(true); } // fonction envoi un courriel (JSP) // param : sujet, corps du message, courriel destinataire, nom destinataire, courriel expéditeur, nom expéditeur, smtp (oui/non), html (oui/non) // retourne : vrai ou faux function fxSendMail($subject, $body, $to_mail, $to_name, $from_mail, $from_name, $smtp, $html) { require_once('../mailer/class.phpmailer.php'); $mail = new PHPMailer(); if ($smtp == 1) { $mail->IsSMTP(); $mail->SMTPAuth = true; $mail->SMTPKeepAlive = true; $mail->Host = "pop.progiweb.ca"; $mail->Port = 25; $mail->Username = "send@progiweb.ca"; $mail->Password = "progiwebsend"; } $mail->CharSet = "UTF-8"; $mail->SetFrom($GLOBALS['vEmail'], fxRemoveHtml($GLOBALS['vClient'])); $mail->AddReplyTo($from_mail, $from_name); $mail->Subject = fxRemoveHtml($GLOBALS['vClient']) . " | " . $subject; if (filter_var($to_mail, FILTER_VALIDATE_EMAIL)) { if ($html == 1) $mail->MsgHTML($body); else $mail->Body = $body; $mail->AddAddress($to_mail, $to_name); if (!$mail->Send()) $error = 1; else $error = 0; // Clear all addresses and attachments for next loop $mail->ClearAddresses(); $mail->ClearAttachments(); } if ($error == 0) return true; else return false; } // fonction qui enlève les tags html (JSP) // param : string // créé : 2012-08-02 function fxRemoveHtml($string) { $string = html_entity_decode($string); $string = str_replace("’", "'", $string); $string = preg_replace('/\s\s+/', ' ', $string); $string = strip_tags($string); return $string; } // fonction pour formatter une valeur sous la forme $ 9,999.99 // param : valeur, langue, format (afficher $ CAD) // créé : 2013-03-28 function fxShowPrix($strValue, $strLangue, $intFormat) { if ($strLangue == 'fr') { $strValue = number_format($strValue, 2, ',', ' '); if ($intFormat == 1) $strValue .= ' $'; } else { $strValue = number_format($strValue, 2, '.', ','); if ($intFormat == 1) $strValue = '$ ' . $strValue; } return $strValue; } // trouve la valeur d'une variable de la bdd function fxGetVariable($strVarNom) { global $db; $sqlVariable = "SELECT var_valeur FROM variables WHERE var_nom = '" . $db->fxEscape($strVarNom) . "'"; $strVarValeur = $db->fxGetVar($sqlVariable); return $strVarValeur; } /** @see php/inc_fonctions.php fxPromoteurLegacySiteEnabled */ function fxPromoteurLegacySiteEnabled() { static $blnEnabled = null; if ($blnEnabled !== null) { return $blnEnabled; } global $db; if (!isset($db)) { $blnEnabled = true; return $blnEnabled; } $strVal = fxGetVariable('promoteur_legacy_actif'); $blnEnabled = ($strVal === null || $strVal === '' || intval($strVal) === 1); return $blnEnabled; } function print_mem() { /* Currently used memory */ $mem_usage = memory_get_usage(); /* Peak memory usage */ $mem_peak = memory_get_peak_usage(); echo 'The script is now using: ' . round($mem_usage / 1024) . 'KB of memory.
'; echo 'Peak usage: ' . round($mem_peak / 1024) . 'KB of memory.

'; } /** * Description : retourner le texte correspondan a la clef si il a été mis en mémoire * Parametres : clef * mem_echo =1 fait un echo sinon la valeur est retourné * $mem_trduction lest admin on un bouton pour correction * $mem_global=0 si 1 vas créér la variable avec global pas le nom de la page * Créateur : stephan * Date : 13-03-17 */ function afficheTexte($clef, $mem_echo = 1, $mem_trduction = 1, $mem_global = 0) { global $vtexte_page, $vPage; $mem_id = ""; if (isset($vtexte_page[$clef]['info_texte'])) $mem_texte = $vtexte_page[$clef]['info_texte']; else { $mem_texte = '*' . $clef . '*'; if ($mem_global == 0) $mem_page = $vPage; else $mem_page = "global"; // creation dans la bd info $info1 = array("info_clef" => $clef, "info_langue" => "fr", "info_texte" => $clef, "info_prg" => $mem_page, "info_actif" => 1); fxSetInfo('add', $info1, '', $mem_id); $info1 = array("info_clef" => $clef, "info_langue" => "en", "info_texte" => $clef, "info_prg" => $mem_page, "info_actif" => 1); fxSetInfo('add', $info1, '', $mem_id); } if ($mem_echo == 1) echo $mem_texte; return $mem_texte; } /** * Description : lire le text dans la bd info * Parametres : 1 - page * 2 - langue A,F * optionelle 3- 1 va chercher bd client en premier et centrale en deuxiemme (default) * 2 jutse bd client * 3 juste bd centrale * Créateur : stephan * Date : 13-03-15 */ function obtenirTextepage() { global $objDatabase; $numargs = func_num_args(); $arg_list = func_get_args(); $page = $arg_list[0]; $Langue = $arg_list[1]; $centrale = $mem_corr = ""; $info = null; if (array_key_exists(2, $arg_list)) { $centrale = $arg_list[2]; } switch ($centrale) { case 3: $sql_info = "SELECT info_clef,info_texte,pk_info,info_prg,'centrale' as bd FROM info where info_prg='" . $page . "' and info_langue='" . $Langue . "'"; $info = $GLOBALS['dbcentrale']->fxFetchArray(3, $sql_info); break; case 2: $sql_info = "SELECT info_clef,info_texte,pk_info,info_prg,'client' as bd FROM info where (info_prg='" . $page . "' or info_prg='global') and info_langue='" . $Langue . "'"; $info = $objDatabase->fxFetchArray(3, $sql_info); break; case 1: $sql_info = "SELECT info_clef,info_texte,pk_info,'client' as bd FROM info where info_prg='" . $page . "' and info_langue='" . $Langue . "'"; $info2 = $objDatabase->fxFetchArray(3, $sql_info); $sql_info = "SELECT info_clef,info_texte,'centrale' as bd FROM info where info_prg='" . $page . "' and info_langue='" . $Langue . "'"; $info1 = $objDatabase->fxFetchArray(3, $sql_info); $info = array_merge($info1, $info2); break; } return $info; } /** * Description : affiche le bouton modi texte et hide les textclef * Parametres : * Créateur : stephan * Date : 13-03-22 */ function modif_texte_bt() { global $vadmin_texte; if ($vadmin_texte == true) echo ""; } /** * Description : Fonction pour ajouter le value dans une formes * Parametres : $mem_champ nom du champs ,$mem_defaut,$mem_type add ou mod ,$mem_infos tableau des info * Créateur : stephan * Date : 13-04-20 */ function fxFormFieldInfo($mem_champ, $mem_type, $mem_infos, $mem_defaut = "", $mem_array = 0) { if ($mem_array == 0) $mem_value = 'id="' . $mem_champ . '" name="' . $mem_champ . '"'; else $mem_value = 'id="info['.$mem_array.'][' . $mem_champ . ']" name="info['.$mem_array.'][' . $mem_champ . ']"'; switch ($mem_type) { // AJOUT case 'add': if (trim($mem_defaut != '')) $mem_value = $mem_value . ' value="' . $mem_defaut . '"'; break; case 'mod': case 'checkout': $mem_value = $mem_value . ' value="' . $mem_infos[$mem_champ] . '"'; break; } return $mem_value; } function fxFormFieldCheck($mem_champ, $mem_type, $mem_infos, $mem_valide, $mem_defaut = "",$mem_action="") { $mem_value = ''; switch ($mem_type) { // AJOUT case 'add': if (trim($mem_defaut != '')) $mem_value = 'checked="checked"'; break; case 'mod': case 'checkout': if($mem_action=="mod") { if ($mem_infos[$mem_champ] == $mem_valide) $mem_value = 'checked'; else $mem_value = 'disabled'; }else{ if ($mem_infos[$mem_champ] == $mem_valide) $mem_value = 'checked="checked"'; } break; } return $mem_value; } function fxFormFieldChecklist($mem_champ, $mem_type, $mem_infos, $mem_valide, $mem_defaut) { $mem_value = ''; switch ($mem_type) { // AJOUT case 'add': case 'addaffilie': if ($mem_defaut == $mem_valide) $mem_value = 'selected="selected"'; break; case 'mod': case 'checkout': if ($mem_infos[$mem_champ] == $mem_valide) $mem_value = 'selected="selected"'; break; } return $mem_value; } function fxSetInfo($strAction, $tabData, $strLangue, $id = 0) { global $objDatabase; $_SESSION['msg'] = ""; switch ($strAction) { // AJOUT case 'add': // former le INSERT $tabFieldsValues = fxListFieldsValues($tabData, 'pk_info', 'info', $GLOBALS['arrConDatabaseMain']['db']); // vérifie si le info existe $sqlValide = "SELECT COUNT(info_clef) from info where info_clef='" . $tabData['info_clef'] . "' and info_prg='" . $tabData['info_prg'] . "' and info_langue='".$tabData['info_langue']."'"; $nbValide = $objDatabase->fxGetVar($sqlValide); if ($nbValide > 0) { break; } // insérer les infos du participants $sqlInsert = "INSERT INTO info " . $tabFieldsValues['set'] . ',info_creation=now()'; $qryInsert = $objDatabase->fxQuery($sqlInsert); // récupérer le id ajouté $intCompte = $objDatabase->fxGetLastId(); // $_SESSION['com_id'] = $intCompte; break; // MODIFICATION case 'mod': $tabFieldsValues = fxListFieldsValues($tabData, 'pk_info', 'info', $GLOBALS['arrConDatabaseMain']['db']); // verification des champs obligatoire // update les infos $sqlUpdate = "UPDATE info " . $tabFieldsValues['set'] . ",info_maj=now() where ". $tabFieldsValues['key']; $qryUpdate = $objDatabase->fxQuery($sqlUpdate); // définir le message à affiche break; // SUPPRESSION case 'del': /* PLUS TARD $sqlDelete = "DELETE FROM ".$bd." WHERE ".$memid." = " . intval($id); $qryDelete = $objDatabase->fxQuery($sqlDelete); */ } } function afficheTexteReplace($mem_tab_replace, $mem_texte) { foreach ($mem_tab_replace as $key => $value) $mem_texte=str_replace($key, $value, $mem_texte); return $mem_texte; } // fonction qui retourne les infos des champs de la table (SL / JSP) // param : nom de la table, nom de la base de données // créé : 2013-04-10 function fxGetFileds($strTable, $strBdd) { global $objDatabase; $sqlFields = "SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_NAME = '" . $objDatabase->fxEscape($strTable) . "' AND TABLE_SCHEMA = '" . $objDatabase->fxEscape($strBdd) . "'"; $recFields = $objDatabase->fxGetResultsKey($sqlFields); return $recFields; } function conf_getFiltreData($usa_id,$page,$var,$vardefault,$update=0,$typenum=1) { // list la bb client $sqlsortie = "SELECT * FROM usa_filtre WHERE fil_usa_id = '" . $usa_id . "' AND fil_page = '" . $page . "' AND fil_var = '" . $var . "' "; $sortie = $GLOBALS['db']->fxGetRow($sqlsortie); if ($sortie==null){ $sqlInsert = "INSERT INTO usa_filtre SET fil_usa_id = '" . $usa_id . "', fil_page = '" . $page . "', fil_var = '" . $var . "', fil_value = '" . $vardefault."'" ; $qryInsert = $GLOBALS['db']->fxQuery($sqlInsert); $mem_return=$vardefault; }else{ if ($update==1){ $sqlInsert = "update usa_filtre SET fil_value = '" . $vardefault."' WHERE fil_usa_id = '" . $usa_id . "' AND fil_page = '" . $page . "' AND fil_var = '" . $var . "' "; $qryInsert = $GLOBALS['db']->fxQuery($sqlInsert); $mem_return=$vardefault; }else{ $mem_return=$sortie['fil_value']; } } if ($typenum==0) $mem_return='"'.$mem_return.'"'; return $mem_return; } // fonction qui compose le SQL pour les INSERT et UPDATE // param : tableau des données, nom de la clé (PK), nom de la table, nom de la base de données // créé : 2013-04-10 function fxListFieldsValues($tabData, $strKey, $strTable, $strBdd) { global $objDatabase; $tabFields = fxGetFileds($strTable, $strBdd); $mem_set = "SET "; $xvide = 0; $listvide = ""; $mem_id = ""; foreach (array_keys($tabData) as $strField) { $listvide[$xvide] = $strField; $xvide += 1; if (strstr($strField, 'btn') === false) { if ($strField == $strKey) $mem_id = $strField . " = " . intval($tabData[$strField]); else { if (isset($tabFields[$strField]['DATA_TYPE'])) { switch ($tabFields[$strField]['DATA_TYPE']) { case 'char': case 'varchar': case 'text': case 'date': $mem_set = $mem_set . $strField . " = '" . $objDatabase->fxEscape($tabData[$strField]) . "', "; break; case 'tinyint': case 'int': case 'smallint': case 'mediumint': case 'bigint': $mem_set = $mem_set . $strField . " = " . intval($tabData[$strField]) . ", "; break; case 'double': case 'float': $mem_set = $mem_set . $strField . " = " . floatval($tabData[$strField]) . ", "; break; } } } } } // enlever la virgule de trop et mettre dans le tableau à l'index 'set' $memreturn['set'] = substr($mem_set, 0, -2); // mettre dans le tableau à l'index 'key' $memreturn['key'] = $mem_id; // mettre dans le tableau les champs pas vide 'vide' $memreturn['pasvide'] = $listvide; return $memreturn; } function fx_copy_tout($sourceDir,$destinationDir){ // Crée le dossier de destination s'il n'existe pas // echo($sourceDir); if (!is_dir($destinationDir)) { mkdir($destinationDir, 0755, true); } // Utilisez glob() pour récupérer tous les fichiers correspondant à *.* $files = glob($sourceDir . '*.*'); foreach ($files as $file) { $fileName = basename($file); // Récupère uniquement le nom du fichier $destination = $destinationDir . $fileName; if (copy($file, $destination)) { } else { $error = error_get_last(); error_log("Détails de l'erreur : " . $error['message']); error_log( "Échec de la copie pour le fichier $fileName."); } } } function fxDuplicateRow($table, $id, $primaryKey, $updates = []) { // Étape 1 : Récupérer l'enregistrement original $sqlSelect = "SELECT * FROM $table WHERE $primaryKey = $id"; $originalRow = $GLOBALS['db']->fxGetRow($sqlSelect); if (!$originalRow) { return false; // Enregistrement non trouvé } // Étape 2 : Construire une requête d'insertion unset($originalRow[$primaryKey]); // Retirer la clé primaire (auto-incrémentée) foreach ($updates as $column => $value) { $originalRow[$column] = $value; // Appliquer les mises à jour } // Générer les colonnes et les valeurs pour l'INSERT $columns = array_keys($originalRow); $values = array_map([$GLOBALS['db'], 'fxEscape'], array_values($originalRow)); $sqlInsert = " INSERT INTO $table (" . implode(', ', $columns) . ") VALUES ('" . implode("', '", $values) . "') "; // Étape 3 : Exécuter la requête d'insertion $GLOBALS['db']->fxQuery($sqlInsert); // Retourner l'ID de la nouvelle ligne return $GLOBALS['db']->fxGetLastId(); } function print_rsl($arr){ ?>
    
"); } function fxcopieevenementv1($eve_id_source) { $db = $GLOBALS['db']; // 1. Lire l'événement source $sql = "SELECT * FROM inscriptions_evenements WHERE eve_id = $eve_id_source"; $row = $db->fxGetRow($sql); if (!$row) { // echo "❌ Événement source introuvable.
"; return false; } // 2. Modifier les champs unset($row['eve_id']); $row['eve_nom_fr'] = trim($row['eve_nom_fr']) . ' _copie'; $row['eve_nom_en'] = trim($row['eve_nom_en']) . ' _copie'; $row['eve_label_url'] = trim($row['eve_label_url']) . '_copie'; $row['eve_actif'] = 0; $row['prod_update_date'] = date('Y-m-d H:i:s'); // 3. INSERT dans inscriptions_evenements $columns = array_keys($row); $values = array_map([$db, 'fxEscape'], array_values($row)); $sqlInsert = "INSERT INTO inscriptions_evenements (" . implode(", ", $columns) . ") VALUES ('" . implode("', '", $values) . "')"; // echo "
🟦 INSERT événement :\n$sqlInsert
"; $db->fxQuery($sqlInsert); $new_eve_id = $db->fxGetLastId(); // echo "✅ Nouvel événement copié avec eve_id : $new_eve_id
"; // 4. Tables liées à copier $tables = [ ['inscriptions_epreuves', 'epr_id'], ['inscriptions_infos_participants', 'inf_id'], ['inscriptions_questions', 'que_id'], ['inscriptions_produits_new', 'pro_id'], ]; // 5. Boucle pour copier chaque table foreach ($tables as [$table, $pk]) { $sql = "SELECT * FROM $table WHERE eve_id = $eve_id_source"; $result = $db->fxQuery($sql); $copied = 0; while ($row = mysqli_fetch_assoc($result)) { unset($row[$pk]); // supprimer l'ID auto $row['eve_id'] = $new_eve_id; $columns = array_keys($row); $values = array_map([$db, 'fxEscape'], array_values($row)); $sqlInsert = "INSERT INTO $table (" . implode(", ", $columns) . ") VALUES ('" . implode("','", $values) . "')"; $db->fxQuery($sqlInsert); $copied++; } // echo "✔ $copied lignes copiées dans $table
"; } return $new_eve_id ; //echo "🎉 Duplication complète avec succès."; } function fxcopieevenement($eve_id_source) { $db = $GLOBALS['db']; // 1. Lire l'événement source $sql = "SELECT * FROM inscriptions_evenements WHERE eve_id = $eve_id_source"; $row = $db->fxGetRow($sql); if (!$row) return false; // 2. Préparer les données de l'événement unset($row['eve_id']); $row['eve_nom_fr'] = trim($row['eve_nom_fr']) . ' _copie'; $row['eve_nom_en'] = trim($row['eve_nom_en']) . ' _copie'; $row['eve_label_url'] = trim($row['eve_label_url']) . '_copie'; $row['eve_actif'] = 0; $row['prod_update_date'] = date('Y-m-d H:i:s'); // 3. INSERT dans inscriptions_evenements $columns = array_keys($row); $values = array_map([$db, 'fxEscape'], array_values($row)); $sqlInsert = "INSERT INTO inscriptions_evenements (" . implode(", ", $columns) . ") VALUES ('" . implode("', '", $values) . "')"; $db->fxQuery($sqlInsert); $new_eve_id = $db->fxGetLastId(); // 4. Copier les tables liées // ['inscriptions_rabais', 'rab_id', null], $tables = [ ['inscriptions_epreuves', 'epr_id', 'epr_id_old'], ['inscriptions_infos_participants', 'inf_id', null], ['inscriptions_questions', 'que_id', null], ['inscriptions_produits_new', 'pro_id', 'pro_id_old'], ]; foreach ($tables as [$table, $pk, $old_id_field]) { $sql = "SELECT * FROM $table WHERE eve_id = $eve_id_source"; $result = $db->fxQuery($sql); while ($row = mysqli_fetch_assoc($result)) { $old_id = $row[$pk]; unset($row[$pk]); if ($old_id_field) { $row[$old_id_field] = $old_id; } $row['eve_id'] = $new_eve_id; $columns = array_keys($row); $values = array_map([$db, 'fxEscape'], array_values($row)); $sqlInsert = "INSERT INTO $table (" . implode(", ", $columns) . ") VALUES ('" . implode("','", $values) . "')"; $db->fxQuery($sqlInsert); } } // 5. Mise à jour des champs questions_epreuves_incluses $sql = "SELECT * FROM inscriptions_questions WHERE eve_id = $new_eve_id"; $result = $db->fxQuery($sql); while ($row = mysqli_fetch_assoc($result)) { $que_id = $row['que_id']; $liste_epreuves = $row['que_epreuves_incluses']; if (empty($liste_epreuves)) continue; $ids = explode(',', $liste_epreuves); $nouvelle_liste = []; foreach ($ids as $id) { $id = trim($id); if ($id === '' || $id === '0') { $nouvelle_liste[] = $id; continue; } $sqlFind = "SELECT epr_id FROM inscriptions_epreuves WHERE eve_id = $new_eve_id AND epr_id_old = " . intval($id); $resFind = $db->fxQuery($sqlFind); if (mysqli_num_rows($resFind) === 1) { $rowEpr = mysqli_fetch_assoc($resFind); $nouvelle_liste[] = $rowEpr['epr_id']; } else { $nouvelle_liste[] = $id; } } $nouvelle_valeur = implode(',', $nouvelle_liste); if ($nouvelle_valeur !== $liste_epreuves) { $escaped_val = $db->fxEscape($nouvelle_valeur); $update_sql = "UPDATE inscriptions_questions SET que_epreuves_incluses = '$escaped_val' WHERE que_id = $que_id"; $db->fxQuery($update_sql); } } // 5. Mise à jour des champs que_choix_produit $sql = "SELECT * FROM inscriptions_questions WHERE eve_id = $new_eve_id"; $result = $db->fxQuery($sql); while ($row = mysqli_fetch_assoc($result)) { $que_id = $row['que_id']; $liste_epreuves = $row['que_choix_produit']; if (empty($liste_epreuves)) continue; $ids = explode(',', $liste_epreuves); $nouvelle_liste = []; foreach ($ids as $id) { $id = trim($id); if ($id === '' || $id === '0') { $nouvelle_liste[] = $id; continue; } $sqlFind = "SELECT * FROM inscriptions_produits_new WHERE eve_id = $new_eve_id AND pro_id_old = " . intval($id); $resFind = $db->fxQuery($sqlFind); if (mysqli_num_rows($resFind) === 1) { $rowEpr = mysqli_fetch_assoc($resFind); $nouvelle_liste[] = $rowEpr['pro_id']; } else { $nouvelle_liste[] = $id; } } $nouvelle_valeur = implode(',', $nouvelle_liste); if ($nouvelle_valeur !== $liste_epreuves) { $escaped_val = $db->fxEscape($nouvelle_valeur); $update_sql = "UPDATE inscriptions_questions SET que_choix_produit = '$escaped_val' WHERE que_id = $que_id"; $db->fxQuery($update_sql); } } return $new_eve_id; } function fxgetpromoteurs($eve_id_source) { $db = $GLOBALS['db']; // 1. Lire l'événement source $sql = "SELECT * FROM inscriptions_comptes WHERE FIND_IN_SET('" . $eve_id_source . "', REPLACE(com_eve_promoteur, ' ', '')) > 0;"; $comptes = $db->fxGetResults($sql); //MSIN-4283 $sql = " SELECT DISTINCT TRIM( SUBSTRING_INDEX( SUBSTRING_INDEX(com_groupe, ',', n.n), ',', -1 ) ) AS groupe FROM inscriptions_comptes JOIN ( SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 ) n ON n.n <= 1 + LENGTH(com_groupe) - LENGTH(REPLACE(com_groupe, ',', '')) WHERE com_groupe <> '' ORDER BY groupe "; $groupes = $db->fxGetResults($sql); ?>

Ajouter un promoteurs
' . htmlspecialchars($g['groupe']) . ' '; } ?>
$c): ?>
# Prénom Nom Courriel Téléphone Effacer
/ items
fxGetResults($sql); if ($comptes === null) { $comptes = array(); } } ?>
$c): ?>
# eve_id Nom Date fin Effacer
/ items
fxQuery($sql); if (!$res || mysqli_num_rows($res) === 0) return false; $row = mysqli_fetch_assoc($res); $liste = (string)$row['com_eve_promoteur']; // Rien à faire si déjà vide if ($liste === '') return true; // 2) Exploser sur la virgule (pas d'espaces dans tes données) $ids = explode(',', $liste); // 3) Retirer uniquement $eve_id (comparaison numérique stricte) $changed = false; $filtered = []; foreach ($ids as $id) { // On garde les éléments non vides et différents de $eve_id if ($id === '') continue; if ((int)$id === $eve_id) { $changed = true; continue; } $filtered[] = $id; // on conserve tel quel (pas d'espaces à gérer) } // Si rien n’a changé, on sort if (!$changed) return true; // 4) Reconstituer proprement $nouvelleListe = implode(',', $filtered); // donnera "" si plus rien // 5) Sauvegarder (et n’échapper que si non vide) $escaped = $db->fxEscape($nouvelleListe); $sqlUpdate = "UPDATE inscriptions_comptes SET com_eve_promoteur = '$escaped' WHERE com_id = $promoteur_id"; $db->fxQuery($sqlUpdate); return true; } //MSIN-4283 function fxAddEvenementToGroupe($eve_id, $nomGroupe) { $db = $GLOBALS['db']; $eve_id = (int)$eve_id; $nomGroupe = trim($nomGroupe); if ($eve_id <= 0 || $nomGroupe === '') return false; // 1) Lire tous les comptes du groupe $sql = " SELECT com_id, com_eve_promoteur FROM inscriptions_comptes WHERE FIND_IN_SET( '" . $db->fxEscape($nomGroupe) . "', REPLACE(com_groupe, ' ', '') ) > 0 "; $res = $db->fxQuery($sql); if (!$res || mysqli_num_rows($res) === 0) return false; // 2) Boucle sur chaque promoteur du groupe while ($row = mysqli_fetch_assoc($res)) { $liste = (string)$row['com_eve_promoteur']; if ($liste === '' || $liste === null) { $nouvelleListe = (string)$eve_id; } else { $ids = explode(',', $liste); $deja = false; foreach ($ids as $id) { if ((int)$id === $eve_id) { $deja = true; break; } } if ($deja) continue; $nouvelleListe = $liste . ',' . $eve_id; } // 3) Update $escaped = $db->fxEscape($nouvelleListe); $sqlUpdate = " UPDATE inscriptions_comptes SET com_eve_promoteur = '$escaped' WHERE com_id = " . (int)$row['com_id'] . " "; $db->fxQuery($sqlUpdate); } return true; } function fxAddEvenementToPromoteur($eve_id, $promoteur_id) { $db = $GLOBALS['db']; $eve_id = (int)$eve_id; $promoteur_id = (int)$promoteur_id; if ($eve_id <= 0 || $promoteur_id <= 0) return false; // 1) Lire la liste actuelle $sql = "SELECT com_eve_promoteur FROM inscriptions_comptes WHERE com_id = $promoteur_id LIMIT 1"; $res = $db->fxQuery($sql); if (!$res || mysqli_num_rows($res) === 0) return false; $row = mysqli_fetch_assoc($res); $liste = (string)$row['com_eve_promoteur']; // 2) Construire la nouvelle liste (sans espaces, sans doublon) if ($liste === '' || $liste === null) { $nouvelleListe = (string)$eve_id; } else { // Vérifie le doublon $ids = explode(',', $liste); foreach ($ids as $id) { if ((int)$id === $eve_id) { // déjà présent, rien à faire return true; } } // Ajoute à la fin, avec virgule, sans espace $nouvelleListe = $liste . ',' . $eve_id; } // 3) Sauvegarder $escaped = $db->fxEscape($nouvelleListe); $sqlUpdate = "UPDATE inscriptions_comptes SET com_eve_promoteur = '$escaped' WHERE com_id = $promoteur_id"; $db->fxQuery($sqlUpdate); return true; } /** Durée d'inactivité superadm (MSIN-CON-259) — alignée site public, 3 h. */ function fxSuperadmSessionInactiveSeconds() { return 10800; } /** * Valide la session superadm via $_SESSION['logged'] uniquement (pas date_maj du compte public). * * @return int usa_id ou 0 si session absente / expirée */ function fxSuperadmSessionValidate($blnRefresh = true) { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } if (empty($_SESSION['usa_id']) || empty($_SESSION['usa_info'])) { return 0; } $inactive = fxSuperadmSessionInactiveSeconds(); $intLastActivity = intval($_SESSION['logged'] ?? 0); if ($intLastActivity <= 0) { $_SESSION['logged'] = time(); return intval($_SESSION['usa_id']); } if ((time() - $intLastActivity) > $inactive) { return 0; } if ($blnRefresh) { $_SESSION['logged'] = time(); } return intval($_SESSION['usa_id']); } /** Secondes restantes avant expiration (0 = expirée). */ function fxSuperadmSessionExpiresIn() { if (empty($_SESSION['usa_id'])) { return 0; } $intLastActivity = intval($_SESSION['logged'] ?? 0); if ($intLastActivity <= 0) { return fxSuperadmSessionInactiveSeconds(); } return max(0, fxSuperadmSessionInactiveSeconds() - (time() - $intLastActivity)); } /** * Auth AJAX superadm — même règles que inc_start_time.php (MSIN-CON-259, 3 h), * mais réponse JSON au lieu d'une redirection (logout.php casse les appels $.post). */ function fxSuperadmAjaxAuthOrJsonExit() { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } header('Content-Type: application/json; charset=utf-8'); $intUsaId = fxSuperadmSessionValidate(true); if ($intUsaId <= 0) { echo json_encode(array( 'state' => 'error', 'message' => 'Session expirée ou accès refusé.', 'code' => 'session', )); exit; } return $intUsaId; } /** Ping session superadm — garde la session vivante tant que l'onglet est ouvert. */ function fxSuperadmSessionPingJson() { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } header('Content-Type: application/json; charset=utf-8'); $intUsaId = fxSuperadmSessionValidate(true); if ($intUsaId <= 0) { echo json_encode(array( 'ok' => false, 'message' => 'Session expirée — reconnectez-vous au superadmin.', 'code' => 'session', )); exit; } $intExpiresIn = fxSuperadmSessionExpiresIn(); echo json_encode(array( 'ok' => true, 'expires_in' => $intExpiresIn, 'warn' => ($intExpiresIn > 0 && $intExpiresIn <= 300), )); exit; } /** * Super admin connecté — canal superadm/login.php uniquement (usa_id en session). * Ne jamais déduire du login public : com_info / com_superadm ne comptent pas ici. */ function fxSuperadmIsLoggedIn() { return !empty($_SESSION['usa_id']); } /** * Session superadm absente → login (pas « Accès refusé »). * Rapports legacy : session compte public (com_info) suffit pour la vérif droits ensuite. */ function fxSuperadmRedirectToLoginIfNeeded($blnAllowCompteLegacy = false) { if (fxSuperadmIsLoggedIn()) { return; } if ($blnAllowCompteLegacy && !empty($_SESSION['com_info']['com_id'])) { return; } $_SESSION['superadm_redirect_after_login'] = $_SERVER['REQUEST_URI']; global $vDomaine; $strLogin = 'login.php'; if (!empty($vDomaine)) { $strLogin = rtrim((string)$vDomaine, '/') . '/superadm/login.php'; } header('Location: ' . $strLogin); exit; } /** URL cible après login superadm (évite redirection ouverte). */ function fxSuperadmConsumeRedirectAfterLogin($strDefault = 'index.php') { if (empty($_SESSION['superadm_redirect_after_login'])) { return $strDefault; } $strUrl = (string)$_SESSION['superadm_redirect_after_login']; unset($_SESSION['superadm_redirect_after_login']); if (strpos($strUrl, '/superadm/') === false) { return $strDefault; } if (strpos($strUrl, '://') !== false) { $strHost = parse_url($strUrl, PHP_URL_HOST); if ($strHost !== ($_SERVER['HTTP_HOST'] ?? '')) { return $strDefault; } } return $strUrl; } /** * Accès rapports superadm — super admin = tout ; sinon promoteur legacy (com_eve_promoteur / com_rapports). */ function fxSuperadmReportsAllowed($intEvenement = 0) { if (fxSuperadmIsLoggedIn()) { return true; } if (intval($intEvenement) <= 0 || empty($_SESSION['com_info']['com_id'])) { return false; } global $db; $recPromoteur = $db->fxGetRow( 'SELECT com_eve_promoteur, com_rapports FROM inscriptions_comptes WHERE com_id = ' . intval($_SESSION['com_info']['com_id']) ); if ($recPromoteur == null || trim((string)$recPromoteur['com_eve_promoteur']) === '') { return false; } $tabEve = array_map('trim', explode(',', (string)$recPromoteur['com_eve_promoteur'])); return in_array((string)intval($intEvenement), $tabEve, true); } /** Rapports Excel/liste ADM (index.php?a=report&t=…) — super admin ou com_rapports / men_ref promoteur. */ function fxSuperadmReportMenuAllowed($intMenuId) { if (fxSuperadmIsLoggedIn()) { return true; } if (intval($intMenuId) <= 0 || empty($_SESSION['com_info']['com_id'])) { return false; } global $objDatabase; $recRapport = $objDatabase->fxGetRow( 'SELECT men_ref FROM adm_menus WHERE men_id = ' . intval($intMenuId) ); $recPromoteur = $objDatabase->fxGetRow( 'SELECT com_eve_promoteur, com_rapports FROM inscriptions_comptes WHERE com_id = ' . intval($_SESSION['com_info']['com_id']) ); if ($recPromoteur == null || $recRapport == null) { return false; } $tabEve = array_map('trim', explode(',', (string)$recPromoteur['com_eve_promoteur'])); $tabRapports = array_map('trim', explode(',', (string)$recPromoteur['com_rapports'])); if (trim((string)$recRapport['men_ref']) !== '0' && trim((string)$recRapport['men_ref']) !== '' && in_array(trim((string)$recRapport['men_ref']), $tabEve, true)) { return true; } return in_array((string)intval($intMenuId), $tabRapports, true); } /** Sync tables statiques — superadm, préprod dev seulement (aligné sur sync_static_db.php). */ function fxSuperadmStaticSyncAllowed() { if (empty($_SESSION['usa_id'])) { return false; } $strHost = strtolower((string)($_SERVER['HTTP_HOST'] ?? '')); return strpos($strHost, 'ms1inscriptiondev') !== false && strpos($strHost, 'preprod.') !== false; }