alpha_full/admin/adminInclude/_fonctions/fonctionRequete_update.php
2026-04-06 22:58:51 +02:00

162 lines
5.5 KiB
PHP
Executable File

<?php
// afficherMsg==1 affiche le succes; afficherMsg==1 ou 2 affiche si erreur
function dynRequete_update($queryType, $tableName, $fields = [], $conditions = [], $ficAppelant = '', $afficherMsg = 0, $localDebug = 0) {
global $admMsg, $admMsgClass, $idPdo, $debugMsg, $debug; // Déclaration unique des variables globales
$startTime = microtime(true); // Pour mesurer le temps d'exécution
$reqUpdate = '';
if (!(substr($tableName, 0, 1) === '`' && substr($tableName, -1) === '`')) {
$tableName = "`" . str_replace("`", "", $tableName) . "`";
}
// Debug sur la fonction
if ($localDebug == 2 && (isset($debug[1]) && $debug[1] == '1' || isset($debug[2]) && $debug[2] == '1')) {
$debugMsg .= monDebug(2, ['queryType' => $queryType, 'tableName' => $tableName], 'fonctionRequete_update.php (generique)', $ficAppelant);
}
// ----------------------------------------------------
// Construction du debut de la requete
// ----------------------------------------------------
if ($queryType == 'UPDATE') {
$reqUpdate = "UPDATE " . $tableName . " SET ";
}
// ----------------------------------------------------
// Construction des champs à mettre à jour
// ----------------------------------------------------
$bindParams = [];
$setClauses = [];
if (!empty($fields) && is_array($fields)) {
foreach ($fields as $key => $value) {
// Gestion des backticks si alias de table ou champ
$keyParts = explode('.', $key);
$escapedKey = (count($keyParts) === 2) ? "$keyParts[0].$keyParts[1]" : "$key";
// Nom du paramètre PDO
$paramName = (count($keyParts) === 2) ? $keyParts[1] : $key;
$setClauses[] = "$escapedKey = :$paramName";
$bindParams[$paramName] = $value;
}
}
$reqUpdate .= implode(', ', $setClauses);
// ----------------------------------------------------
// Ajout des conditions WHERE si elles existent
// ----------------------------------------------------
if (!empty($conditions) && is_array($conditions)) {
$whereClauses = [];
foreach ($conditions as $key => $value) {
$operator = '=';
if (preg_match('/\s+(=|!=|LIKE|IN)$/i', $key, $m)) {
$operator = strtoupper($m[1]);
$key = trim(str_ireplace($m[0], '', $key)); // enlève l'opérateur de la clé
}
$escapedKey = escapeConditionKeyUpdt($key);
$keyParts = explode('.', $key);
$paramName = (count($keyParts) === 2) ? $keyParts[1] : $keyParts[0];
if ($operator === 'IN') {
if (is_array($value) && !empty($value)) {
$inParams = [];
foreach ($value as $i => $val) {
$p = $paramName . '_' . $i;
$inParams[] = ':' . $p;
$bindParams[$p] = $val;
}
$whereClauses[] = "$escapedKey IN (" . implode(',', $inParams) . ")";
}
} else {
$whereClauses[] = "$escapedKey $operator :$paramName";
$bindParams[$paramName] = $value;
}
}
$reqUpdate .= " WHERE " . implode(' AND ', $whereClauses);
}
$reqUpdate .= ";"; // Fin de la requête
// Debug affichage de la requete brute
if ($localDebug == 2 && (isset($debug[1]) && $debug[1] == '1' || isset($debug[2]) && $debug[2] == '1')) {
$debugMsg .= monDebug(2, ['requete Brute' => $reqUpdate], $ficAppelant);
}
// Requete construite
$requeteFinale = reconstruireRequeteUpdt($reqUpdate, $bindParams);
// Debug affichage de la requete construite
if (($localDebug == 1 || $localDebug == 2) && (isset($debug[1]) && $debug[1] == '1' || isset($debug[2]) && $debug[2] == '1')) {
$debugMsg .= monDebug(2, ['Requête' => $requeteFinale], $ficAppelant);
}
// ----------------------------------------------------
// Exécution de la requête
// ----------------------------------------------------
try {
$stmt = $idPdo->prepare($reqUpdate);
$stmt->execute($bindParams ?? []);
$affectedRows = $stmt->rowCount();
if ($afficherMsg == 1) {
$admMsg .= "Requête exécutée avec succès ";
$admMsgClass = 'ok';
}
} catch (PDOException $e) {
if ($afficherMsg != 0) {
$admMsg .= "Erreur lors de l'exécution de la requête";
}
if (($localDebug == 1 || $localDebug == 2) && (isset($debug[1]) && $debug[1] == '1' || isset($debug[2]) && $debug[2] == '1')) {
$erreur = $idPdo->errorInfo();
$debugMsg .= monDebug(2, [
'PDO message' => $e->getMessage(),
'SQLSTATE' => $erreur[0],
'Driver code' => $erreur[1],
'Erreur mysql' => $erreur[2],
'SQL' => $reqUpdate
], 'fonctionRequete_update.php', $ficAppelant);
}
$admMsgClass = 'ko';
return false;
}
// Temps d'exécution (si nécessaire)
if ($localDebug == 1 && (isset($debug[1]) && $debug[1] == '1' || isset($debug[2]) && $debug[2] == '1')) {
$endTime = microtime(true);
$executionTime = $endTime - $startTime;
$debugMsg .= "\t|\tTemps d'exécution : " . number_format($executionTime, 5) . " secondes.";
}
return $affectedRows;
}
function reconstruireRequeteUpdt($sql, $params) {
foreach ($params as $key => $val) {
$escaped = is_numeric($val) ? $val : "'" . addslashes($val) . "'";
$sql = str_replace(":$key", $escaped, $sql); // Remplace les :param
}
return $sql;
}
function escapeConditionKeyUpdt($key) {
// Si la clé contient un point (par exemple cl.idCat), c'est un alias de table
if (strpos($key, '.') !== false) {
$keyParts = explode('.', $key); // Sépare la table de la colonne
return "$keyParts[0].$keyParts[1]"; // Échappe la table et la colonne
} else {
// Si la clé ne contient pas de point, c'est simplement une colonne sans alias
return "$key"; // Échappe uniquement le nom de la colonne
}
}
?>