Probleme avec un serveur fax : Duplicate key

Eléphant du PHP | 86 Messages

25 janv. 2007, 11:26

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
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 janv. 2007, 11:51

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.

Eléphant du PHP | 86 Messages

25 janv. 2007, 12:07

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é
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 janv. 2007, 12:19

Et est-ce que id_fax n'a pas comme attribut "UNIQUE" ?

Eléphant du PHP | 86 Messages

25 janv. 2007, 13:12

non pas d'attribut unique :?
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

ViPHP
ViPHP | 2144 Messages

25 janv. 2007, 13:17

Exporte la structure de la table et copie-colle là ici, pour qu'on puisse voir à quoi elle ressemble.

Eléphant du PHP | 86 Messages

25 janv. 2007, 13:21

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;
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

ViPHP
ViPHP | 2144 Messages

25 janv. 2007, 13:24

Merci, tu as le message d'erreur complêt aussi ?

Eléphant du PHP | 86 Messages

25 janv. 2007, 13:24

non desolé car pour l'avoir, je doit arreter le serveur et je ne peut pas :oops:

CA me met DUPLICATE KEYS
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

ViPHP
ViPHP | 2144 Messages

25 janv. 2007, 13:27

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

Eléphant du PHP | 86 Messages

25 janv. 2007, 13:29

je pense que le duplicate se situe au niveau de num_fax mais je ne vois pas où
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

ViPHP
ViPHP | 2144 Messages

25 janv. 2007, 13:31

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é.

Eléphant du PHP | 86 Messages

25 janv. 2007, 15:10

mais je ne le modifie pas, je recupere seulement le premier et le dernier num_fax des fax non-envoyés
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 janv. 2007, 16:08

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

Eléphant du PHP | 86 Messages

25 janv. 2007, 16:20

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:
Comme dit le proverbe chinois:"Si tu parles a tes chaussons.....C'est que tu es le Roi des C..." :D