<?php


//===========================================================================================
// les appels à cette fonction doivent être remplacés (si possible) par des appels à delcascade2
function delcascade($select,$from,$where,$deltable) {
if (!is_array($deltable)) $deltable=array($deltable);
$res=query("SELECT $select FROM $from WHERE $where");
$q=0;
$liste='';
while (list($id)=mysql_fetch_array($res)) {
    $liste.=','.$id;
    $q++;
    if ($q==100) {
        $liste=substr($liste,1);
        for ($i=0; $i<count($deltable); $i++)
            query('DELETE FROM '.$deltable[$i]." WHERE $select IN ($liste)");
        $q=0;
        $liste='';
        }
    }
if ($q) {
    $liste=substr($liste,1);
    for ($i=0; $i<count($deltable); $i++)
        query('DELETE FROM '.$deltable[$i]." WHERE $select IN ($liste)");
    }
mysql_free_result($res);
query("DELETE FROM $from WHERE $select IN ($liste)");
return mysql_affected_rows();
}


//découper le tableau d'id à supprimer en sous-tableaux de 100
function sql_liste(&$tpid,$requetes) {
$t=array_chunk($tpid,100);
if (!is_array($requetes)) $requetes=array($requetes);
//exécuter chaque requête en la terminant pas IN (<la liste retournée par le SELECT>)
//utilisé par des requêtes DELETE ou (plus rarement) UPDATE
foreach($t as $tpartiel) {
	$lpart=implode(",",$tpartiel);
	foreach($requetes as $req) query($req." IN ($lpart)");
	}
}

//===========================================================================================
//suppression en cascade version 2
//1) Effectue le $select (paramètre 1) dont le rôle est de récupérer une liste de champs `id` 
//		ex : $select="SELECT id FROM table WHERE condition")
//2) Stocke les champs obtenus dans une liste 
//3) effectue la ou les requêtes (paramètre 2) en y ajoutant à la fin "IN (liste)". 
//		ex : $requetes="DELETE FROM table2 WHERE champ "
//		 la fonction effectuera : DELETE FROM table2 WHERE champ IN (liste)
//NB1 : Le paramètre 2 peut être une chaîne (une seule requête) ou un tableau de requêtes.
//NB2 : La table de base qui a servi dans le SELECT n'est pas purgée par la fonction.
function delcascade2($select,$requetes) {
$tpid=array();
$res=query($select);
while (list($tpid[])=mysql_fetch_array($res));
//la requête a retourné un tableau d'id
array_pop($tpid); //car le dernier passage génère un élément de tableau vide
if (is_string($requetes)) $requetes=array($requetes); 
sql_liste($tpid,$requetes);
}	

?>
