$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 } } ?>