将DOMXpath的结果插入MySQL

时间:2015-11-03 17:16:31

标签: php mysql

我使用这个DOMXpath查询从另一个页面中检索一些列。

$html = file_get_contents("http://localhost:8888/stockPrices.php");

libxml_use_internal_errors(true);

$doc = new \DOMDocument();

if($doc->loadHTML($html))
{
    $result = new \DOMDocument();
    $result->formatOutput = true;
    $table = $result->appendChild($result->createElement("table"));
    $thead = $table->appendChild($result->createElement("thead"));
    $tbody = $table->appendChild($result->createElement("tbody"));

    $table->setAttribute('class', 'table table-hover');

    $xpath = new \DOMXPath($doc);

    $newRow = $thead->appendChild($result->createElement("tr"));

    foreach($xpath->query("//table[@id='kurstabell']/thead/tr/th[position()=2 or position()=3 or position()=8 or position()=9 or position()=10]") as $header)
    {
        $newRow->appendChild($result->createElement("th", trim($header->nodeValue)));
    }

    foreach($xpath->query("//table[@id='kurstabell']/tbody/tr") as $row)
    {
        $newRow = $tbody->appendChild($result->createElement("tr"));

        foreach($xpath->query("./td[position()=2 or position()=3 or position()=8 or position()=9 or position()=10]", $row) as $cell)
        {
            $newRow->appendChild($result->createElement("td", trim(htmlentities($cell->nodeValue))));
        }
    }

    echo $result->saveXML($result->documentElement);
}

这会生成四列,aktiersenastehögstlägstomsatt。但我不知道如何将其插入MySQL表。我想先生成一个结果数组,如:

                    Array
(
    [1] => stdClass Object
        (
            [aktie] => AAK AB
            [senaste] => 634,50
            [högst] => 638,50
            [lägst] => 622,50
            [omsatt] => 32 094 048
        )

    [2] => stdClass Object
        (
            [aktie] => ABB Ltd
            [senaste] => 162,80
            [högst] => 163,30
            [lägst] => 161,90
            [omsatt] => 167 481 268
        )
(you get the hang of it..)
) 

根据此图片: enter image description here

然后将数组循环到表中。像这样的东西?

$sql = "INSERT INTO stock_list (`aktie`, `senaste`, `högst`, `lägst`, `omsatt`, `timestamp`) VALUES
        (:aktie, :senaste, :högst, :lägst, :omsatt)";
$query = $database->prepare($sql);

foreach($data as $stock){
$query->execute(array(':aktie' => $stock->stock,
                      ':senaste' => $stock->prevclose,
                      ':högst' => $stock->high,
                      ':lägst' => $stock->low,
                      ':omsatt' => $stock->volume
                      ));
}

我的问题:

  • 如何使用数据填充数组?
  • 如何在mysql查询中循环结果?

2 个答案:

答案 0 :(得分:0)

不知道这是否是一种解决方法。但它目前正在做我要求的事情。

 // build query...
   $sql  = "INSERT INTO stocks";

    // columns to insert into...
    $sql .="(`name`, `closing`, `high`, `low`, `turn`, `timestamp`)";

    // implode values of $array...
    // notice array_chunk, this functions splits a big array into multi.
    $str = NULL;
    foreach (array_chunk($a, 5) as $row) {
        $str .= '("'. implode('","',$row).'",NOW()),';
    }

    // Remove last ',' (comma) from string
    // We added commas in the previous step
    $str = rtrim($str,',');
    $sql .= 'VALUES '. $str ;

   // execute query...
    $app = new Connection();

    $query = $app->getConnection()->prepare($sql);
    $query->execute();

    if ($query->rowCount() <= 0) {
        echo "Something went wrong.";
        return false;
    }

return true;

答案 1 :(得分:0)

我的猜测是你真正想要的是:

$query = 'INSERT INTO stock_list
    (`aktie`, `senaste`, `högst`, `lägst`, `omsatt`, `timestamp`)
    VALUES
    (:aktie, :senaste, :högst, :lägst, :omsatt, NOW())';
$stmt = $app->getConnection()->prepare($query);
foreach ($data as $stock) {
    $stmt->execute(
        [
            ':aktie'   => $stock->aktie,
            ':senaste' => $stock->senaste,
            ':högst'   => $stock->{'högst'},
            ':lägst'   => $stock->{'lägst'},
            ':omsatt'  => $stock->omsatt,
        ]
    );
    $stmt->closeCursor();//might be required depending on DB driver, not for MySQL, though
}

请注意,我在查询字符串中调用NOW(),并且我没有将SQL函数调用绑定到我执行预准备语句的参数。总而言之,时间戳字段最好由DB本身设置(在字段定义中使用DEFAULT CURRENT_TIMESTAMP)。然后,您可以将timestamp字段退出INSERT查询,并为您正确设置。

我也改变了你使用对象stock的方式。从var_dump我可以看到属性不是stockhighlow以及所有这些。问题是,其中一些属性名称(例如lägst)有点狡猾。您可能必须使用字符串来访问它们,这可以通过编写$objVar->{'property name as string'}来完成,就像我一样。 但是,如果我是你,我会研究如何改变$data的实际情况,并尽可能改变属性名称。