Avatar billede wisemind Nybegynder
15. marts 2009 - 10:34 Der er 5 kommentarer og
1 løsning

Oprydning af "404" links i mysql database med cURL

Hej eksperter!

Jeg har en stor bunke links i en database, hvor jeg skal ha sorteret alle dem fra som ikke længere eksisterer.

Alle links bliver kaldt fra en mysql database med et simpelt while loop:

$query = mysql_query("SELECT * FROM links");
while($row = mysql_fetch_array($query))
  {
    echo "<a href=\"$row[url]\" target=\"_blank\"> $row[url] </a><br>";
  }

Mit ønske går på at cURL, skal besøge hver link ($row[url]) og hvis teksten "404" findes på siden, skal den slette denne fra databasen og sige link x er slettet.

Nogen der har en ide til hvordan man gør det?
Avatar billede dkfire Nybegynder
15. marts 2009 - 12:00 #1
Jeg tror du vil finde inspiration i dette spørgsmål:
http://www.eksperten.dk/spm/868124
Avatar billede nicklasb Nybegynder
15. marts 2009 - 12:11 #2
Hvis du gerne vil bruge curl, kan du prøve med noget lignende:

function getPage($url = "http://www.example.com/") {
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch,CURLOPT_REFERER, 'http://www.google.com/');
    curl_setopt($ch,CURLOPT_TIMEOUT, 10);
    $html=curl_exec($ch);
    if($html == false){
        return false;
    }
    curl_close($ch);
    return true;
}

$query = mysql_query("SELECT * FROM links");
while($row = mysql_fetch_array($query)) {
    if (getPage($row[url])) {
        echo "<a href=\"$row[url]\" target=\"_blank\"> $row[url] </a><br>";
    } else {
        // Slet link i databasen og udskriv din besked.
    }
}
Avatar billede wisemind Nybegynder
15. marts 2009 - 12:24 #3
Hej Nicklas og tak for dit svar.

Så vidt jeg kan se ud af dit eksempel, så er "sletningen" betinget af om getPage($row[url]) er true eller false.

I flere af tilfældene eksisterer der en 404 side istedet for den original post.

Så det jeg ønsker, er at søge i den scrapede side, om "404" er et af ordene.

Har lavet et eksempel her, men ved ik hvordan man søger i curl_exec.

<?php
    $curl = curl_init();
    curl_setopt ($curl, CURLOPT_URL, "http://www.mobilefish.com/services/ipaddress_information/ipaddress_information.php");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec ($curl);
    curl_close ($curl);
    print $result;

if (in_array("Lorem ipsum generator", $result)) {
    echo "Fandt: Lorem ipsum generator";
}
?>
Avatar billede nicklasb Nybegynder
15. marts 2009 - 13:31 #4
Altså, jeg ville jo synes, man burde kunne ligge lid til, at serverne returnerer den korrekte statuskode (404). Selv om man viser sin "egen" 404-side, kan man stadig sagtens returnere en korrekt statuskode.

Men ja - det er selvfølgelig lagt fra alle der sender statuskoder. Hvis du leder i $html -variablen, kan du se om der står 404 der. Det er ikke en speciel køn løsning efter min mening, men noget i retningen af:

function getPage($url = "http://www.example.com/") {
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch,CURLOPT_REFERER, 'http://www.google.com/');
    curl_setopt($ch,CURLOPT_TIMEOUT, 10);
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

$query = mysql_query("SELECT * FROM links");
while($row = mysql_fetch_array($query)) {
    $html = getPage($row[url]);
    if ($html === false || preg_match('/404/', $html)) {
        // Slet link i databasen og udskriv din besked.
    } else {
        echo "<a href=\"$row[url]\" target=\"_blank\"> $row[url] </a><br>";
    }
}

Du kan eventuelt også bare bruge strpos eller lignende, nu det ikke er så avanceret det du leder efter.
Avatar billede wisemind Nybegynder
15. marts 2009 - 14:12 #5
Ja, ved godt det ikke er kønt, men det virker efter hensigten.

Så mange tak for din hjælp! Smider du et svar, så er pointene dine.
Avatar billede nicklasb Nybegynder
15. marts 2009 - 15:55 #6
Det har jeg allerede gjort :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester