- Correction de 14 vulnérabilités SQL (8 critiques, 6 moyennes) - Suppression de la fonction autocomplete non utilisée - Migration complète vers PDO avec requêtes préparées - Ajout du bouton 'Réactiver' pour les devis archivés (statut 20 → 1) - Conversion des appels $.ajax en fetch API (vanilla JS) - Correction des erreurs JavaScript empêchant l'attachement d'événements - Mise à jour de la documentation (README.md et TODO.md) Sécurité: Utilisation systématique de intval() et requêtes préparées PDO UI: Nouveau bouton vert dans la grille 2x2 des actions sur devis archivés Historique: Traçabilité dans devis_histo lors de la réactivation
37 lines
1.1 KiB
PHP
37 lines
1.1 KiB
PHP
<?php
|
|
$search = "";
|
|
if ($_POST) {
|
|
if (isset($_POST["schClients"])) {
|
|
$search = trim($_POST["schClients"]);
|
|
}
|
|
}
|
|
|
|
//! On récupère la liste des clients
|
|
if ($search != "") {
|
|
// SÉCURITÉ : Utilisation de requêtes préparées pour éviter l'injection SQL
|
|
try {
|
|
$db = Database::getInstance();
|
|
$sql = 'SELECT c.* FROM clients c
|
|
WHERE c.libelle LIKE :search
|
|
OR c.adresse1 LIKE :search
|
|
OR c.cp LIKE :search
|
|
OR c.ville LIKE :search
|
|
OR c.contact_nom LIKE :search
|
|
OR c.contact_prenom LIKE :search
|
|
OR c.contact_fonction LIKE :search
|
|
ORDER BY c.libelle';
|
|
|
|
$stmt = $db->prepare($sql);
|
|
$searchParam = '%' . $search . '%';
|
|
$stmt->bindParam(':search', $searchParam, PDO::PARAM_STR);
|
|
$stmt->execute();
|
|
$aModel["clients"] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
} catch (Exception $e) {
|
|
error_log("Erreur recherche clients : " . $e->getMessage());
|
|
$aModel["clients"] = [];
|
|
}
|
|
} else {
|
|
$sql = 'SELECT c.* FROM clients c ORDER BY c.libelle';
|
|
$aModel["clients"] = getinfos($sql, "gen");
|
|
}
|