162 lines
5.5 KiB
PHP
Executable File
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
|
|
}
|
|
}
|
|
?>
|