Update

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

E Ander

E Ander

18/01/2018 19:27:11
Quote Anchor link
Ik heb een database met ip adressen van mijn website bezoekers. Die IP adressen wil ik nu van land code en streek code voorzien en tevens of het een zoekmachine is of een bezoeker.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
                    }
                    ?>

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.
Gewijzigd op 19/01/2018 13:52:33 door - Ariën -
 
PHP hulp

PHP hulp

18/03/2025 03:53:19
 
Jan Koehoorn

Jan Koehoorn

18/01/2018 19:50:55
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}

?>

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
 
E Ander

E Ander

18/01/2018 20:10:48
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/01/2018 20:17:10
Quote Anchor link
Voornaamste zaak is waarschijnlijk de realisatie dat het IP-adres een tekst (string) is, bestaande uit (mogelijk alfa)numerieke waarden, cijfers en andere symbolen. Om die reden zou deze waarde omvat moeten worden door quotes, die ontbreken in jouw oorspronkelijke codefragment.

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
 
E Ander

E Ander

18/01/2018 23:23:29
Quote Anchor link
Thomas en Jan, hartelijk dank. Het lukte makkelijker dan ik dacht.
Als ik jullie tips goed heb begrepen (en het werkt dus ik denk het wel) moest het dit worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
                    }

?>

Groeten
Peter
Gewijzigd op 19/01/2018 13:52:10 door - Ariën -
 
Jan Koehoorn

Jan Koehoorn

18/01/2018 23:26:35
Quote Anchor link
Hoi Peter,

mooi dat het gelukt is, maar je code is heel onveilig. Zie mijn opmerking over prepared statements in mijn vorige reactie.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/01/2018 23:57:44
Quote Anchor link
Alle DATA zou in principe ge-escaped moeten worden. Dit is de makkelijkste -en meest consequente- aanpak. Wanneer je alle DATA-delen (informatie van buitenaf) in je query onschadelijk maakt, bijvoorbeeld door het voorzien van quotes i.c.m. de juiste escape-functie dan is dat in principe veilig(er).

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.
 
E Ander

E Ander

19/01/2018 10:44:10
Quote Anchor link
Thomas en Jan, ik ben een beginner in PHP en MYSQL. Ik leer veel en ook nu steek ik een hoop van jullie antwoorden op.

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.
 
E Ander

E Ander

04/02/2018 10:16:41
Quote Anchor link
En na weer heel veel dagen ploeteren, internet, boeken bekijken en uitproberen kom ik weer vast te zitten met hetzelfde probleem.
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)
PHP script in nieuw venster Selecteer het PHP script
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
[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);    
?>
Gewijzigd op 04/02/2018 19:15:39 door E Ander
 
Thomas van den Heuvel

Thomas van den Heuvel

04/02/2018 16:55:08
Quote Anchor link
Ik zou het loggen van bezoek/IP's in ieder geval lostrekken van het uitzoeken in welk land/streek een IP thuishoort als hier al geen sprake van is.

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.
 
- Ariën  -
Beheerder

- Ariën -

04/02/2018 16:56:03
Quote Anchor link
Hm... Om welke foutmeldingen gaat het?
En een goede tip: Geef je query's geen nummers maar duidelijke namen, dat voorkomt straks verwarring.
 
E Ander

E Ander

04/02/2018 17:29:38
Quote Anchor link
Het gaat om de eerste fouten:
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
deel weg dan krijg ik precies te zien wat ik wil. Alleen het opslaan gaat dus eerst een tijdje fout en dan ineens goed.

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
 
- Ariën  -
Beheerder

- Ariën -

04/02/2018 17:41:28
Quote Anchor link
Gelieve code-tags te gebruiken, zodat het script beter leesbaar is. Zie ook Veelgestelde Vragen.

Mysqli_error() mist je connectie variabele.
Gewijzigd op 04/02/2018 17:44:52 door - Ariën -
 
E Ander

E Ander

04/02/2018 19:11:48
Quote Anchor link
Ariën, Hoe kan het dat halverwege het script dan plotseling die connectie variabele wel werkt? Bij sql1 en sql2 vind het ook. $link.
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.
 
- Ariën  -
Beheerder

- Ariën -

04/02/2018 19:19:05
Quote Anchor link
Blijkbaar treedt er ergens een fout op, en kan hij de mysqli_error() niet uitvoeren.
 
Thomas van den Heuvel

Thomas van den Heuvel

04/02/2018 19:44:27
Quote Anchor link
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?
 
E Ander

E Ander

04/02/2018 22:29:26
Quote Anchor link
Thomas bedankt voor je advies, dit is echter niet de uitdaging waarvoor ik het forum om advies vroeg. Mijn vraag ging over het script.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.