Bonjour,
J'ai déjà exposé mon problème dans le forum "MySql", mais je ne suis pas certain que le problème que je rencontre ne provienne pas de Php.
Dans une application pour call center, je traite une série de "suivis" qui, lors de leur traitement, permettent une composition automatique du numéro de téléphone.
Afin que deux employés du call center ne traitent pas en même temps un même suivi, dans ma table "suivis", j'ai un champ "occupe" qui est à 1 lorqu'il est en cours de traitement, sinon à 0.
Donc, dans mes requêtes de sélection du suivi à traiter au moment dit par l'employé, je ne sélectionne qu'un suivi dont le champ "occupe" est à 0. Voici, ci-après, une de mes requêtes :
select cibles.* from cibles, suivis where refCampagne = " . $param[0] . " and cibles.id = refCible and !cloture and rappelPrior = 1 and (dateRappel > date_sub(curdate(), interval 1 day) and dateRappel < date_sub(now(), interval 15 minute)) and !occupe order by dateRappel desc limit 1
Le problème est qu'en production, il arrive que des employés travaillent en même temps sur le même suivi, alors que mon champ "occupe" est bien updaté à 1 dès qu'un employé travaille dessus. Ce qui m'étonne d'autant plus, c'est que lorsque je fais le test via PhpMyAdmin, ma requête ne me ramène pas les suivis occupés, tandis que, via l'application, en ouvrant deux instances de FireFox, je reproduis à chaque fois le phénomène.
Voici deux informations supplémentaires. Dans ma requête, j'ai utilisé "SQL_NO_CACHE", mais cela n'a rien changé. Deuxièmement, j'utilise, pour tous les utilisateurs de l'application, une seule connection persistante à la base de données.
Voici les différentes portions de codes utiles :
1 2
|
$retour = $objCampagne->chargerCible($tabVendPrior); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public function chargerCible($tabVendeurs)
{
if(get_magic_quotes_gpc()) //test si les magic_quotes sont activées
$objUtilisateur = unserialize(stripslashes($_COOKIE['utilisateur']));
else
$objUtilisateur = unserialize($_COOKIE['utilisateur']);
$tab[0] = $this->id;
$tab[1] = $objUtilisateur->getId();
if(!empty($tabVendeurs))
$tab = array_merge($tab, $tabVendeurs);
$transaction = CtransactionsBdd::GetInstance("MYSQL", "speedcall");
$resuReq = $transaction->select("MYSQL_chargerCibleLapsTempsEnCoursPrior", $tab); // On charge une cible dont la date de rappel indiquée par l'utilisateur se situe dans le laps de temps +- 15 minutes par rapport à l'heure actuelle
if ($transaction->getErreur() == "Aucun résultat")
{
$resuReq2 = $transaction->select("MYSQL_chargerCibleRappelDateJourPrior", $tab); // On charge une cible dont la date de rappel indiquée par l'utilisateur est celle du jour
if(!count($resuReq2[0]))
... |
1 2 3
| case "MYSQL_chargerCibleRappelDateJourPrior":
return "select SQL_NO_CACHE cibles.* from cibles, suivis where refCampagne = " . $param[0] . " and cibles.id = refCible and !cloture and rappelPrior = 1 and (dateRappel > date_sub(curdate(), interval 1 day) and dateRappel < date_sub(now(), interval 15 minute)) and !occupe order by dateRappel desc limit 1";
break; |
Une dernière chose très étonante, afin de tracer au mieux les requêtes exécutées, j'ai voulu les écrire dans un fichier texte via ceci :
1 2 3 4 5 6 7 8
| case "MYSQL_chargerCibleRappelDateJourPrior":
$Fnm = "../rappReq.txt";
$inF = fopen($Fnm,"w");
$texte = "select SQL_NO_CACHE cibles.* from cibles, suivis where refCampagne = " . $param[0] . " and cibles.id = refCible and !cloture and rappelPrior = 1 and (dateRappel > date_sub(curdate(), interval 1 day) and dateRappel < date_sub(now(), interval 15 minute)) and !occupe order by dateRappel desc limit 1";
fwrite($inF,$texte."\n");
fclose($inF);
return "select SQL_NO_CACHE cibles.* from cibles, suivis where refCampagne = " . $param[0] . " and cibles.id = refCible and !cloture and rappelPrior = 1 and (dateRappel > date_sub(curdate(), interval 1 day) and dateRappel < date_sub(now(), interval 15 minute)) and !occupe order by dateRappel desc limit 1";
break; |
Lors de la première exécution, je retrouve bien la requête dans le fichier texte. Par contre je n'y retrouve aucune trace d'une autre requête, alors que les deux mêmes fiches client sont affichées à l'écran.
Quelqu'un aurait une idée?
Merci d'avance pour toute piste que vous pourriez m'indiquer.
Partager