[php] link ontleden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een vraagje, ik ben een link activatie systeem aan het maken. En heb al wat dingetjes uitgewerkt. Maar ik loop elke keer op hetzelfde punt vast. Het defineren van de path.

Ik wil de link ontleden omdat, ik een soort van categorie index wil opstellen in de database. En voor betere en snellere zoekresultaten.

het probleem is, dat de parserhele gekke waardes terug geeft.
hij geeft de waardes:
,array,php

Ik heb een aparte link gemaakt naar dit bestand, om te zorgen dat hij ook een referer heeft.
hier mijn nieuwe code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
//REFERER SPLITTEN BEGIN: 
$referer = $_SERVER['HTTP_REFERER']; 
$referer = str_replace("http://", "", $referer); 
$referer = explode(".", $referer); 
$domein = $referer[1].$referer[2].$referer[3]; 
$land = $referer[3]; 
$land = explode("/", $land); 
$path = count($land); 
for($i=1; <$path; $i++) { 
$path = $path[$i]; 
                                    } 
$path = $land[1] 
$land = $land[0]; 
         echo "$domein , $land , $path"; 

?>


Weet iemand hoe het komt dat de parser deze waardes terug geeft?

Acties:
  • 0 Henk 'm!

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 10-07 16:50

dawuss

gadgeteer

als php bij een stukje code als
PHP:
1
<? echo $blaat; ?>

"array" output, dan betekent dat dat deze variabele een array is. Probeer $domein, $land en $path eens door print_r heen te halen, om te kijken wat er in zit.

[ Voor 63% gewijzigd door dawuss op 13-01-2004 21:29 ]

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

Ik heb speciaal voor jou ;) een beginnetje gemaakt:
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
$regularExpression =
/* protocol: */                 '^(http|https|ftp)' .
/* dubbele-punt-slash-slash */      '\://' . // dubbelle punt ge-escaped

/* begin username/pass */           '(' .
/* user */                          '([[:alpha:][:digit:]\._-]+)?' .
/* dubbelepunt */                       '\:' .
/* password */                      '([[:alpha:][:digit:]\._-]+)?' .
/* eind username pass */            '@)?' .


/* begin domeinnaam */              '(' .
/* normaal */                           '([[:alpha:][:digit:]\.-]+)' .
                                    '('.
                                        '\.(' .
/* country top level domain */                      'ac|......|zw' .
                                                '|' .
/* generic top level domain */                      'aero|......|int' .
                                                '|' .
/* infrasturcture top level domain */                   'arpa' .
                                        ')' .
                                    ')' .
/* eind domeinnaam */               ')' .

/* evt. poortnummer */              '(\:([[:digit:]]+))?' .

/* begin na de slash */             '(/' .
                                '([[:alpha:][:digit:]_/\.-]+)?' .
/* de evt. query */                 '(\?[[:alpha:][:digit:]&=\.-]+)?' .
/* de evt. anchor */                    '(#([[:alpha:][:digit:]-]+)?)?' .
/* eind na de slash */              ')?' .
'';
Is nog niet af natuurlijk, maar het is alvast iets. :)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
ik gebruik zelf
PHP:
1
preg_match("!(\w+):\/\/(\w+):?(.*?)@(.*?):?(\d*)\/(\w+)!si",$connection,$matches);
, die vreet dingen als mysql://root@localhost/vip met en zonder poort of wachtwoord. Als je 'm een beetje verandert zou je er ook complete urls mee kunnen matchen.

ACM gebruikt deze altijd:
PHP:
1
'!(^|[ \n\r\t])(((ftp://)|(http://)|(https://))(([a-z0-9_-]+)(:([a-z0-9_\-]+([a-z0-9_\-]+\@)?))?\@)?(www\.)?([a-z0-9_-]|\.)+(\.[a-z]{2,4})(\:[0-9]+)?(/[^/: \n\r]*)*)!i', // Jaapf's regexp voor url's

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
PHP heeft een standaard functie hiervoor; parse_url.

Die is echter niet zo efficient als je alleen de hostnaam wilt hebben. Zie de benchmarks in dit topic.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
heel erg tnx! met deze functie heb ik al 3 kwart van de info die ik wil hebben. Maar met parse_url() kun je niet het land defineren. Iemand tips hoe dit wel zou kunnen dus?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Je wilt het laatste gedeelte uit de hostnaam hebben? Dan splitten op '.' en het laatste element pakken.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
en hoe split ik ?

Kan ik strpos() ook gebruiken. dus:

$land = strpos($referer, "/");

Alleen het rotte is is dat strpos geen waarde terug geeft maar false of true of zit ik verkeerd?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
explode -- Split een string door string

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nu dacht ik dat het me bijna gelukt was.. maar ik heb blijkbaar te vroeg gejuicht.

Ik heb de $url[host] gexplode, dan zou ik kunnen doen: $land[1] maar als een domein subdomein heeft zit ik in de knel.

