Page 1 sur 2

Probleme avec un serveur fax : Duplicate key

Posté : 25 janv. 2007, 11:26
par tinou
Bonjour a tous 8-)

Alors je vais essayer de vous exposer mon probleme de facon claire :

J'ai un serveur fax, c'est a dire qu'on ne s'embete plus a envoyer des faxs a l a main mais en html via le serveur.
Vu que celui-ci a tendence a planter de temps en temps, nous perdons tout les faxs ayant ete envoyés entre le plantage et la reparation.

J'espere etre claire :?:

C'est pour cela que mon directeur m'a demandé de faire quelque chose, j'ai donc creer une fonction:
function testServeur($numf)
{
	if($numf==0)
	{
		
		//***arret et redemarrage du serveur fax*******
		$command="sudo service hylafax stop";
		$res=syscall($command); //arret du fax
		$command2="sudo service hylafax stop";
		$res=syscall($command2); //2eme arret du fax au cas où :)
		$command3="sudo service hylafax start";
		$res=syscall($command3); //lancement du fax

		//*****MaJ de la table envois(id_fax=-1)***

		$requete="UPDATE envois SET id_fax=-1 WHERE id_fax=0 AND date(dateenvoi)=date(NOW())";
		mysql_query($requete) or die(mysql_error());
		
		
		//****renvoie du fax*******
		
		$prems="";
		$sql_req="SELECT destinataire,personne,tel,fax,contrat,ta,ref_client,codeclient,codeoperation,num_fax FROM envois WHERE date(dateenvoi)=date(NOW()) AND id_fax=-1 ORDER BY dateenvoi";
		$sql_res = mysql_query($sql_req) or die(mysql_error());			
		
		while($bdd = mysql_fetch_array($sql_res))
		{
			if($prems=""){ $prems=$bdd[9]; }

			$opt= array($bdd[4],$bdd[0],$bdd[1],$bdd[2],$bdd[6],$bdd[3],$bdd[5],$bdd[8],$bdd[7],$bdd[9]);
			$fic=completeFax($opt);
			envoyerFax($opt,$rep.$fic);
		}
		$der=$bdd[9];

		//******insertion dans la table problemes*****
					
		$sql_req="INSERT INTO problemes VALUES (NOW(),'".$prems."','".$der."')"; 
		mysql_query($sql_req) or die(mysql_error());
	}
}
Et voila ma fonction envoyerFax
function envoyerFax($opt,$cheminFichierComplete)
{

	$res=syscall('/usr/local/bin/html2ps -e iso-8859-1 -S "@page{width:21.0cm;margin-top:0.5cm;margin-bottom:0.5cm;margin-left:1.0cm;margin-right:1.0cm;}body{font-family:Times}" '.$cheminFichierComplete.' |sendfax -n -N -d '.$opt[5]);

	//On récupère l'id du fax dans $res[0][3]
	$res=formaterResultatCommande($res);

	//Construction de la requête
	$sql_req='INSERT INTO envois (destinataire,personne,tel,fax,contrat,ta,dateenvoi,id_fax,ref_client,codeclient,codeoperation,num_fax)';
	$sql_req.=' VALUES ("'.$opt[1].'","'.$opt[2].'","'.$opt[3].'","';
	$sql_req.=$opt[5].'","'.$opt[0].'","'; 
	$sql_req.=$_SESSION['identifiant'].'",NOW(),"'.$res[0][3].'","'.$opt[4].'","'.$opt[7].'","'.$opt[6].'","'.$opt[9].'")';
	echo '<BR>'.$sql_req;
		
	//Requête SQL d'ajout du fax dans la BDD
	$dbid=connecterBDD();
	$sql_res = mysql_query($sql_req,$dbid) or die(mysql_error());
	echo'test1';
	testServeur($res[0][3]);
	echo'test3';
	deconnecterBDD($dbid);
}
Alors, reprenons la premier fonction :
- le redemarrage du serveur fonctionne
- l'update fonctionne, mes id_fax prennent bien la valeur -1 (cela permet de voir quels fax ont été traité)
- ensuite c'est la que ca plante, j'ai le message d'erreur : "DUPLICATE KEYS


