SQL Table met zelfde fields
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?
Met een UPDATE in plaats van met een INSERT ?
Pipo Clown op 02/03/2015 20:14:08:
Met een UPDATE in plaats van met een INSERT ?
Het lijkt me dat je dan peter zijn 1e inlog gegevens overschrijft?
- geef relevante passages van bijbehorende code die deze tabel vult
- beschrijf wat je uiteindelijk probeert te bereiken
Refereer ook aan een gebruiker via een id, en niet de username...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$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')";
// use exec() because no results are returned
$conn->exec($sql);
$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')";
// use exec() because no results are returned
$conn->exec($sql);
Dit doe ik om bij te houden wie er inlogt op mijn site
Het id is gekoppeld aan de username
Gewijzigd op 02/03/2015 20:21:39 door Jeroen dj
Wat als iemand in meerdere browsers de site wil bekijken? Maakt het uit dat iemand meerdere keren inlogt?
Gewijzigd op 02/03/2015 21:19:00 door Randy vsf
Mja, dat zou ook mijn eerste ingeving zijn, maar dan zou ie toch een exception (of fatal error) moeten krijgen?
Jeroen dj op 02/03/2015 20:14:38:
Het lijkt me dat je dan peter zijn 1e inlog gegevens overschrijft?
Er staat in de openingspost nergens dat dit niet mag of niet de bedoeling is toch ?
Net zo min als dat er in staat wat unieke velden zijn of wat er wel exact verwacht wordt.
Eigenlijk wordt er in de openingspost weer van uit gegaan dat we hier allemaal een glazen bol hebben.
Wat ook wel blijkt uit de antwoorden want bij ieder antwoord wordt er wel een aanname gedaan.
Toevoeging op 02/03/2015 22:57:53:
Het lijkt me dat je dan peter zijn 1e inlog gegevens overschrijft?
[/quote]
Er staat in de openingspost nergens dat dit niet mag of niet de bedoeling is toch ?
Net zo min als dat er in staat wat unieke velden zijn of wat er wel exact verwacht wordt.
Eigenlijk wordt er in de openingspost weer van uit gegaan dat we hier allemaal een glazen bol hebben.
Wat ook wel blijkt uit de antwoorden want bij ieder antwoord wordt er wel een aanname gedaan.
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:31:44:
Moeten die / op regel 5 geen - zijn?
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:33:30:
Je vergeet ze trouwens te escapen
Ivo P op 03/03/2015 02:31:37:
Moeten die / op regel 5 geen - zijn?
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:31:44:
Moeten die / op regel 5 geen - zijn?
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:33:30:
Je vergeet ze trouwens te escapen
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:31:44:
Moeten die / op regel 5 geen - zijn?
Is er een speciale reden om alle var $fname te noemen? Niet heel handig als je script meer dan 10 regels beslaat.
Toevoeging op 03/03/2015 02:33:30:
Je vergeet ze trouwens te escapen
Nee dit heeft niet echt een bedoeling maar ik vind het gewoon gemakkelijker om met variablen te werken. Als iemand inlogt met een andere timestamp word zijn andere nogsteeds overschreven met een update wat niet mijn bedoeling is dus ik hoop dat het op een 1 of andere manier toch mogelijk is om alle logs erin te houden zonder dat iets word overschreven.
Toevoeging op 03/03/2015 10:55:47:
Randy Flujowa op 02/03/2015 21:17:55:
Staat er niet gewoon een kolom op uniek? Dan voegt die de 2e keer namelijk ook niets in.
Heb je een idee hoe ik dit zou kunnen checken?
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 het de PK is dan is de naam onderstreept als je de tabel structuur bekijkt.
Je kan dit oplossen met ON DUPLICATE KEY UPDATE:
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:
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:
Hallo,
Ik heb dit geprobeert maar hierbij bleef de pagina wit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$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);
$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.
Ik heb dit geprobeert maar hierbij bleef de pagina wit.
Staat error_reporting uit?
Voor de volledigheid:
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:
Voor de volledigheid:
Bedankt, maar dit werkt niet
Ik krijg nu geen error maar hij update de datum etc niet.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$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)";
// 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)";
Persoonlijk zou ik niet voor deze aanpak gaan eigenlijk.
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.
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.