PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 14-09-2014 15:17:39

ing_tiziouzou2014
Membre
Inscription : 14-09-2014
Messages : 13

[RÉSOLU]Utilisation des boucles en php

Bonjour à tous;
Voilà ,  j'ai écris un script php  qui a pour but de compter le nombre d'enregistrements dans une table qui s'appelle "mdl_log" de ma base de données "moodle" , si ce nombre dépasse 100000, alors il crée une nouvelle table appelée "mdl_log1" , il insère les 100000 premiers enregistrements dans cette dernière  puis il les supprime dans la table d'origine ,c'est à dire dans "mdl_log". Voici mon script:


<?php
date_default_timezone_set('Africa/Algiers') ;
set_time_limit(0);
$debut= date('H:i:s');
//die();

include ('connection.php');

$db=mysql_select_db("moodle");
///////////////////////////
$sql_cpt= "SELECT COUNT(id) as NBR FROM mdl_log";
$res_sql_cpt=mysql_query($sql_cpt);
if($res_sql_cpt==FALSE)
{die(mysql_error());
mysql_close();}
$rep_sql_cpt= mysql_fetch_array($res_sql_cpt);
{
mysql_free_result($res_sql_cpt);
$NBR=$rep_sql_cpt['NBR'];
echo ' nbr= '.$NBR;
}

if($NBR>=100000)
{

$sql_create="CREATE TABLE `moodle`.`mdl_log1` (
`id` bigint( 10 ) NOT NULL AUTO_INCREMENT ,
`time` bigint( 10 ) NOT NULL DEFAULT '0',
`userid` bigint( 10 ) NOT NULL DEFAULT '0',
`ip` varchar( 45 ) NOT NULL DEFAULT '',
`course` bigint( 10 ) NOT NULL DEFAULT '0',
`module` varchar( 20 ) NOT NULL DEFAULT '',
`cmid` bigint( 10 ) NOT NULL DEFAULT '0',
`action` varchar( 40 ) NOT NULL DEFAULT '',
`url` varchar( 100 ) NOT NULL DEFAULT '',
`info` varchar( 255 ) NOT NULL DEFAULT '',
PRIMARY KEY ( `id` ) ,
KEY `mdl_log_coumodact_ix` ( `course` , `module` , `action` ) ,
KEY `mdl_log_tim_ix` ( `time` ) ,
KEY `mdl_log_act_ix` ( `action` ) ,
KEY `mdl_log_usecou_ix` ( `userid` , `course` ) ,
KEY `mdl_log_cmi_ix` ( `cmid` )
)";

$res1=mysql_query($sql_create);
if ($res1==FALSE)
echo mysql_error();
$sql_insert="INSERT INTO `moodle`.`mdl_log1` (SELECT* FROM `moodle`.`mdl_log`   WHERE `mdl_log`.`id` >=1 AND `mdl_log`.`id`<=100000)
";
$res_sql_insert=mysql_query($sql_insert);
if ($res_sql_insert==FALSE)
echo mysql_erreur();

mysql_close();
$sql_suppr="DELETE FROM `moodle`.`mdl_log` WHERE `mdl_log`.`id`>=1  AND `mdl_log`.`id`<=100000";
$res_sql_suppr=mysql_query($sql_suppr);
if ($res_sql_suppr==FALSE)
echo mysql_erreur();
}
}
mysql_close();
   
?>

Sachant que le champs 'id' est incrémenté automatiquement et que le nombre d'enregistrements augmente d'une manière rapide , par conséquent , j'aurais besoin de plusieurs tables et pas seulement d'une seule comme je l'ai fait dans le script et que les enregistrements à insérer seront toujours les 100000 premiers: Je m'explique: pour la première table mdl_log1, les enregistrements à insérer  commenceront à partir de 1 jusqu'à 100000. Pour la deuxième table mdl_log2, les enregistrements à insérer  commenceront à partir de 100001 à 200001 et ainsi de suite..
Pourrez-vous me dire comment  améliorer mon script afin qu'il réponde à mes besoins?
Je suis désolée pour ce long message et merci d'avance.

Dernière modification par ing_tiziouzou2014 (22-09-2014 14:51:01)

Hors ligne

