2015-11-03 129 views
1

使用此DOMXpath查询来从其他页面检索某些列。将DOMXpath的结果插入到MySQL中

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

你正在使用哪个框架? –

+0

'':timestamp'=> NOW()'这只是所有错误的阴影......正如$ query-> database-> prepare()'+'$ query-> execute' ...'$是什么查询“,你期待它是什么? –

+0

@AjeetKumar我不使用框架。 – Adam

回答

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; 
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函数调用我用参数执行准备好的语句。总而言之,时间戳字段最好由数据库本身设置(在字段定义中使用DEFAULT CURRENT_TIMESTAMP)。然后,您可以将timestamp字段从INSERT查询中删除,并且它会为您正确设置。

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