Correction SQL

This commit is contained in:
voxan committed 2026-10-21 22:17:26 +02:00
1 parent 0c8d9cba6d
commit 5c43bf9e7c
1 file changed
+60 -59
+60 -59
View File
@@ -9,8 +9,8 @@
* suppression d'une couche. * suppression d'une couche.
* *
* Hypothese de schema : * Hypothese de schema :
* map_layers(id, name, layer_key, color, is_visible, sort_order, * map_layers(id, name, layer_key, color, is_visible, sort_order,
* description) * description)
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -42,21 +42,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$description = trim((string)($_POST['description'] ?? '')); $description = trim((string)($_POST['description'] ?? ''));
if ($name === '' || !preg_match('/^[a-z0-9_\-]+$/', $layerKey)) { if ($name === '' || !preg_match('/^[a-z0-9_\-]+$/', $layerKey)) {
$feedback = 'Nom ou clé de couche invalide (clé··: lettres minuscules, chiffres, - et _ uniquement).'; $feedback = 'Nom ou clé de couche invalide (clé: lettres minuscules, chiffres, - et _ uniquement).';
$feedbackType = 'error'; $feedbackType = 'error';
} elseif ($color === null) { } elseif ($color === null) {
$feedback = 'Couleur invalide (format attendu : #rrggbb).'; $feedback = 'Couleur invalide (format attendu : #rrggbb).';
$feedbackType = 'error'; $feedbackType = 'error';
} else { } else {
try { try {
// Correction de l'erreur MySQL 1093 avec une table dérivée (sous-requête AS m2)
$stmt = $db->prepare( $stmt = $db->prepare(
'INSERT INTO map_layers (name, layer_key, color, is_visible, sort_order, description) 'INSERT INTO map_layers (name, layer_key, color, is_visible, sort_order, description)
VALUES (?, ?, ?, 1, (SELECT COALESCE(MAX(sort_order), 0) + 1 FROM map_layers AS m2), ?)' VALUES (?, ?, ?, 1, (SELECT COALESCE(MAX(m2.sort_order), 0) + 1 FROM (SELECT sort_order FROM map_layers) AS m2), ?)'
); );
$stmt->execute([$name, $layerKey, $color, $description]); $stmt->execute([$name, $layerKey, $color, $description]);
$feedback = 'Couche créée.'; $feedback = 'Couche créée.';
} catch (Throwable $e) { } catch (Throwable $e) {
$feedback = 'Erreur lors de la création (clé·· déjà utilisée ?) : ' . $e->getMessage(); $feedback = 'Erreur lors de la création (clé déjà utilisée ?) : ' . $e->getMessage();
$feedbackType = 'error'; $feedbackType = 'error';
} }
} }
@@ -65,7 +66,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($layerId) { if ($layerId) {
$stmt = $db->prepare('UPDATE map_layers SET is_visible = 1 - is_visible WHERE id = ?'); $stmt = $db->prepare('UPDATE map_layers SET is_visible = 1 - is_visible WHERE id = ?');
$stmt->execute([$layerId]); $stmt->execute([$layerId]);
$feedback = 'Visibilité·· mise à jour.'; $feedback = 'Visibilité mise à jour.';
} }
} elseif ($action === 'update_color') { } elseif ($action === 'update_color') {
$layerId = filter_input(INPUT_POST, 'layer_id', FILTER_VALIDATE_INT); $layerId = filter_input(INPUT_POST, 'layer_id', FILTER_VALIDATE_INT);
@@ -82,12 +83,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$layerId = filter_input(INPUT_POST, 'layer_id', FILTER_VALIDATE_INT); $layerId = filter_input(INPUT_POST, 'layer_id', FILTER_VALIDATE_INT);
$confirmed = isset($_POST['confirm']) && $_POST['confirm'] === '1'; $confirmed = isset($_POST['confirm']) && $_POST['confirm'] === '1';
if (!$confirmed || !$layerId) { if (!$confirmed || !$layerId) {
$feedback = 'Suppression refusé··e : confirmation manquante.'; $feedback = 'Suppression refusée : confirmation manquante.';
$feedbackType = 'error'; $feedbackType = 'error';
} else { } else {
$stmt = $db->prepare('DELETE FROM map_layers WHERE id = ? LIMIT 1'); $stmt = $db->prepare('DELETE FROM map_layers WHERE id = ? LIMIT 1');
$stmt->execute([$layerId]); $stmt->execute([$layerId]);
$feedback = $stmt->rowCount() > 0 ? 'Couche supprimé··e.' : 'Couche introuvable.'; $feedback = $stmt->rowCount() > 0 ? 'Couche supprimée.' : 'Couche introuvable.';
} }
} }
} }
@@ -107,7 +108,7 @@ $user = current_admin_username();
<main class="container"> <main class="container">
<h1>Couches cartographiques</h1> <h1>Couches cartographiques</h1>
<p>Gé··rez les couches affich ées sur la carte (visibilité··, couleur, ordre). Toute suppression demande une confirmation explicite.</p> <p>Gérez les couches affichées sur la carte (visibilité, couleur, ordre). Toute suppression demande une confirmation explicite.</p>
<?php if ($feedback !== null): ?> <?php if ($feedback !== null): ?>
<div class="alert alert-<?= $feedbackType === 'error' ? 'error' : 'success' ?>"> <div class="alert alert-<?= $feedbackType === 'error' ? 'error' : 'success' ?>">
@@ -120,10 +121,10 @@ $user = current_admin_username();
<form method="post"> <form method="post">
<?= csrf_field() ?> <?= csrf_field() ?>
<input type="hidden" name="action" value="create_layer"> <input type="hidden" name="action" value="create_layer">
<label>Nom affiché··e <label>Nom affichée
<input type="text" name="name" required maxlength="100"> <input type="text" name="name" required maxlength="100">
</label> </label>
<label>Clé·· technique <label>Clé technique
<input type="text" name="layer_key" required pattern="[a-z0-9_\-]+" placeholder="ex: sites_4g"> <input type="text" name="layer_key" required pattern="[a-z0-9_\-]+" placeholder="ex: sites_4g">
</label> </label>
<label>Couleur <label>Couleur
@@ -132,7 +133,7 @@ $user = current_admin_username();
<label>Description <label>Description
<input type="text" name="description" maxlength="255"> <input type="text" name="description" maxlength="255">
</label> </label>
<button type="submit" class="btn btn-primary">Cré··er</button> <button type="submit" class="btn btn-primary">Créer</button>
</form> </form>
</section> </section>
@@ -140,55 +141,55 @@ $user = current_admin_username();
<h2>Couches existantes (<?= count($layers) ?>)</h2> <h2>Couches existantes (<?= count($layers) ?>)</h2>
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>Ordre</th> <th>Ordre</th>
<th>Nom</th> <th>Nom</th>
<th>Clé··</th> <th>Clé</th>
<th>Couleur</th> <th>Couleur</th>
<th>Visible</th> <th>Visible</th>
<th>Description</th> <th>Description</th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php foreach ($layers as $layer): ?> <?php foreach ($layers as $layer): ?>
<tr> <tr>
<td><?= (int)$layer['sort_order'] ?></td> <td><?= (int)$layer['sort_order'] ?></td>
<td><?= htmlspecialchars((string)$layer['name'], ENT_QUOTES, 'UTF-8') ?></td> <td><?= htmlspecialchars((string)$layer['name'], ENT_QUOTES, 'UTF-8') ?></td>
<td><code><?= htmlspecialchars((string)$layer['layer_key'], ENT_QUOTES, 'UTF-8') ?></code></td> <td><code><?= htmlspecialchars((string)$layer['layer_key'], ENT_QUOTES, 'UTF-8') ?></code></td>
<td> <td>
<form method="post" style="display:inline-flex;gap:.5rem;align-items:center"> <form method="post" style="display:inline-flex;gap:.5rem;align-items:center">
<?= csrf_field() ?> <?= csrf_field() ?>
<input type="hidden" name="action" value="update_color"> <input type="hidden" name="action" value="update_color">
<input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>"> <input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>">
<input type="color" name="color" value="<?= htmlspecialchars((string)$layer['color'], ENT_QUOTES, 'UTF-8') ?>" onchange="this.form.submit()"> <input type="color" name="color" value="<?= htmlspecialchars((string)$layer['color'], ENT_QUOTES, 'UTF-8') ?>" onchange="this.form.submit()">
</form> </form>
</td> </td>
<td> <td>
<form method="post"> <form method="post">
<?= csrf_field() ?> <?= csrf_field() ?>
<input type="hidden" name="action" value="toggle_visibility"> <input type="hidden" name="action" value="toggle_visibility">
<input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>"> <input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>">
<button type="submit" class="btn btn-secondary"> <button type="submit" class="btn btn-secondary">
<?= ((int)$layer['is_visible'] === 1) ? 'Visible' : 'Masqué··e' ?> <?= ((int)$layer['is_visible'] === 1) ? 'Visible' : 'Masquée' ?>
</button> </button>
</form> </form>
</td> </td>
<td><?= htmlspecialchars((string)$layer['description'], ENT_QUOTES, 'UTF-8') ?></td> <td><?= htmlspecialchars((string)$layer['description'], ENT_QUOTES, 'UTF-8') ?></td>
<td> <td>
<form method="post" onsubmit="return confirm('Confirmer la suppression de cette couche ?');"> <form method="post" onsubmit="return confirm('Confirmer la suppression de cette couche ?');">
<?= csrf_field() ?> <?= csrf_field() ?>
<input type="hidden" name="action" value="delete_layer"> <input type="hidden" name="action" value="delete_layer">
<input type="hidden" name="confirm" value="1"> <input type="hidden" name="confirm" value="1">
<input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>"> <input type="hidden" name="layer_id" value="<?= (int)$layer['id'] ?>">
<button type="submit" class="btn btn-danger">Supprimer</button> <button type="submit" class="btn btn-danger">Supprimer</button>
</form> </form>
</td> </td>
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
<?php if (empty($layers)): ?> <?php if (empty($layers)): ?>
<tr><td colspan="7">Aucune couche configuré··e.</td></tr> <tr><td colspan="7">Aucune couche configurée.</td></tr>
<?php endif; ?> <?php endif; ?>
</tbody> </tbody>
</table> </table>
</section> </section>