Skip to content
Extraits de code Groupes Projets
Valider abf203da rédigé par marcimat's avatar marcimat
Parcourir les fichiers

fix: Éviter une fatale SQL lors de l’optimisation de liens avec des objets...

fix: Éviter une fatale SQL lors de l’optimisation de liens avec des objets éditoriaux qui ne sont plus déclarés

Refs: #5837
parent fccc2c88
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -764,51 +764,55 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets) { ...@@ -764,51 +764,55 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets) {
foreach ($id_objets as $id_objet) { foreach ($id_objets as $id_objet) {
$where = lien_where($primary, $id, $objet, $id_objet); $where = lien_where($primary, $id, $objet, $id_objet);
# les liens vers un objet inexistant # les liens vers un objet inexistant
$r = sql_select('DISTINCT objet', $table_lien, $where); $r = sql_allfetsel('DISTINCT objet', $table_lien, $where);
while ($t = sql_fetch($r)) { $r = array_filter(array_column($r, 'objet'));
$type = $t['objet']; foreach ($r as $type) {
$spip_table_objet = table_objet_sql($type); $spip_table_objet = table_objet_sql($type);
$id_table_objet = id_table_objet($type); if (sql_table_exists($spip_table_objet)) {
$res = sql_select( $id_table_objet = id_table_objet($type);
"L.$primary AS id,L.id_objet", $res = sql_select(
// la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes "L.$primary AS id,L.id_objet",
// du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN // la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes
// il faut les eliminier en repetant la condition dans le where L.objet='xxx' // du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN
"$table_lien AS L // il faut les eliminier en repetant la condition dans le where L.objet='xxx'
LEFT JOIN $spip_table_objet AS O "$table_lien AS L
ON (O.$id_table_objet=L.id_objet AND L.objet=" . sql_quote($type) . ')', LEFT JOIN $spip_table_objet AS O
'L.objet=' . sql_quote($type) . " AND O.$id_table_objet IS NULL" ON (O.$id_table_objet=L.id_objet AND L.objet=" . sql_quote($type) . ')',
); 'L.objet=' . sql_quote($type) . " AND O.$id_table_objet IS NULL"
// sur une cle primaire composee, pas d'autres solutions que de virer un a un
while ($row = sql_fetch($res)) {
if ($primary === 'id_document' && in_array($type, ['site', 'rubrique']) && !(int) $row['id_objet']) {
continue; // gaffe, c'est le logo du site ou des rubriques!
}
$e = sql_delete(
$table_lien,
["$primary=" . $row['id'], 'id_objet=' . $row['id_objet'], 'objet=' . sql_quote($type)]
); );
if ($e != false) { // sur une cle primaire composee, pas d'autres solutions que de virer un a un
$dels += $e; while ($row = sql_fetch($res)) {
spip_logger('genie')->notice( if ($primary === 'id_document' && in_array($type, ['site', 'rubrique']) && !(int) $row['id_objet']) {
'lien_optimise: Entree ' . $row['id'] . '/' . $row['id_objet'] . "/$type supprimee dans la table $table_lien" continue; // gaffe, c'est le logo du site ou des rubriques!
}
$e = sql_delete(
$table_lien,
["$primary=" . $row['id'], 'id_objet=' . $row['id_objet'], 'objet=' . sql_quote($type)]
); );
if ($e != false) {
$dels += $e;
spip_logger('genie')->notice(
'lien_optimise: Entree ' . $row['id'] . '/' . $row['id_objet'] . "/$type supprimee dans la table $table_lien"
);
}
} }
} }
} }
# les liens depuis un objet inexistant # les liens depuis un objet inexistant
$table_source = table_objet_sql($objet_source); $table_source = table_objet_sql($objet_source);
// filtrer selon $id, $objet, $id_objet eventuellement fournis if (sql_table_exists($table_source)) {
// (en general '*' pour chaque) // filtrer selon $id, $objet, $id_objet eventuellement fournis
$where = lien_where("L.$primary", $id, $objet, $id_objet); // (en general '*' pour chaque)
$where[] = "O.$primary IS NULL"; $where = lien_where("L.$primary", $id, $objet, $id_objet);
$res = sql_select( $where[] = "O.$primary IS NULL";
"L.$primary AS id", $res = sql_select(
"$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary", "L.$primary AS id",
$where "$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary",
); $where
$dels += optimiser_sansref($table_lien, $primary, $res); );
$dels += optimiser_sansref($table_lien, $primary, $res);
}
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter