PHP xpath query für jede URL im array

Gajel

Banned
Registriert
Mai 2010
Beiträge
1.146
Hallo, ich sitze gerade an einem kleinen php "projekt" und komme aktuell nicht weiter, da php absolut nicht meine stärke ist.

Ich habe folgenden code, der mir 2 div-container von einer bestimmten url ausließt und diese in eine datenbank speichert. Das klappt alles soweit gut.

PHP:
$url = 'https://www.example.com/test';

$dom = new DOMDocument('1.0');

@$dom->loadHTMLFile($url);

$xpath = new DomXpath($dom);

$tprice = $xpath->query('//tr/td/span/a[not(contains(text(),"eBay")) and not(contains(text(),"TEST"))]/../../../td[contains(@class, "os-total-col")]');
$seller = $xpath->query('//td/span/a[not(contains(text(),"eBay")) and not(contains(text(),"TEST"))]');

foreach($seller as $item) {
$item->removeAttribute("href");
}

$vk = $dom->saveXML($seller[0]);
$tp = $dom->saveXML($tprice[0]);

#mysql into a column ....

$stmt->close();
$conn->close();

Des weiteren habe ich ein array mit ein paar url's!

PHP:
Array
(
    [0] => Array
        (
            [0] => https://www.mydomain1.com/test
        )

    [1] => Array
        (
            [0] => https://www.mydomain2.com/test
        )

    [2] => Array
        (
            [0] => https://www.mydomain3.com/test
        )

    [3] => Array
        (
            [0] => https://www.mydomain4.com/test
        )

    [4] => Array
        (
            [0] => https://www.mydomain5.com/test
        )

)

Und jetzt möchte ich gerne die ganze "funktion" also den ersten code für jede url aus dem array ausführen, am besten mit einer kleinen pause zwischen den url's (sleep) Ich hab schon google bemüht aber finde kein richtigen ansatz. Jemand eine idee, tip wie auch immer wie man das "problem" lösen kann?

Besten dank im voraus :)
 
weißt du jetzt nicht wie man auf die Werte des (verschachtelten) Arrays zugreift? Ich meine "PHP iterate array"
bringt doch bestimmt tausende von Antworten, oder nicht?

PHP:
$arr = # hier dein array
foreach ($arr as &$value) {
    # mach was mit $value
}

(Warum ist es eigentlich verschachtelt? Hast du das gemacht?)

Oder hast du irgendeine andere Frage bzgl. deines Projektes?
 
Wie gesagt php ist nicht meine stärke, bin gelernter/studierter designer aber das meiste kriege ich in php durch probieren hin.

Also das array mit den url's bastel ich mir wie folgt zusammen:

Code:
$server = "123.123.123.123";
$username = "username";
$password = "123456789";
$dbname = "mydb";

$conn = new mysqli($server, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$stmt = $conn->prepare("SELECT pid FROM articles WHERE pid <> ''");
$stmt->execute();

$data = $stmt->get_result()->fetch_all();

foreach ($data as $data_main) {
        $gpid_link[] = array('https://www.mydomain/'.$data_main[0].'?prds=scoring:tps');
    }

print "<pre>";
print_r($gpid_link);
print "</pre>";

$stmt->close();
$conn->close();

Wieso das array in dem fall verschachelt, weiß ich nicht mal 100 % aber das wollte ich mir auch noch mal angucken und es zur not entschachteln mit php, optimaler wäre natürlich gleich ein einfaches array aus meiner abfrage zu bekommen. Aber wie gesagt ich mache das alles stück für stück, da kein php profi.

So und genau diese url's aus dem array möchte ich gerne wie schon erwähnt verarbeiten. Also 2 div-inhalte grabben und diese dann in eine db schreiben.

Danke dir schon mal :)

Edit: Das umwandeln vom array klappt mit:

Code:
$singleArray = array();
foreach ($gpid_link as $key => $value){
    $singleArray[$key] = $value[0];
}

Ausgabe ist dann:

Code:
Array
(
    [0] => https://www.mydomain/123?prds=scoring:tps
    [1] => https://www.mydomain/145?prds=scoring:tps
    [2] => https://www.mydomain/547?prds=scoring:tps
    [3] => https://www.mydomain/632?prds=scoring:tps
    [4] => https://www.mydomain/985?prds=scoring:tps
)

Gibt es trotzdem eine möglichkeit ein einfaches array direkt aus meiner sql abfrage zu bekommen?
 
Zuletzt bearbeitet:
Na ja jetzt schweife ich ab ... wie gesagt, mein ziel ist es für jede url aus dem (jetzt einfachen) array, meine "funktion" auszuführen.
 
Das verschachtelte Array erstellst du selber und zwar wo du die URL mit der pid verbindest.
Dort schreibst du array('https://...'); und fuegst es zu $gpid_link hinzu.

Schreibe es wie folgt und das Problem waere geloest.
PHP:
foreach ($data as $data_main) {
    $gpid_link[] = 'https://www.mydomain/'.$data_main[0].'?prds=scoring:tps';
}

Kannst du dir aber auch alles sparen, indem du den Code aus dem ersten Post einfach direkt in der Schleife ausfuehrst. (Oder in eine Funkion packst und diese dann aufrufst)

PHP:
<?php

$server = "123.123.123.123";
$username = "username";
$password = "123456789";
$dbname = "mydb";

$conn = new mysqli($server, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$stmt = $conn->prepare("SELECT pid FROM articles WHERE pid <> ''");
$stmt->execute();

$data = $stmt->get_result()->fetch_all();

foreach ($data as $data_main) {
    $url = 'https://www.mydomain/'.$data_main[0].'?prds=scoring:tps';
    
    $dom = new DOMDocument('1.0');

    @$dom->loadHTMLFile($url);

    $xpath = new DomXpath($dom);

    $tprice = $xpath->query('//tr/td/span/a[not(contains(text(),"eBay")) and not(contains(text(),"TEST"))]/../../../td[contains(@class, "os-total-col")]');
    $seller = $xpath->query('//td/span/a[not(contains(text(),"eBay")) and not(contains(text(),"TEST"))]');

    foreach($seller as $item) {
        $item->removeAttribute("href");
    }

    $vk = $dom->saveXML($seller[0]);
    $tp = $dom->saveXML($tprice[0]);

    #mysql into a column ....
}

$stmt->close();
$conn->close();
 
  • Gefällt mir
Reaktionen: abcddcba und Gajel
Zurück
Oben