繁体   English   中英

将DOMXpath的结果插入MySQL

[英]Insert result from DOMXpath into 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..)
) 

根据此图片: 在此处输入图片说明

然后将数组循环到表中。 像这样吗

$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查询中循环结果?

不知道这是否可以解决。 但是它目前正在按照我的要求进行。

 // 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;

我的猜测是,您真正想要的是类似于以下内容的东西:

$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函数调用绑定到执行预处理语句的参数上。 总而言之,时间戳字段最好由数据库本身设置(在字段定义中使用DEFAULT CURRENT_TIMESTAMP )。 然后,您只需将timestamp字段保留在INSERT查询中,即可为您正确设置。

我还改变了您使用stock对象的方式。 从var_dump中,我可以看到这些属性没有被称为stockhighlow等等。 问题是,其中一些属性名称(例如lägst)有点狡猾。 您可能必须使用字符串访问那些字符串,就像我一样,可以通过编写$objVar->{'property name as string'}
但是,如果我是您,我会研究更改$data实际外观的方法,并尽可能更改属性名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM