From c8a34aea9a29499b8693a7d328d19d29175a5c9e Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 7 Oct 2010 21:36:41 +0000 Subject: [PATCH] Debug de editer_liens et fonctionnement corrige pour correspondre aux tests : les fonctions associer/dissocier renvoient le nombre de de liens affectes (inseres ou supprimes) la fonction set renvoie false en cas d'erreur ou 1 sinon, et ne donne pas acces au nombre de donnees modifiees --- ecrire/action/editer_liens.php | 55 ++++++++++++++++++++++++---------- ecrire/base/connect_sql.php | 3 ++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/ecrire/action/editer_liens.php b/ecrire/action/editer_liens.php index c9ab292fdd..6e8323b897 100644 --- a/ecrire/action/editer_liens.php +++ b/ecrire/action/editer_liens.php @@ -58,12 +58,12 @@ function objet_associable($objet){ * @return string */ function objet_associer($objets_source, $objets_lies, $qualif = null){ - objet_traiter_laisons('lien_insert', $objets_source, $objets_lies); + $modifs = objet_traiter_laisons('lien_insert', $objets_source, $objets_lies); if ($qualif) objet_qualifier($objets_source, $objets, $qualif); - return ''; // pas d'erreur + return $modifs; // pas d'erreur } @@ -86,9 +86,7 @@ function objet_associer($objets_source, $objets_lies, $qualif = null){ * @return string */ function objet_dissocier($objets_source,$objets_lies){ - objet_traiter_laisons('lien_delete',$objets_source,$objets_lies); - - return ''; // pas d'erreur + return objet_traiter_laisons('lien_delete',$objets_source,$objets_lies); } @@ -111,7 +109,7 @@ function objet_dissocier($objets_source,$objets_lies){ * @param array $qualif */ function objet_qualifier($objets_source,$objets_lies,$qualif){ - objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif); + return objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif); } @@ -149,20 +147,27 @@ function objet_qualifier($objets_source,$objets_lies,$qualif){ function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = null){ // accepter une syntaxe minimale pour supprimer tous les liens if ($objets_lies=='*') $objets_lies = array('*'=>'*'); - + $modifs = 0; // compter le nombre de modifications + $echec = null; foreach($objets_source as $objet=>$ids){ if ($a = objet_associable($objet)) { list($primary,$l) = $a; if (!is_array($ids)) $ids = array($ids); foreach($ids as $id) { $res = $operation($objet,$primary,$l,$id,$objets_lies,$set); - if ($res===false) + if ($res===false) { spip_log("objet_traiter_laisons [Echec] : $operation sur $objet/$primary/$l/$id"); + $echec = true; + } + else + $modifs+=$res; } } + else + $echec = true; } - return ''; // pas d'erreur + return ($echec?false:$modifs); // pas d'erreur } @@ -185,21 +190,26 @@ function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = nu */ function lien_insert($objet_source,$primary,$table_lien,$id,$objets) { $ins = 0; + $echec = null; foreach($objets as $objet => $id_objets){ if (!is_array($id_objets)) $id_objets = array($id_objets); foreach($id_objets as $id_objet) { + $objet = objet_type($objet); # securite if ($id_objet=intval($id_objet) AND !sql_getfetsel( $primary, $table_lien, array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), $primary.'='.intval($id)))) { - if (sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id))!==false); + $e = sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id)); + if ($e!==false) $ins++; + else + $echec = true; } } } - return $ins; + return ($echec?false:$ins); } function lien_where($primary, $id_source, $objet, $id_objet){ @@ -237,17 +247,24 @@ function lien_where($primary, $id_source, $objet, $id_objet){ */ function lien_delete($objet_source,$primary,$table_lien,$id,$objets){ $retire = array(); + $dels = 0; + $echec = false; foreach($objets as $objet => $id_objets){ + $objet = objet_type($objet); # securite if (!is_array($id_objets)) $id_objets = array($id_objets); foreach($id_objets as $id_objet) { $where = lien_where($primary, $id, $objet, $id_objet); - sql_delete($table_lien, $where); + $e = sql_delete($table_lien, $where); + if ($e!==false) + $dels+=$e; + else + $echec = true; $retire[] = array('source'=>array($objet_source=>$id),'lien'=>array($objet=>$id_objet),'type'=>$objet,'id'=>$id_objet); } } pipeline('trig_supprimer_objets_lies',$retire); - return ''; // pas d'erreur + return ($echec?false:$dels); } /** @@ -270,14 +287,20 @@ function lien_delete($objet_source,$primary,$table_lien,$id,$objets){ * @param array $qualif */ function lien_set($objet_source,$primary,$table_lien,$id,$objets,$qualif){ + $echec = null; + if (!$qualif) + return false; foreach($objets as $objet => $id_objets){ + $objet = objet_type($objet); # securite if (!is_array($id_objets)) $id_objets = array($id_objets); foreach($id_objets as $id_objet) { - $where = lien_where($objet_source, $id, $objet, $id_objet); - if ($c) - sql_updateq($table_lien,$qualif,$where); + $where = lien_where($primary, $id, $objet, $id_objet); + $e = sql_updateq($table_lien,$qualif,$where); + if ($e===false) + $echec = true; } } + return ($echec?false:true); } diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php index d30937c3a3..08a0c5d35c 100644 --- a/ecrire/base/connect_sql.php +++ b/ecrire/base/connect_sql.php @@ -292,6 +292,9 @@ function objet_type($table_objet){ $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet); if (isset($surnoms[$type])) return $surnoms[$type]; + + // securite : eliminer les caracteres non \w + $type = preg_replace(',[^\w],','',$type); // si le type redonne bien la table c'est bon // oui si table_objet ressemblait deja a un type -- GitLab