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:
@ -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
|
||||
)
|
||||
";
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user