Update
Inmiddels heb ik wat huiswerk gedaan en een database IP adressen van land, streek,eigenaar en soort code gemaakt.
Ik heb dus 2 databasevelden. 1)bezoekers en 2)iplandcoden.
Als ik nu van elke bezoeker uit 1) via 2 de bijbehorende gegevens zoek krijg ik als ik de database van 1) wil updaten een foutmelding.
Kan, wat ik in gedachten heb wel? Kan de data die je vergelijkt ook upgedate worden? En heeft iemand anders een voorbeeld hoe het wel kan?
Mijn script werkt tot het
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
<?php
// $ipvergelijk is een deel van het $ip adres. ipserver moet gelijk zijn aan het eerder gegeven $ip
$sqlc = "UPDATE inloggen SET land = 'United States' WHERE ipserver = $ip";
if(!$resc = mysqli_query($link, $sqlc))
{
echo "ip=".$ip."<br>";
//echo "link = ".$link."<br>";
trigger_error('Fout in query:'.mysqli_error());
mysqli_close($link);
//break 2;
}
?>
// $ipvergelijk is een deel van het $ip adres. ipserver moet gelijk zijn aan het eerder gegeven $ip
$sqlc = "UPDATE inloggen SET land = 'United States' WHERE ipserver = $ip";
if(!$resc = mysqli_query($link, $sqlc))
{
echo "ip=".$ip."<br>";
//echo "link = ".$link."<br>";
trigger_error('Fout in query:'.mysqli_error());
mysqli_close($link);
//break 2;
}
?>
deel.
Alvast bedankt voor het meedenken.
Peter
Edit:
Ik heb code-tags geplaatst in jouw posts. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 19/01/2018 13:52:33 door - Ariën -
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
<?php
$sqlc = "
UPDATE inloggen
SET land = 'United States'
WHERE ipserver = '" . mysqli_real_escape_string($link, $ip) . "'
";
if ( ! $resc = mysqli_query($link, $sqlc)) {
echo "ip=" . $ip . "<br>";
trigger_error('Fout in query:' . mysqli_error());
mysqli_close($link);
}
?>
$sqlc = "
UPDATE inloggen
SET land = 'United States'
WHERE ipserver = '" . mysqli_real_escape_string($link, $ip) . "'
";
if ( ! $resc = mysqli_query($link, $sqlc)) {
echo "ip=" . $ip . "<br>";
trigger_error('Fout in query:' . mysqli_error());
mysqli_close($link);
}
?>
En dan bespaar ik je het verhaal over prepared statements. Maar dat zou je moeten lezen.
Gewijzigd op 18/01/2018 19:51:45 door Jan Koehoorn
Jan, bedankt voor je snelle reactie. Ik kan het nu even niet uit proberen maar na het weekend ga ik het beslist invoegen en hoor je nog van me.
Ook merkt @Jan (indirect) terecht op dat dit stuk DATA in je SQL ontdaan zou moeten worden van enige mogelijke speciale betekenis, zodat deze DATA niet als SQL geïnterpreteerd kan worden. Dan heb je namelijk te maken met een SQL-injectie met mogelijk ongewenste/catastrofale gevolgen.
Gewijzigd op 18/01/2018 20:17:30 door Thomas van den Heuvel
Als ik jullie tips goed heb begrepen (en het werkt dus ik denk het wel) moest het dit worden:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$sqlc = "
UPDATE inloggen
SET land = '$ipland',
streek = '$ipstreek',
bezoekersoort = '$neemop',
eigenaar = '$ipeigenaar'
WHERE ipserver = '". mysqli_real_escape_string($link, $ip) ."'";
if(!$resc = mysqli_query($link, $sqlc))
{
echo "ip=".$ip."<br>";
trigger_error('Fout in query:'.mysqli_error());
mysqli_close($link);
}
?>
$sqlc = "
UPDATE inloggen
SET land = '$ipland',
streek = '$ipstreek',
bezoekersoort = '$neemop',
eigenaar = '$ipeigenaar'
WHERE ipserver = '". mysqli_real_escape_string($link, $ip) ."'";
if(!$resc = mysqli_query($link, $sqlc))
{
echo "ip=".$ip."<br>";
trigger_error('Fout in query:'.mysqli_error());
mysqli_close($link);
}
?>
Groeten
Peter
Gewijzigd op 19/01/2018 13:52:10 door - Ariën -
mooi dat het gelukt is, maar je code is heel onveilig. Zie mijn opmerking over prepared statements in mijn vorige reactie.
Dat is waarschijnlijk wat @Jan bedoelde: je escaped wel $ip, maar waarom niet ook $ipland, $ipstreek en $ipeigenaar? Zelfs als je de waarden van deze variabelen zelf definieert binnen je script is het uit oogpunt van "alle invoer hetzelfde behandelen" makkelijker om gewoon alles te escapen.
Prepared statements zijn een ander middel tot hetzelfde doel: veilige(re) queries. Het belangrijkste is dat je de gebruikte methodiek op de juiste manier (en daarmee dus ook consequent) toepast.
Een verkeerd gebruik van prepared statements is even onveilig, of wellicht onveiliger, omdat je dat in eerste instantie een vals gevoel van veiligheid kan geven.
Ik ben een groot voorstander van het KIS systeem. Ik begin heel basic en bouw het daarna op. Veiligheid komt dan wat later. Het bovenstaande is een eenmalig script om een berg data van mijn eigen server aan te passen op mijn eigen server. De opmerkingen van jullie ga ik zeker gebruiken in al bestaande scripts die de gebruikers statistieken invoeren.
Ik heb 3 tabellen. 1)bezoekers 2)eigenaren en 3)inloggen.
In bezoekers zitten de IPadressen van bezoekers. In eigenaren zitten de land en streek codes van de IP adressen.
Nu wil ik de bezoekers van land en streek coden voorzien. De nieuwe bezoekers worden meteen voorzien bij het bezoek maar de al eerder genoteerde bezoekers hebben geen land en streek code. (Ik ben er achter gekomen dat Digital Ocean als eigenaar van veel IP reeks adressen vreemd vaak bezoekt.)
Dus ik open met sql1 bezoekers, kijk of land ingevuld is.
Open sql2 en vergelijk het ip adres met een reeks adres, is dat bekend dan gegevens aanvullen.
Open sql3 en voer de wel of niet aangevulde gegevens in bij inloggen.
Probleem is dat ik eerst veel fout meldingen krijg en daarna ineens werkt het script.
Is er een script fout dan moet het constant fout gaan.
Het script moet m.i. goed zijn maar waar komen de foutmeldingen dan door.
Zoals ik al eerder aangaf ik ben een beginner die door internet een hoop oppikt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[size=xsmall][i]Toevoeging op 04/02/2018 10:18:56:[/i][/size]
<LINK REL=Stylsheet HREF="cybot.css" style type="text/css">
<BODY BACKGROUND="../images/perkament.jpg">
<?php
error_reporting(E_ALL);
// Report all PHP errors (see changelog)
// Zoek alle regels zonder land
echo "<table>";
echo "<tr><td>dag</td><td>datum</td><td>tijd</td><td>IPadres</td><td>pagina</td><td>bezoekersoort</td><td>land</td><td>streek</td><td>eigenaar</td><td>komt van</td></tr>";
include 'config.php';
$sqll = "SELECT * FROM bezoekers WHERE land=''";
if(!$res1 = mysqli_query($link, $sqll))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}else{
while($rij1 = mysqli_fetch_assoc($res1))
{
$bezoekersoort="0";
$dag=$rij1['dag'];
$datum=$rij1['datum'];
$tijd=$rij1['tijd'];
$ipserver=$rij1['ipserver'];
$ipvan=$rij1['ipvan'];
$pagina=$rij1['pagina'];
$komtvan=$rij1['komtvan'];
$bezoekersoort=$rij1['bezoekersoort'];
//------------vergelijk daarvan elke regel met de reeks uit eigenaren
$sql2 = "SELECT * FROM eigenaren";
if(!$res2 = mysqli_query($link, $sql2))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}else{
while($row = mysqli_fetch_assoc($res2))
{
$ipreeks = $row['ipreeks'];
$ipland = $row['ipland'];
$ipstreek = $row['ipstreek'];
$ipeigenaar = $row['ipeigenaar'];
$ipsoort = $row['ipsoort'];
$iplengte1 = strlen($ipserver);
$iplengte2 = strlen($ipreeks);
$iplengteverschil= ($iplengte1-$iplengte2);
$ipvergelijk=substr($ipserver,0,$iplengte2);
if ($ipvergelijk== $ipreeks)
{
$bezoekersoort=$ipsoort;
$land=$ipland;
$streek=$ipstreek;
$eigenaar=$ipeigenaar;
//---------------------data individuele IP
}// einde if vergelijk
}// einde while
}// einde sql2
// data is of wel of niet aangevuld
echo "<tr><td>".$dag."</td><td>".$datum."</td><td>".$tijd."</td><td>".$ipserver."</td><td>".$ipvan."</td><td>".$pagina."</td><td>".$bezoekersoort."</td><td>".$land."</td><td>".$streek."</td><td>".$eigenaar."</td><td>".$komtvan."</td></tr>";
$sql3 = "INSERT INTO inloggen(dag,datum,tijd,ipserver,ipvan,pagina,komtvan,bezoekersoort,land,streek,eigenaar)VALUES ('$dag','$datum','$tijd','$ipserver','$ipvan','$pagina','$komtvan','$bezoekersoort','$land','$streek','$eigenaar')";
if(!$res3 = mysqli_query($link, $sql3))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}//einde if sql3
}// einde While opzoeken van rege regels
}// einde sql1
echo "</table>";
mysqli_close($link);
?>
<LINK REL=Stylsheet HREF="cybot.css" style type="text/css">
<BODY BACKGROUND="../images/perkament.jpg">
<?php
error_reporting(E_ALL);
// Report all PHP errors (see changelog)
// Zoek alle regels zonder land
echo "<table>";
echo "<tr><td>dag</td><td>datum</td><td>tijd</td><td>IPadres</td><td>pagina</td><td>bezoekersoort</td><td>land</td><td>streek</td><td>eigenaar</td><td>komt van</td></tr>";
include 'config.php';
$sqll = "SELECT * FROM bezoekers WHERE land=''";
if(!$res1 = mysqli_query($link, $sqll))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}else{
while($rij1 = mysqli_fetch_assoc($res1))
{
$bezoekersoort="0";
$dag=$rij1['dag'];
$datum=$rij1['datum'];
$tijd=$rij1['tijd'];
$ipserver=$rij1['ipserver'];
$ipvan=$rij1['ipvan'];
$pagina=$rij1['pagina'];
$komtvan=$rij1['komtvan'];
$bezoekersoort=$rij1['bezoekersoort'];
//------------vergelijk daarvan elke regel met de reeks uit eigenaren
$sql2 = "SELECT * FROM eigenaren";
if(!$res2 = mysqli_query($link, $sql2))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}else{
while($row = mysqli_fetch_assoc($res2))
{
$ipreeks = $row['ipreeks'];
$ipland = $row['ipland'];
$ipstreek = $row['ipstreek'];
$ipeigenaar = $row['ipeigenaar'];
$ipsoort = $row['ipsoort'];
$iplengte1 = strlen($ipserver);
$iplengte2 = strlen($ipreeks);
$iplengteverschil= ($iplengte1-$iplengte2);
$ipvergelijk=substr($ipserver,0,$iplengte2);
if ($ipvergelijk== $ipreeks)
{
$bezoekersoort=$ipsoort;
$land=$ipland;
$streek=$ipstreek;
$eigenaar=$ipeigenaar;
//---------------------data individuele IP
}// einde if vergelijk
}// einde while
}// einde sql2
// data is of wel of niet aangevuld
echo "<tr><td>".$dag."</td><td>".$datum."</td><td>".$tijd."</td><td>".$ipserver."</td><td>".$ipvan."</td><td>".$pagina."</td><td>".$bezoekersoort."</td><td>".$land."</td><td>".$streek."</td><td>".$eigenaar."</td><td>".$komtvan."</td></tr>";
$sql3 = "INSERT INTO inloggen(dag,datum,tijd,ipserver,ipvan,pagina,komtvan,bezoekersoort,land,streek,eigenaar)VALUES ('$dag','$datum','$tijd','$ipserver','$ipvan','$pagina','$komtvan','$bezoekersoort','$land','$streek','$eigenaar')";
if(!$res3 = mysqli_query($link, $sql3))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}//einde if sql3
}// einde While opzoeken van rege regels
}// einde sql1
echo "</table>";
mysqli_close($link);
?>
Gewijzigd op 04/02/2018 19:15:39 door E Ander
En als het vastligt welk IP waar geografisch thuishoort als deze in een zeker interval zit (heb hier eigenlijk nooit een studie van gemaakt), maak hier dan gebruik van? In principe is een IP een getal (althans in IPv4) in het 256-tallige stelsel: aaa.bbb.ccc.ddd. Dit zou je dus om kunnen zetten naar een getal:
aaa * 256^3 +
bbb * 256^2 +
ccc * 256^1 +
ddd * 256^0
waarna je met een BETWEEN zou kunnen kijken in welk(e) interval(len) zo'n IP valt.
En een goede tip: Geef je query's geen nummers maar duidelijke namen, dat voorkomt straks verwarring.
Warning: mysqli_error() expects exactly 1 parameter, 0 given in /home/u970911973/public_html/scripts/landinvoer.php on line 66
Notice: Fout in query: in /home/u970911973/public_html/scripts/landinvoer.php on line 66
Vervolgens krijg ik andere fout meldingen omdat doordat ik een foutmelding heb andere foutmeldingen ontstaan.
Haal ik het:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$sql3 = "INSERT INTO inloggen(dag,datum,tijd,ipserver,ipvan,pagina,komtvan,bezoekersoort,land,streek,eigenaar)VALUES ('$dag','$datum','$tijd','$ipserver','$ipvan','$pagina','$komtvan','$bezoekersoort','$land','$streek','$eigenaar')";
if(!$res3 = mysqli_query($link, $sql3))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}//einde if sql3
if(!$res3 = mysqli_query($link, $sql3))
{
trigger_error('Fout in query: '.mysqli_error());
mysqli_close($link);
}//einde if sql3
Toevoeging op 04/02/2018 17:41:03:
Thomas, Ik werk met een gratis site van Hostinger en werd gewaarschuwd dat mijn site veel traffic veroorzaakte. Nu is mijn site niet meer dan mijn aantekeningen van een hobby, dat ik deel met wat bekenden. Om uit te zoeken waarom de site veel traffic veroorzaakte ben ik gaan uitzoeken waardoor dat kwam. Vooral 104.131.xxx.xxx bezorgden extra veel bezoekers. Nu wil ik uitzoeken of dat alleen 104.131 is of dat er meer in die streek veel bezoeken doen.
Bij dat uitzoeken hoef ik geen hulp. En omdat ik al een jaar aan data heb in een andere vorm, moet ik eerst leren hoe ik data uit één database gefilterd naar een andere database kan krijgen zonder fout voordat ik verder ga stoeien.
Ariën en Thomas bedankt voor het meekijken.
Gewijzigd op 04/02/2018 19:14:46 door E Ander
Die code tags zocht ik maar kon niet ontdekken hoe dat moest. Ehh wellicht kijk ik over het kopje veel gestelde vragen heen.;-)
Toevoeging op 04/02/2018 19:13:53:
Ariën ik zocht boven...De vragen en oplossing laag gevonden.
Blijkbaar treedt er ergens een fout op, en kan hij de mysqli_error() niet uitvoeren.
E Ander op 04/02/2018 17:29:38:
Thomas, Ik werk met een gratis site van Hostinger en werd gewaarschuwd dat mijn site veel traffic veroorzaakte.
Tijd voor een andere host? Hosting is helemaal niet duur. Krijg je wellicht ook betere support. En definieer "traffic"? Is dit echt bandbreedte? CPU-tijd? Database-activiteit? Waar komt dit vandaan? Is je site / zijn je pagina's heel erg groot? Zijn bepaalde queries knetter inefficiënt?
E Ander op 04/02/2018 17:29:38:
Nu is mijn site niet meer dan mijn aantekeningen van een hobby, dat ik deel met wat bekenden.
Zit dit alles achter een login? Heeft iemand anders daar uberhaupt iets te zoeken dan? Anders gooi het op die manier op slot wellicht. Is die extra traffic (wat dit ook moge zijn) waarschijnlijk ook meteen weg.
E Ander op 04/02/2018 17:29:38:
Vooral 104.131.xxx.xxx bezorgden extra veel bezoekers.
Dit hoeft niet per definitie iets slechts te zijn? Heb je al in access= en errorlogs gekeken wat die bezoekers precies uitspoken dan? Misschien is je site lek? Misschien zijn het hackpogingen? Wellicht wordt een contactformulier uitgebuit? Er kan echt van alles aan de hand zijn. Maar zolang het niet een regelrechte DDoS-aanval is hoeft er niet per se iets aparts aan de hand te zijn?
Op dit moment is er in ieder geval te weinig informatie over:
- de aard, samenstelling en omvang van de website
- de bezoekers, en wat men daadwerkelijk aan het uitspoken is
Misschien is deze site gewoon uit zijn (gratis) jasje gegroeid?
Toevoeging op 05/02/2018 08:57:24:
Na 2 nachtjes slapen vond ik mijn fout.
De foutmelding geeft aan dat sql3 een probleem geeft en ik ging uit van of een inlogfout of een schrijffout. Omdat na tig foutmeldingen plotseling het script deed wat ik vroeg, kon het niet de inlogfout of scriptfout zijn.
In sql1 lees ik een regel in sql2 lees ik nog een regel die ik vergelijk met sql1. Is die data gelijk dan plaats ik dat in sql3. Omdat in sql1 de velden land, streek en eigenaar al had ging ik er ten onrechte vanuit dat als er geen data was ik dat ook niet in hoefde te vullen.
Bij sql2 het while deel heeft een if die de data invuld als er iets gevonden is. Daar moet een }else{ $veld="" etc. bij om de velden land, streek en eigenaar een waarde mee te geven.
Het waren dus de lege velden die ik aanbood in sql3 de de fout genereerden.
Iedereen nogmaals bedankt voor het meedenken en alle tips die ik nu los kan laten op het werkende script.