#2 15-09-2014 07:51:41

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : [RÉSOLU]Utilisation des boucles en php

la meilleurs des améliorations serait de ne pas le faire wink
a++

Hors ligne

#3 15-09-2014 09:58:02

ing_tiziouzou2014
Membre
Inscription : 14-09-2014
Messages : 13

Re : [RÉSOLU]Utilisation des boucles en php

Bonjour;
Si j'ai posé ce problème sur le forum, c'est que je suis bloqué et j'ai vraiment besoin d'aide!!!: Merci quand même pour l'intervention!

Dernière modification par ing_tiziouzou2014 (15-09-2014 09:58:57)

Hors ligne

#4 15-09-2014 12:43:30

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [RÉSOLU]Utilisation des boucles en php

Bonjour,

Voilà ,  j'ai écris un script php  qui a pour but de compter le nombre d'enregistrements dans une table qui s'appelle "mdl_log" de ma base de données "moodle" , si ce nombre dépasse 100000, alors il crée une nouvelle table appelée "mdl_log1" , il insère les 100000 premiers enregistrements dans cette dernière  puis il les supprime dans la table d'origine ,c'est à dire dans "mdl_log".

Pourriez-vous nous expliquer la raison de ce choix oh combien mystérieux? Il faut bien dire que sa pertinence est loin d'être évidente...
De plus quel intérêt de définir l'ID de cette table en bigint si c'est pour s'arrêter à 100 000 lignes de log?

Définir l'heure d'une course au format time et non datetime me paraît non approprié aussi, même s'il s'agit apparemment de courses africaines, je ne vois pas en quoi cela rend un tel choix plus pertinent.

Ensuite, en admettons l'impensable, il faudrait passer pour le moins par un truncate et non un delete, et puis faire cela en procédure stockée.

Bonne journée.

Dernière modification par Jc (15-09-2014 12:44:07)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 15-09-2014 16:15:24

ing_tiziouzou2014
Membre
Inscription : 14-09-2014
Messages : 13

Re : [RÉSOLU]Utilisation des boucles en php

Bonsoir;
Merci JC, effectivement vous avez raison de m'avoir posé ce genre de question c'est un test que je dois faire avant de procéder au programme final et puis la structure de la table mdl_log1 ce n'est pas moi qui l'a choisit, j'ai seulement respecté celle de la table d'origine (mdl_log) puisqu'elle est prédéfinie ,je sais très bien que  les tables Mysql sont faites pour gérer des millions d’enregistrements , mais l'année passée, on est tombés dans une situation très délicate où notre base de données 'moodle' a craché à cause de nombre d'enregistrements élevé dans la table mdl_log qui a atteint plus  de 6000000, je m'explique: on travail dans un établissement d'enseignement à distance , pour cela, on a opté pour une plate-forme d'enseignement en ligne qui est 'moodle', la table 'mdl_log' garde automatiquement l'historique de nos élèves et comme nous avons un nombre énorme d'apprenants (plus de 700000) , le nombre d'enregistrements dans la table augmente au moyenne de 2000000 par jour.Ce qui a causé le problème , alors on était obligés de transmettre le contenu de notre table quotidiennement vers d'autres  , mais malheureusement cette opération était  manuelle , cette année , nous voulons l'automatiser à l'aide d'un script php qui s’exécutera régulièrement avec cron.

Merci à vous.

Dernière modification par ing_tiziouzou2014 (15-09-2014 16:16:45)

Hors ligne

#6 16-09-2014 00:31:33

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : [RÉSOLU]Utilisation des boucles en php

6000000 d’enregistrements, c'est pas le bout du monde roll
quelle version de mysql ?
quand je vois ces méthodes d'un autre age, je ne serai pas étonnée de l'utilisation d'une très vielle version de mysql roll
quoi qu'on en disent, c'est pas les 6000000 d'enreg qui on pétés la base roll

a++

Hors ligne

#7 16-09-2014 09:09:24

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [RÉSOLU]Utilisation des boucles en php

Saluton cher ing_tiziouzou2014,

Je dois dire que mon analyse rejoins en tous points celles de mes 2 compères Jc et Pierrot.

Cette solution ressemble, à s'y méprendre, à l'emplâtre sur la jambe de bois.

J'aurais tendance à remettre en cause, a priori, la conception même de la base de données (relationnel, indexations) voire l'architecture du serveur sur lequel est implémenté MySQL.

Déporter le problème de volumétrie d'une table vers une autre, voire en la saucissonnant c'est aller de Charybde en Scylla.
Sans aller chercher très loin, si les insert dans la table sont si fréquents, choisir le moment, voire la méthode de verrouillage de la table pour procéder à sa purge va déjà s'avérer assez compliqué.

Je pense qu'il est préférable de tout remettre à plat notamment la structure de la base de données.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 22-09-2014 14:47:18

ing_tiziouzou2014
Membre
Inscription : 14-09-2014
Messages : 13

Re : [RÉSOLU]Utilisation des boucles en php

Salut à tous;


Merci pour vos interventions, maintenant j'ai trouvé la solution à mon problème, voici le script pour ceux qui trouvent le même problème que moi:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>

<?php
date_default_timezone_set('Africa/Algiers') ;
set_time_limit(0);
$debut= date('H:i:s');
//die();

include ('connection.php');
$db=mysql_select_db("moodle");
///////////////////////////
$sql_min= "SELECT MIN(id) as VAL_MIN FROM mdl_log";
$res_sql_min=mysql_query($sql_min);
if($res_sql_min==FALSE)
{die(mysql_error());
mysql_close();}
$rep_sql_min= mysql_fetch_array($res_sql_min);

mysql_free_result($res_sql_min);
$VAL_MIN=$rep_sql_min['VAL_MIN'];
echo ' Le minimum est= '.$VAL_MIN .'<br>';

$sql_max= "SELECT MAX(id) as VAL_MAX FROM mdl_log";
$res_sql_max=mysql_query($sql_max);
if($res_sql_max==FALSE)
{die(mysql_error());
mysql_close();}
$rep_sql_max= mysql_fetch_array($res_sql_max);

mysql_free_result($res_sql_max);
$VAL_MAX=$rep_sql_max['VAL_MAX'];
echo ' Le maximum est = '.$VAL_MAX  .'<br>';

$dx=$VAL_MAX-$VAL_MIN;
echo ' La difference est= '.$dx  .'<br>';

$dx1=$VAL_MAX-1000000;
echo ' adr_deb_mdl_log= '.$dx1  .'<br>';
                                /****************************************************/
                                            //creation des table

                               /****************************************************/
                                   

if ($dx>=1000000)                   
{
/*                         
$sql_create=" CREATE TABLE `moodle`.`mdl_log1` as (SELECT * FROM mdl_log WHERE id='9269739')";

$res1=mysql_query($sql_create);
if ($res1==FALSE)
{die(mysql_error());

mysql_close(); }                         

*/                                 /****************************************************/

                                   //Insertion des enregistrements dans les table

   
       
                            /****************************************************/



$time=date('i');
$table_name="`moodle`.mdl_log".$time;

$sql_insert="CREATE TABLE $table_name as (SELECT* FROM `moodle`.`mdl_log`   WHERE `mdl_log`.`id` >=$VAL_MIN AND `mdl_log`.`id`<=$dx1)";
$res_sql_insert=mysql_query($sql_insert);
if ($res_sql_insert==FALSE)
{die(mysql_error());

mysql_close(); }                         


                              /****************************************************/

                                 //suppressiondes enregistrements de la table

                               /****************************************************/

include ('connection.php');
$db=mysql_select_db("moodle");
$sql_suppr="DELETE FROM `moodle`.`mdl_log` WHERE `mdl_log`.`id`>=$VAL_MIN AND `mdl_log`.`id`<=$dx1";
$res_sql_suppr=mysql_query($sql_suppr);
if ($res_sql_suppr==FALSE)

echo mysql_erreur();
}
mysql_close();             
                       
?>
</body>
</html>

Dernière modification par ing_tiziouzou2014 (22-09-2014 14:49:15)

Hors ligne

#9 22-09-2014 15:22:50

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : [RÉSOLU]Utilisation des boucles en php

beurk beurk beurk sad neutral

a++

Hors ligne

Pied de page des forums