Dus dacht ik laten we het andersom doen. dus dat hij begint bij de laatste . te tellen. Dit wilt dus zeggen dat $land[0] nl moet zijn, alleen de parser geeft echter geen waarde terug :(

code:
1
2
3
4
5
6
7
8
9
<?
//REFERER SPLITTEN BEGIN:
                 $url = parse_url($_SERVER['HTTP_REFERER']);
                 $land = explode(".", $url[host]);
                 $land = sort($land);
                 $land = $land[0];
                echo "$land $url[host]";

?>


link naar het script: http://www.hozee.org/kees/nl2be/index.php

[ Voor 9% gewijzigd door Verwijderd op 14-01-2004 15:05 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Om het laatste item uit een array te pakken...
PHP:
1
2
$land = explode('.',$url[host]);
$land = $land[count($land)-1];

of (deze molt wel je oorspronkelijke array door het laatste element eraf te halen)
PHP:
1
2
$land = explode('.',$url[host]);
$land = array_push($land);

of
PHP:
1
2
3
$land = explode('.',$url[host]);
array_reverse($land);
$land = $land[0];

of (tweaker-modus)
PHP:
1
2
3
4
for ($i = 0; $i < count($land); $i++)
{
$land = $land[$i];
}

Maar die laatste heeft wel een dikke overhead... Persoonlijk zou ik voor de middelste gaan. Met array_shift() pak je trouwens het eerste item.

[ Voor 110% gewijzigd door Skaah op 14-01-2004 15:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik kan je wel zoenen :P O+ het werkt :P O-)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Verwijderd schreef op 14 januari 2004 @ 15:44:
ik kan je wel zoenen :P O+ het werkt :P O-)
Stuur maar een ecard

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou eindelijk is het dan gelukt om een link te ontleden..

Maar nu ben ik weer ergens anders tegen aan gelopen..
Ik wil sessies en referers in de database opslaan.
velden van nl2be_referers zijn:
id int(12) NOT NULL auto_increment,
time int(11) NOT NULL default '0',
land char(3) NOT NULL default '',
domain varchar(200) NOT NULL default '',
path varchar(200) NOT NULL default '',
session_id int(5) NOT NULL default '0',
bestel varchar(5) NOT NULL default '0',
ip varchar(20) NOT NULL default '',
PRIMARY KEY (id)

en van sessies:
id int(5) NOT NULL auto_increment,
time int(11) NOT NULL default '0',
ip varchar(20) NOT NULL default '',
referer_id int(12) NOT NULL default '0',
PRIMARY KEY (id)

Alles gaat eigenlijk wel goed bijna, hij update: id,time, land,domain,path,bestel,ip,id,time,ip.

Het probleem is dus dat hij niet referer_id niet opslaat en session_id.. Ik hoop dat iemand weet waar het aan ligt. Ik heb een paar keer het script doorgelopen en gecheckt op spelfouten enzo maar ik denk dat het aan de structuur ligt, maar niet precies hoe en waarom...? :?

mijn code:

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
<?
include("mysql.php");
//VERWIJDERT SESSIES OUDER DAN EEN DAG:
$ipadres = $_SERVER['REMOTE_ADDR'];
$verlooptijd = time() - '86400';
$deletesql = "DELETE FROM nl2be_sessies WHERE time>'$verlooptijd'";
mysql_query($deletesql);

//KIJKT OF DE GEBRUIKER BESTAAT, ZONIET VOEG SESSIE IN
$sessiesql = "SELECT * FROM nl2be_sessies WHERE ip='$ipadres'";
$sessiequery = mysql_query($sessiesql);
$rows = mysql_num_rows($sessiequery);
$referersql = "SELECT * FROM nl2be_referer WHERE ip='$ipadres'";
$refererquery = mysql_query($referersql);
if($rows < 1) {   //sessie bestaat niet
$refererarray = mysql_fetch_array($refererquery);

//REFERER SPLITTEN BEGIN:
$url = parse_url($_SERVER['HTTP_REFERER']);
  $land = explode(".", $url[host]);
  $land = array_reverse($land);
$url[land] = $land[0];
//REFERER SPLITTEN EIND.

//VOEG REFERER IN
$sessiearray = mysql_fetch_array($sessiequery);
$insert = "INSERT INTO nl2be_referer (time, land, domain, path, session_id, ip) VALUES ('$visittime', '$url[land]', '$url[host]', '$url[path]', '$sessiearray[session_id]', '$ipadres')";
mysql_query($insert);
$insert = "INSERT INTO nl2be_sessies (time, ip, referer_id) VALUES ('$time', '$ipadres', '$refererarray[referer_id]')";
mysql_query($insert);
}
echo "$refererarray[id] ,  $sessiearray[id]";
?>



@skaah.. kaartje is verstuurt ;)

[ Voor 10% gewijzigd door Verwijderd op 14-01-2004 21:29 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
$sessiesql = "SELECT * FROM nl2be_sessies WHERE ip='$ipadres'";


Dat werkt niet, er kunnen meerdere mensen achter een proxy zitten, zijn die ineens allemaal ingelogd! Als je nou aan het begin van je sessie een koekje zet, en dan checked op die dat koekje. Misschien dat je hier beter een nieuw topic over kunt maken.
Pagina: 1