Refactor SQL queries to handle 'no_bib' as unsigned integers

This commit introduces a new function, fxBibSqlNoBibUnsigned, to ensure that 'no_bib' values are treated as unsigned integers in SQL queries. The existing SQL statements in ajax_bib_range.php and inc_fx_promoteur.php are updated to utilize this function, enhancing data integrity and comparison accuracy. These changes improve the overall reliability of bib number handling in the application.
This commit is contained in:
2026-06-18 10:37:04 -04:00
parent 0c1fc53331
commit 42bd7c36de
2 changed files with 44 additions and 22 deletions

View File

@ -203,16 +203,17 @@ if ($action == 'save') {
exit;
}
$sqlBibNumRp = fxBibSqlNoBibUnsigned('rp.no_bib');
$sqlCheckOrphans = "
SELECT COUNT(*)
FROM resultats_participants rp
INNER JOIN inscriptions_epreuves_bib b
ON b.epr_bib_id = $id
WHERE rp.epr_id = b.epr_id
AND rp.no_bib BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumRp BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND (
rp.no_bib < $start
OR rp.no_bib > $end
$sqlBibNumRp < $start
OR $sqlBibNumRp > $end
)
";

View File

@ -3714,6 +3714,16 @@ if ($teamMode <= 0) {
<?php
}
/** MSIN-4379 — no_bib est stocké en texte : comparaison / tri / MAX numériques en SQL. */
function fxBibSqlNoBibUnsigned($strColumn = 'no_bib') {
$strColumn = preg_replace('/[^a-z0-9_.]/', '', $strColumn);
if ($strColumn === '') {
$strColumn = 'no_bib';
}
return "CAST(NULLIF(TRIM($strColumn), '') AS UNSIGNED)";
}
function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
global $objDatabase, $vDomaine;
@ -3733,6 +3743,10 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
$where_sql = implode(' AND ', $where);
$sqlBibNumP = fxBibSqlNoBibUnsigned('p.no_bib');
$sqlBibNumRp = fxBibSqlNoBibUnsigned('rp.no_bib');
$sqlBibNumRp2 = fxBibSqlNoBibUnsigned('rp2.no_bib');
$sqlBibStats = "
SELECT
b.epr_bib_id,
@ -3743,7 +3757,7 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
b.epr_bib_locked,
COUNT(p.no_bib) AS nb_utilises,
MAX(p.no_bib) AS dernier_bib,
MAX($sqlBibNumP) AS dernier_bib,
(b.epr_bib_finish - b.epr_bib_start + 1) AS nb_total_range,
@ -3766,15 +3780,16 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n4
) t
WHERE t.num BETWEEN b.epr_bib_start AND IFNULL((
SELECT MAX(rp.no_bib)
SELECT MAX($sqlBibNumRp)
FROM resultats_participants rp
WHERE rp.epr_id = b.epr_id
AND rp.no_bib BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumRp BETWEEN b.epr_bib_start AND b.epr_bib_finish
), b.epr_bib_start - 1)
AND t.num NOT IN (
SELECT rp.no_bib
SELECT $sqlBibNumRp
FROM resultats_participants rp
WHERE rp.epr_id = b.epr_id
AND $sqlBibNumRp > 0
)
) AS nb_trous,
@ -3797,28 +3812,29 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n4
) t
WHERE t.num BETWEEN b.epr_bib_start AND IFNULL((
SELECT MAX(rp.no_bib)
SELECT MAX($sqlBibNumRp)
FROM resultats_participants rp
WHERE rp.epr_id = b.epr_id
AND rp.no_bib BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumRp BETWEEN b.epr_bib_start AND b.epr_bib_finish
), b.epr_bib_start - 1)
AND t.num NOT IN (
SELECT rp.no_bib
SELECT $sqlBibNumRp
FROM resultats_participants rp
WHERE rp.epr_id = b.epr_id
AND $sqlBibNumRp > 0
)
) AS liste_trous,
(
SELECT GROUP_CONCAT(DISTINCT rp.no_bib ORDER BY rp.no_bib SEPARATOR ',')
SELECT GROUP_CONCAT(DISTINCT $sqlBibNumRp ORDER BY $sqlBibNumRp SEPARATOR ',')
FROM resultats_participants rp
WHERE rp.epr_id = b.epr_id
AND rp.no_bib BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumRp BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND (
SELECT COUNT(*)
FROM resultats_participants rp2
WHERE rp2.epr_id = rp.epr_id
AND rp2.no_bib = rp.no_bib
AND $sqlBibNumRp2 = $sqlBibNumRp
) > 1
) AS liste_doublons
@ -3826,7 +3842,8 @@ function fxInfosBibRange($epr_id = 0, $epr_bib_id = 0){
LEFT JOIN resultats_participants p
ON p.epr_id = b.epr_id
AND p.no_bib BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumP BETWEEN b.epr_bib_start AND b.epr_bib_finish
AND $sqlBibNumP > 0
WHERE $where_sql
AND b.epr_bib_start IS NOT NULL
@ -4297,7 +4314,7 @@ $blnRangeLocked = fxBibRangeIsLocked($range);
<div></div>
<?php } ?>
<div class="epr-col-stats">
<div class="bib-last"><?php echo $range['dernier_bib']; ?></div>
<div class="bib-last"><?php echo (int)$last; ?></div>
<div class="bib-used"><?php echo $range['nb_utilises']; ?></div>
<div class="bib-dispo" data-dispo="<?php echo $mem_dispo; ?>"><?php echo $mem_dispo; ?></div>
</div>
@ -4438,6 +4455,7 @@ if (!empty($data)) {
// DB
// 👉 mode normal (DB)
$sqlBibNumP = fxBibSqlNoBibUnsigned('p.no_bib');
$sqlParticipants = "
SELECT
p.*,
@ -4449,8 +4467,8 @@ $sqlParticipants = "
AND c.epr_id = p.epr_id
WHERE p.is_cancelled = 0
AND p.epr_id = " . intval($epr_id) . "
" . ($hasRange ? "AND p.no_bib BETWEEN $start AND $end" : "") . "
ORDER BY p.no_bib";
" . ($hasRange ? "AND $sqlBibNumP BETWEEN $start AND $end" : "") . "
ORDER BY $sqlBibNumP";
$tabParticipants = $objDatabase->fxGetResults($sqlParticipants);
}
@ -4718,6 +4736,7 @@ function fxGetNextAvailableBib($epr_id, $tabRanges) {
global $objDatabase;
$epr_id = intval($epr_id);
$sqlBibNum = fxBibSqlNoBibUnsigned('no_bib');
if ($epr_id <= 0 || empty($tabRanges)) {
return null;
@ -4744,7 +4763,7 @@ function fxGetNextAvailableBib($epr_id, $tabRanges) {
SELECT COUNT(*)
FROM resultats_participants
WHERE epr_id = $epr_id
AND no_bib = $i
AND $sqlBibNum = $i
";
$exists = (int)$objDatabase->fxGetVar($sql);
@ -4797,6 +4816,7 @@ function fxFindNextBatchBib($epr_id, $tabRanges, $mode, &$usedBib, $teamMode = 1
$epr_id = intval($epr_id);
$teamMode = (int)$teamMode;
$sqlBibNum = fxBibSqlNoBibUnsigned('no_bib');
foreach ($tabRanges as $range) {
$start = (int)$range['start'];
@ -4816,7 +4836,7 @@ function fxFindNextBatchBib($epr_id, $tabRanges, $mode, &$usedBib, $teamMode = 1
SELECT COUNT(DISTINCT pec_id)
FROM resultats_participants
WHERE epr_id = $epr_id
AND no_bib = $i
AND $sqlBibNum = $i
AND is_cancelled = 0
AND pec_id > 0
";
@ -4829,7 +4849,7 @@ function fxFindNextBatchBib($epr_id, $tabRanges, $mode, &$usedBib, $teamMode = 1
SELECT COUNT(*)
FROM resultats_participants
WHERE epr_id = $epr_id
AND no_bib = $i
AND $sqlBibNum = $i
AND is_cancelled = 0
";
if ((int)$objDatabase->fxGetVar($sqlCheck) === 0) {
@ -5133,6 +5153,7 @@ function fxGetParticipantsForBatchReset($epr_id, $ranges) {
return [];
}
$sqlBibNumP = fxBibSqlNoBibUnsigned('p.no_bib');
$where = [];
foreach ($tabRanges as $r) {
@ -5140,7 +5161,7 @@ function fxGetParticipantsForBatchReset($epr_id, $ranges) {
$start = (int)$r['start'];
$end = (int)$r['end'];
$where[] = "(p.no_bib BETWEEN $start AND $end)";
$where[] = "($sqlBibNumP BETWEEN $start AND $end)";
}
if (empty($where)) {
@ -5157,7 +5178,7 @@ function fxGetParticipantsForBatchReset($epr_id, $ranges) {
AND (
" . implode(' OR ', $where) . "
)
ORDER BY p.no_bib
ORDER BY $sqlBibNumP
";
return $objDatabase->fxGetResults($sql);