Zoals je hierboven ziet zo ziet het er nu uit.
Hier komen de logs van de ingelogde users.

Maar er kunnen niet 2 dezelfden in 'usern'
dus als peter 1x inlogt komt dit hier te staan
Maar als hij voor de 2e X inlogt komt dit er niet tussen, hoe is dit op te lossen?
Als je op het moment dat iemand inlogt de bovenstaande query uitvoert zou dit gewoon moeten werken mits de tabel geen speciale restricties heeft ten aanzien van kolomwaarden.

Ook moet je natuurlijk zorgen dat je de inlog-informatie op de goede plaats ophaalt, $_REQUEST is nogal algemeen.

Waarom heet deze tabel trouwens USERS en niet login_log ofzo?

Dit is toch niet een tabel voor de opslag van gegevens van bestaande users wel? Anders moet je je aanpak veranderen... Je zou dan een kolom laatste_ip en laatste_login_datum aan kunnen maken en deze informatie altijd bijwerken als iemand inlogt.

Je aanpak wordt bepaald door de betekenis van de tabel.
Als usern de primary key is staat er een UNIQUE constraint op.
Als het de PK is dan is de naam onderstreept als je de tabel structuur bekijkt.

Je kan dit oplossen met ON DUPLICATE KEY UPDATE:

INSERT INTO USERS (usern, ip, id, date)
VALUES('peter', '192.168.0.254', 22, NOW())
ON DUPLICATE KEY UPDATE
ip = VALUES(ip),
id = VALUES(id),
date = VALUES(date)
Dat kan, maar dan voeg je toch twee compleet verschillende dingen samen?

Inloggen !== registreren

De topicstarter moet een aantal dingen voor ons (en mogelijk ook voor zichzelf) ontwarren.
Ger van Steenderen op 03/03/2015 11:35:50

Als usern de primary key is staat er een UNIQUE constraint op.
Als het de PK is dan is de naam onderstreept als je de tabel structuur bekijkt.

Je kan dit oplossen met ON DUPLICATE KEY UPDATE:

INSERT INTO USERS (usern, ip, id, date)
VALUES('peter', '192.168.0.254', 22, NOW())
ON DUPLICATE KEY UPDATE
ip = VALUES(ip),
id = VALUES(id),
date = VALUES(date)



Hallo,

Ik heb dit geprobeert maar hierbij bleef de pagina wit.

$fname = $_REQUEST['fname'];
$fname1 = $_REQUEST['fname1']; 
$fname2 = $ip=$_SERVER['REMOTE_ADDR'];
$fname3 = $_GET['id'];
$fname4 = date('Y/m/d H:i:s');
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO USERS (usern, ip, id, date)
    VALUES ('$fname', '$fname2', '$fname3', '$fname4')";
    ON DUPLICATE KEY INSERT
    UPDATE ip = $_REQUEST['fname2']; 
    UPDATE id = $_REQUEST['fname3']; 
    UPDATE date = $_REQUEST['fname4']; 

    $conn->exec($sql);
Jeroen dj op 03/03/2015 15:52:05

Hallo,

Ik heb dit geprobeert maar hierbij bleef de pagina wit.


Staat error_reporting uit?
ON DUPLICATE .... hoort bij de insert query, je kan dit letterlijk overnemen uit mijn voorbeeld, je moet alleen de waardes voor de kolommen, vervangen door jouw PHP variabelen.
Voor de volledigheid:

<?php
$sql = "INSERT INTO USERS (usern, ip, id, date)
	VALUES('$fname', '$fname2', '$fname3', NOW())
	ON DUPLICATE KEY UPDATE
	ip = VALUES(ip),
	id = VALUES(id),
	date = VALUES(date)";
?>
Ger van Steenderen op 03/03/2015 19:26:58

ON DUPLICATE .... hoort bij de insert query, je kan dit letterlijk overnemen uit mijn voorbeeld, je moet alleen de waardes voor de kolommen, vervangen door jouw PHP variabelen.
Voor de volledigheid:

<?php
$sql = "INSERT INTO USERS (usern, ip, id, date)
	VALUES('$fname', '$fname2', '$fname3', NOW())
	ON DUPLICATE KEY UPDATE
	ip = VALUES(ip),
	id = VALUES(id),
	date = VALUES(date)";
?>



Bedankt, maar dit werkt niet
Ik krijg nu geen error maar hij update de datum etc niet.

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$sql = "INSERT INTO USERS (usern, ip, id, date)
    VALUES('$fname', '$fname1', '$fname3', '$fname4')
    ON DUPLICATE KEY UPDATE
    ip = VALUES(ip),
    id = VALUES(id),
    date = VALUES(date)";

Date is een gereserveerd woord, wellicht helpt het als je deze tussen `backticks` zet.

Persoonlijk zou ik niet voor deze aanpak gaan eigenlijk.
Date is geen gereserveerd woord, raar maar waar.

Even buiten wel of niet deze aanpak, ON DUPLICATE KEY UPDATE werkt alleen als een waarde wordt ingevoerd die al bestaat in de tabel voor een kolom met een unieke index.

Blijkbaar is dan usern niet de primary key, het lijkt er zelfs op dat er helemaal geen PK in de tabel aanwezig is, wat natuurlijk wel moet.
Huh, you are right. I stand corrected :].

Maar goed, de vraag is een beetje: wil (moet) je deze twee verschillende dingen (willen) combineren.

Ik ben toch een beetje voor een doorzichtige werking, hier hang je met deze tabelcreatie extra betekenis aan bepaalde kolommen die gaan over de data die bepaalt wat een INSERT-query doet. Misschien is het handig om dit soort zaken toch te programmeren? Bij een nieuwe registratie zul je ook iets moeten als een gebruikersnaam al bestaat. Een registratie laat je niet "kapot" gaan enkel door de unique restrictie lijkt mij?

Daarnaast, als je het IP gebruikt om (in combinatie met andere informatie) logins te onthouden dan heb je misschien een flexibelere aanpak nodig dan het enkel onthouden van de laatste entry.

Het doel lijkt ook "logging" wat mogelijk het bestaansrecht van een aparte tabel rechtvaardigt.

Reageren