Je suis ouvert a toute aide cependant je ne pourrais pas tester vos idées avant demain soir car le serveur tourne la journée et je ne peut pas leur couper le fax

Merci d'avance

Posté : 25 janv. 2007, 11:51
par ouckileou
J'ai lu vite fait mais si tu changes les valeurs des clés primaires c'est bien normal.

Une clé primaire identifie une ligne, elle a une valeur unique, et on n'y touche pas pour pas s'embêter.

Tu ferais mieux de rajouter une colonne "status" par exemple, et ce serait elle que tu modifierais.

Posté : 25 janv. 2007, 12:07
par tinou
désolé j'ai oublié de precisé, id_fax n'est pas la clé primaire, c'est un identifiant permettant de savoir si le fax a bien été envoyé ou non, si c'est le cas, il prend une valeur du genre 17542 sinon il prend la valeur 0.

Donc id_fax correspond a ton statut et num_fax a ma clé

Posté : 25 janv. 2007, 12:19
par ouckileou
Et est-ce que id_fax n'a pas comme attribut "UNIQUE" ?

Posté : 25 janv. 2007, 13:12
par tinou
non pas d'attribut unique :?

Posté : 25 janv. 2007, 13:17
par iclo
Exporte la structure de la table et copie-colle là ici, pour qu'on puisse voir à quoi elle ressemble.

Posté : 25 janv. 2007, 13:21
par tinou
voici la table :

CREATE TABLE envois (
destinataire varchar(30) NOT NULL default '',
personne varchar(30) NOT NULL default 'Comité d''entreprise',
tel varchar(15) default NULL,
fax varchar(15) NOT NULL default '0',
contrat varchar(30) NOT NULL default '',
ta varchar(30) NOT NULL default '0',
dateenvoi datetime NOT NULL default '1901-01-01 00:00:00',
id_fax int(11) NOT NULL default '0',
ref_client varchar(255) NOT NULL default '0',
codeclient int(8) NOT NULL default '0',
codeoperation int(4) NOT NULL default '0',
num_fax int(11) NOT NULL auto_increment,
PRIMARY KEY (num_fax)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Posté : 25 janv. 2007, 13:24
par iclo
Merci, tu as le message d'erreur complêt aussi ?

Posté : 25 janv. 2007, 13:24
par tinou
non desolé car pour l'avoir, je doit arreter le serveur et je ne peut pas :oops:

CA me met DUPLICATE KEYS

Posté : 25 janv. 2007, 13:27
par iclo
Ok, mais je crois qu'il vaudra mieux attendre d'avoir le message d'erreur, parce que je ne vois pas trop comment il peut y avoir un duplicate key sur id_fax

Posté : 25 janv. 2007, 13:29
par tinou
je pense que le duplicate se situe au niveau de num_fax mais je ne vois pas où

Posté : 25 janv. 2007, 13:31
par iclo
Ha, si c'est num_fax, c'est normal, c'est un champ auto-incrémenté, par le serveur, qui n'accepte pas les doublons, et d'ailleurs ne doit pas être modifié.

Posté : 25 janv. 2007, 15:10
par tinou
mais je ne le modifie pas, je recupere seulement le premier et le dernier num_fax des fax non-envoyés

Posté : 25 janv. 2007, 16:08
par ouckileou
Tu ne le modifies pas mais tu en insères un, donc peut-être qu'il existe déjà.

Regarde celui que tu insères quand tu as l'erreur, puis fais un select dessus, tu verras bien

Posté : 25 janv. 2007, 16:20
par tinou
tu as raison, je renvoie le fax mais vu qu'il avait deja un num_fax il y a conflit de clé.

il faudrait que je fasse un truc du genre num_fax+ un entier mais le probleme c'est qu'il peut y avoir 50 fax ou plus que je doit renvoyer donc quel entier je doit choisir?

Suis-je claire :?: :roll: