Erreur répétition d'IP

Répondre
jackbocar
le 17/02/2009 à 08:17
jackbocar
Bonjour,

J’ai une erreur qui se produit de temps en temps sur mon serveur de test après un rafraichissement de page et sur UBUNTU : « violation répétition de l’adresse IP »

Ca ne se produit pas sur mon serveur de test Windows et Wampserveur.

Voyez-vous une erreur dans mon code ?

Merci de votre aide.

Jack Bocar


Classe connexion
<?php
class db{
private static $instance = NULL;

private function __construct() {
}

public static function getInstance() {

if (!self::$instance)
{
self::$instance = new PDO("mysql:host=localhost;dbname=my_counter", 'login', 'password');;
self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$instance;
}

private function __clone(){
}

} /*** END class ***/

?>




Code visiteurs connectés
<?php
try {

$tps_max_connex = 60;

$temps_actuel = date("U");

$result = DB::getInstance()->query('SELECT count(*) FROM visiteurs_online WHERE ip= "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
foreach($result as $data)
$dbh = null;

if ($data[0]) {
$result = DB::getInstance()->query('UPDATE visiteurs_online SET time = "'.$temps_actuel.'" WHERE ip = "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
}
else {
$result = DB::getInstance()->query('INSERT INTO visiteurs_online VALUES("'.mysql_escape_string($_SERVER['REMOTE_ADDR']). '", "'.$temps_actuel.'")');
}

$heure_max = $temps_actuel - $tps_max_connex;

$result2 = DB::getInstance()->query('DELETE FROM visiteurs_online where time < "'.$heure_max.'"');
?>

<?php
$result = DB::getInstance()->query('SELECT count(*) FROM visiteurs_online');
$dbh = null;

echo '<span class="visites">Actuellement &nbsp; <em class="bold">' , $data[0] , ' </em> &nbsp; visiteur(s) sur le site </span>';
echo '<span class="visites"> - Votre adresse IP est : <em class="bold"> ';
echo htmlentities($_SERVER["REMOTE_ADDR"], ENT_QUOTES);
echo '</em> </span>';

}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
jackbocar
le 17/02/2009 à 10:37
jackbocar
Bonjour,

Merci de ta réponse.

Désolé, j’ai fais une erreur dans mon modèle de code, je t’ai envoyé un test qui est visiblement le bon.

Dans celui que je me sers en ce moment, l’erreur vient de Mysql : SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'PRIMARY'

J’ai simplement oublié de changer dans mon code qui est en ligne : foreach($result as $row) par foreach($result as $data).

Bien sur, je peux aussi tout passer en $row, mais, je pense que $data dans ce ca la, est préférable.

Merci

Jack Bocar
jackbocar
le 17/02/2009 à 12:07
jackbocar
Bonjour,

Mon compteur de nombre connecté, ne fonctionne pas, il affiche uniquement celui qui est en ligne, et pas les autres. Autrement dit, tu ne vois que ta connexion (1).

Alors que mon code avec une connexion MYSQLI, fonctionne correctement !!!

Je ne comprends pas ce qui ne va pas dans mon code PDO ?

Si tu as une solution, merci de m’en faire part.

Jack Bocar


<?php
function db_connect()
{
$result = new mysqli('localhost', 'jackbocar', 'password', 'login');
if (!$result)
throw new Exception('Connexion impossible au serveur de base de donn&eacute;es');
else
return $result;
}

$tps_max_connex = 60;

$temps_actuel = date("U");

$conn = db_connect();
$result = $conn->query('SELECT count(*) FROM visiteurs_online WHERE ip= "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
$data = $result->fetch_array(MYSQLI_NUM);
$result->close();



if ($data[0]) {
$result = $conn->query('UPDATE visiteurs_online SET time = "'.$temps_actuel.'" WHERE ip = "'.mysql_escape_string($_SERVER['REMOTE_ADDR']).'"');
}
else {
$result = $conn->query('INSERT INTO visiteurs_online VALUES("'.mysql_escape_string($_SERVER['REMOTE_ADDR']). '", "'.$temps_actuel.'")');
}

$heure_max = $temps_actuel - $tps_max_connex;


$result2 = $conn->query('DELETE FROM visiteurs_online where time < "'.$heure_max.'"');
?>

<?php
$conn = db_connect();
$result = $conn->query('SELECT count(*) FROM visiteurs_online');
$data = $result->fetch_array(MYSQLI_NUM);
$result->close();

echo '<span class="visites">Actuellement &nbsp; <em class="bold">' , $data[0] , ' </em> &nbsp; visiteur(s) sur le site </span>';
echo '<span class="visites"> - Votre adresse IP est : <em class="bold"> ';
echo htmlentities($_SERVER["REMOTE_ADDR"], ENT_QUOTES);
echo '</em> </span>';
?>
zebden
le 20/02/2009 à 16:50
zebden
Lu,

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'PRIMARY'


ça veut dire que t'essaies deux fois la même valeur dans la clé primaire.
Regarde du côté de "ON DUPLICATE KEY UPDATE" ou "REPLACE" avec une préférence pour la 1er.

Bon courage ^^
zebdinou pour les intimes / Blog : http://www.zebden.fr
jackbocar
le 09/03/2009 à 19:34
jackbocar
Bonjour

J’ai essayé ce que tu m’as proposé. Je n’y arrive pas, le serveur m’envoie des erreurs du genre « vérifie ta syntaxe, revoie ton manuel pauvre C… ».

J’ai remarqué que lorsque je vide la table, il m’envoie l’erreur :
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'PRIMARY'

Je ne comprends pas, vu qu’elle est vide !!!

Une fois le premier enregistrement effectué, je n’ai plus d’erreurs, mais le compteur reste bloqué à 1.

Je crains qu’il ne me faille mettre les mains dans le cambouis…

Jack Bocar
LupusMic
le 11/03/2009 à 23:01
LupusMic
Quel est le create de la table ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 14/03/2009 à 09:14
jackbocar
Bonjour

CREATE TABLE IF NOT EXISTS `visiteurs_online` (
`ip` varchar(15) NOT NULL DEFAULT '',
`time` bigint(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `visiteurs_online`
--

INSERT INTO `visiteurs_online` (`ip`, `time`) VALUES
('127.0.0.1', 1236846477);

Merci de te pencher sur mon problème

Jack Bocar
LupusMic
le 15/03/2009 à 20:05
LupusMic
Essaye de faire précéder l'insertion par une suppression :

delete from visiteurs_online where ip ='127.0.0.1' ;

Et dis-moi si le problème de clé survient à nouveau.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours