[PHP] gethostbyname doet het niet.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Goedenavond,

Ik ben al een tijdje bezig met een projectje. Voor dit projectje heb ik een 50tal url's in een database. Deze laat ik door een php script loopen zodat aan elke url een ip + geolocatiegegevens worden toegekend en opgeslagen in de database.

Dit werkte allemaal prima totdat ik vandaag de database een stel nieuwe url's had gevoerd (alle andere informatie weg en alleen nog maar nieuwe url's). Als het goed is zou het script gewoon de url pakken, er een ip bij zoeken en bij dat ip de geolocatie zoeken. Alleen de ip's worden niet meer opgezocht!

Wanneer ik handmatig echo gethostbyname('www.google.nl'); doe werkt het prima. Maar wanneer ik een loopje doe met meerdere url's krijg ik alleen nog maar van de laatste url een ip.

even een quick en dirty testcase:

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
if (isset($_REQUEST['txt'])){
             
// Db leegmaken

$i = 0;
while($i <= 60)
        {

mysql_query("DELETE FROM data WHERE id = '$i'");

      
      $i++;
}
mysql_query("ALTER TABLE data AUTO_INCREMENT = 0");

// Db leeg. Weer vullen:

$urls = $_REQUEST["txt"];

    $token = strtok($urls, "
    ");
    
    while ($token !== false)
      {
      mysql_query("INSERT INTO data (url) VALUES ('$token')");
      
      echo "het ip van ".$token." is : ".gethostbyname("$token")." <br>";
      
      $token = strtok("
      ");
      }
}


Wie oh wie weet wat er aan de hand is?

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

offtopic:
Waarom doe je niet gewoon een TRUNCATE TABLE om je tabel leeg te gooien? Scheelt je 60x je index opnieuw aanmaken. :) En je weet dat je met file() een bestand in een array kunt lezen? Dan hoef je die dure strtok() calls niet constant te doen. :)

Kan je eens een voorbeeldje van je output posten? Van die echo's dus? En wat komt er in je DB?

[edit]
Mini-testcase:
http://atlex.nl/voorbeelden/php/gethostbyname.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(E_ALL);

$urls = array();
$urls[] = "google.com";
$urls[] = "atlex.nl";

for ($i = 0; $i < count($urls); $i++)
{
    echo $urls[$i].": ".gethostbyname($urls[$i])."<br>";
}

echo highlight_file(__FILE__);
?>

Dat werkt, dus maar je moet geen URL voeren want dan snapt hij het niet. Gewoon hostnames wel, dus met een FQDN moet het lukken.

[edit2]
Damn you CodeCaster. :W

[ Voor 52% gewijzigd door AtleX op 07-05-2009 20:51 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je zal je testcase toch nog moeten verkleinen, want dit werkt:
PHP:
1
2
3
4
5
$urls = array("www.google.com", "tweakers.net", "www.nu.nl");

foreach ($urls as $url) {
    print gethostbyname($url) . "\n";
}

Ah, maar dit niet:
PHP:
1
2
3
4
5
$urls = array("www.google.com", "tweakers.net", "www.nu.nl", "gathering.tweakers.net/forum");

foreach ($urls as $url) {
    print gethostbyname($url) . "\n";
}

In het laatste geval krijg ik gewoon de url te zien. Je moet de functie dus waarschijnlijk gewoon een FQDN voeren.

offtopic:
AtleX :P :w

[ Voor 44% gewijzigd door CodeCaster op 07-05-2009 20:53 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Oh jeetje, ik hobby maar wat aan hoor. Maar geweldig! dat werkt! Ik denk dat het wel lukt met die array. Ik probeer dat altijd te vermijden want ik ben nog niet zo thuis met array's. Maar wie niet waagt.. :P

Wel gek trouwens dat het eerst wel gewerkt heeft. Kan het misschien aan de while loop liggen?

[ Voor 18% gewijzigd door A.Kebab op 07-05-2009 20:53 ]


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Kijk eens naar mijn voorbeeldje, dan moet je een heel eind komen. :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Hoe kan ik dan vanuit een database een array populaten? Van arrays heb ik helaas nog maar heel weinig kaas gegeten :) Never mind. Al http://www.desilva.biz/arrays/poparray.html gevonden :)

Wel geweldig hoe snel en goed jullie reageren!

code:
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
www.nl.wikipedia.org: 91.198.174.2
www.imdb.com: 72.21.206.70
www.amazon.com: 72.21.210.250
amazon.co.uk: 87.238.81.129
www.imdb.com: 72.21.206.70
www.realmovienews.com: 208.100.12.10
www.pjthomson.co.uk: 87.106.105.69
www.fabrics4less.co.uk: 87.106.53.228
www.kingdominteriors.co.uk: 87.106.2.119
www.homeandgardening.co.uk: 212.67.202.140
www.google.nl: 74.125.79.103
www.news.google.nl: 74.125.79.103
www.volkskrant.nl: 145.222.43.131
www.trouw.nl: 145.222.43.129
www.nrcnext.nl: 208.75.84.28
www.foksuk.nl: 145.222.43.99
www.nozzman.nl: 217.148.89.89
www.clublime.com: 194.109.217.181
www.youtube.com: 208.117.236.69
www.johnnylee.net: 74.208.88.43
www.littlegreatideas.com: 74.208.88.43
www.makezine.com: 208.201.239.36
www.oreilly.com: 208.201.239.37
www.insideria.com: 67.222.96.148
www.code.google.com: 74.125.79.100
www.ralcr.com: 216.38.50.208
www.cap.ro: 80.86.96.14
www.thecoolhunter.net: 74.200.85.224
www.whitelies.com: 89.167.181.36
www.ticketmaster.com: 88.221.80.199
www.nba.com: 194.109.192.8
www.wnba.com: 194.109.192.7
www.latimes.com: 194.109.192.8
www.dailypilot.com: 192.104.182.100
www.wetsandsurfshop.com: 72.29.166.86
www.mapquest.com: 64.12.90.100
www.eyeoffer.net: 64.202.189.170
www.getcalhoun.com: 70.182.182.66
www.lesliecakes.com: 70.167.156.129
www.garettpopcorn.com: 208.73.210.50
www.wnba.com: 194.109.192.7
www.thecoolhunter.com: 66.45.250.90
identity.net.au: 85.159.249.52
www.wipa.org.au: 63.134.200.83
www.webboy.net: 63.134.200.83
www.webstandardsgroup.org: 63.134.200.83
www.tophosts.com: 194.109.192.22
www.webmasterforums.com: 72.51.9.39
paintballforum.com: 72.51.9.60
www.verticalsports.com: www.verticalsports.com
www.google.nl : www.google.nl


Allemaal ontzettend bedankt.

[ Voor 115% gewijzigd door A.Kebab op 07-05-2009 21:16 ]


Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Sorry voor de dubbelpost, maar anders kijkt denk ik niemand meer. Het werkt weer niet zoals het zou moeten.

Ik heb een nieuwe tabel aangemaakt waar de urls in worden gezet. Haal ik het daaruit, dan werkt het niet. Haal ik de url's uit de oude tabel dan werkt het weer wel (behalve de laatste :S). Voor de rest is alles hetzelfde, alleen de tabelnaam is anders. Wat is er aan de hand? :(

De gebruikte 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
<?php
error_reporting(E_ALL);

$con = mysql_connect("localhost","root","******");
if (!$con)
  {
  die('Kan geen verbinding maken met de database. De reden is: ' . mysql_error());
  }

mysql_select_db("sites", $con);

$sql = "SELECT url FROM data";
    $result = mysql_query( $sql,$con );
        while( $row=mysql_fetch_assoc($result) )
        {
        $urls[] = $row['url'];
        }
    mysql_free_result( $result );

    for ($i = 0; $i < count($urls); $i++)
    {
                $ip = gethostbyname($urls[$i]);
                echo $ip;
                echo "<br>";
      mysql_query("UPDATE data SET name='$ip' WHERE url='$urls[$i]'");

    }
?>

[ Voor 45% gewijzigd door A.Kebab op 07-05-2009 22:12 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dan doe je bij de ene tabel toch echt iets anders :+

Sowieso kan ik je aanraden met id's te werken. Je haalt id en url op en update adhv. een id ipv. een string. Overigens kun je ip(v4)-adressen ook makkelijk opslaan als signed integer met de ip2long() functie en als je ze wilt tonen weer terug te halen met... long2ip() :)

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Cartman! schreef op donderdag 07 mei 2009 @ 22:44:
Sowieso kan ik je aanraden met id's te werken. Je haalt id en url op en update adhv. een id ipv. een string.
De URL kan toch de primary key zijn? Neemt niet weg dat ik daar ook altijd een id voor gebruik, maar dat terzijde.
Overigens kun je ip(v4)-adressen ook makkelijk opslaan als signed integer met de ip2long() functie en als je ze wilt tonen weer terug te halen met... long2ip() :)
Waarom zou je dat willen?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
'werkt het niet'. Wat werkt niet? Runt het script niet, krijg je de data niet, klopt de output niet, krijg je de db niet geupdate?

Debug eens. Wat is precies de return value van mysql_query, is er een error, zo ja, wat geeft mysql_error()? Wat is uiteindelijke de waarde van $urls?

Maar imo belangrijker:
  • Begrijp je nou echt wat je doet?
  • Lees wat PHP tutorials
  • Lees wat MySQL tutorials
  • Koop een goed boek
  • Leer hoe arrays werken. Arrays en bijbehorende functies zijn enorm krachtig in PHP
  • Isoleer eens problemen en leer dingen in stapjes. Dat hele gedoe met de db boeit niet als je puur gethosbyname() test. Die functie boeit niet als je niet de goede data weet te selecteren. Etc. etc...
  • Indent op een manier zodat het je code leesbaarder maakt
  • Controleer alle return values
  • foreach() is hier veel leesbaarder dan deze for loop
  • Query injection
  • Zet die variabelen eens niet binnen dubbele quotes. Constante strings en variabelen met de . operator aan elkaar plakken is veel leesbaarder, of alternatief, iets als sprintf()
Mijn gok, maar dat hangt af van de definitie van 'werkt niet' is dat het laatste puntje 'het' fixt.

Zo, hier heb je wat input. :>
AtleX schreef op donderdag 07 mei 2009 @ 22:48:
[...]
De URL kan toch de primary key zijn? Neemt niet weg dat ik daar ook altijd een id voor gebruik, maar dat terzijde.
[...]
Waarom zou je dat willen?
Het is allebei wellicht niet de optimale keuze qua db structuur, maar aan dat soort optimalisaties is ts nog niet aan toe. Mijn lijstje is al genoeg huiswerk voorlopig. :+

[ Voor 14% gewijzigd door Voutloos op 07-05-2009 22:53 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
AtleX schreef op donderdag 07 mei 2009 @ 22:48:
[...]
Waarom zou je dat willen?
Simpele redenering die ik altijd volg is dat een int sneller is dan een string qua db-lookups.
Het omzetten kost je iets qua tijd, maar als je het wilt vergelijken met tig miljoen andere entry's in je dbase zou de lookup-besparing zo groot moeten zijn dat je ene extra functie aanroep verwaarloosbaar is geworden...

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik vraag me trouwens ineens af wat je aan het doen bent. Je bent de IP's van websites aan het opvragen, om deze vervolgens te "geolocaten". Wat wil je vervolgens met deze informatie doen?

Ik kan je alvast een kleine hint geven: naar mijn schatting bevindt de host van zo'n 95% van de Nederlandse websites zich in Amsterdam, Den Bosch of Groningen. Dat is geen toeval, want daar bevinden zich ook de grootste datacentra van Nederland.

En over je niet-gevonden hosts: ik gok dat spaties en andere vreemde tekens (\n?) je de das omdoen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Nee, de adressen zijn allemaal netjes. Ik ben bezig voor een school opdracht. Ik moest op 1 bepaalde website beginnen en vanuit die site 50 andere bezoeken door op linkjes te drukken. Die route moet ik visualiseren naar een criteria. Mijn criteria is Afstand.

Ik heb trouwens nu gewoon de database die er al was voor de opdracht gebruikt. Het word een routeplanner. Je voert er een lijstje site's in en het script rekent de afstanden etc uit en geeft je de route. Zodat mensen kunnen zien hoe ze eigenlijk de wereld zijn overgegaan met een paar klikken.

(Ik schrijf nu erg ranzige code omdat ik er al sinds 1 uur 's middags mee bezig ben :)) Normaal doe ik het allemaal wat netter.

Als ik hierna nog tijd ervoor heb ga ik kijken of ik het nog werkend kan krijgen dat je ook werkelijk je lijstje in kan voeren. Moet niet zo moeilijk zijn.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
AtleX schreef op donderdag 07 mei 2009 @ 22:48:
[...]
Waarom zou je dat willen?
Gomez12 had t antwoord al gegeven. Als je gebruik maakt van indexes zijn de ints sneller dan strings :)

Overigens kun je de ip2long()-functie ook gebruiken om ipv4-adressen mee te valideren. Daar kan de TS ook zeker iets aan hebben.

Acties:
  • 0 Henk 'm!

  • A.Kebab
  • Registratie: Mei 2005
  • Niet online
Oh oh, ik heb het antwoord gevonden. Ik had toch de url's niet netjes laten strippen. Het werkt nu als een zonnetje!
Pagina: 1