【问题标题】:PHP foreach isn't insertingPHP foreach 没有插入
【发布时间】:2017-01-19 10:47:17
【问题描述】:

我已经被这个问题困扰了一段时间,我为这个主题所做的所有搜索都没有给我带来解决方案。此代码将 XML 的第一个产品的值插入 MySQL 表。

$xml=simplexml_load_file("URL") or die("Error: Cannot create object");

foreach ($xml->programs->products->product as $product);
foreach ($xml->programs->products->product->product_info->price as $price);

$insert = 'INSERT INTO BBB (price) VALUES (?)';
$insertStmt = $dbconnection->prepare($insert);
foreach ($product as $row) {
    $insertStmt->bind_param('s', $price);
}

$insertStmt->execute();

echo "New records created successfully";

在此之后,我得到反馈说 foreach 不能以这种方式与准备好的 PHP 语句一起工作。此后我创建了这段代码:

$xml=simplexml_load_file("URL") or die("Error: Cannot create object");

$insert = 'INSERT INTO BBB (price) VALUES (?)';
$insertStmt = $dbconnection->prepare($insert);
foreach ($tags as $key=>$val) {
    if ($key == "product") {
        $dcprice = $key->product_info->price;
        $productranges = $val;
        for ($i=0; $i < count($productranges); $i+=2) {
            $offset = $productranges[$i] + 1;
            $len = $productranges[$i + 1] - $offset;
            $price[] = $dcprice(array_slice($values, $offset, $len));
        }
    } 
    $insertStmt->bind_param('s', $price);
    $insertStmt->execute();
}
echo "New records created successfully";

代码显示创建了新记录,但是当我在 phpMyAdmin 中检查表时,什么也没有出现。

我检查过的链接示例有:How does PHP 'foreach' actually work?foreachxml_parse_into_struct。但是我找不到正确的信息,如果有人能指出我做错了什么,那就太好了。

【问题讨论】:

  • 它告诉您创建了新记录是正常的。在您的代码末尾,您只需回显该短语,而无需任何检查它们是否真正插入的if 子句。
  • 如果 $key != 'product' 则绑定一个未定义的参数 ($price) 并继续执行
  • 哦,$price 数组在每次迭代中都变得越来越大。您应该为每个标签重置 $price
  • 我从未想过使用空的foreach() 来获取数组或可迭代对象中的最后一项。但是,我不认为那是你的意图......

标签: php mysql xml foreach insert


【解决方案1】:

以下内容未经测试,但我认为它应该提供一个想法。创建prepared statement 并将变量绑定到语句,然后在声明变量后循环执行。

$xml=simplexml_load_file("URL") or die("Error: Cannot create object");

$sql = 'INSERT INTO BBB (price) VALUES (?)';
$stmt = $dbconnection->prepare( $sql );
$stmt->bind_param( 's', $price );


foreach ($tags as $key=>$val) {
    if ($key == "product") {
        $dcprice = $key->product_info->price;
        $productranges = $val;

        for($i=0; $i < count($productranges); $i+=2) {
            $offset = $productranges[$i] + 1;
            $len = $productranges[$i + 1] - $offset;

            $price = $dcprice(array_slice($values, $offset, $len));
            $stmt->execute();
        }
    }   
}
echo "New records created successfully";

插入多条记录的基本示例。

$dbhost =   'localhost';
$dbuser =   'root'; 
$dbpwd  =   'xxx'; 
$dbname =   'experiments';

$db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );


$sql='insert into `temp` (`val`) values (?)';
$stmt=$db->prepare( $sql );

if( $stmt ){
    $stmt->bind_param( 's', $i );
    for( $i=0; $i < 100; $i++ )$stmt->execute();

    $stmt->free_result();
    $stmt->close();
}

使用 xml 文件中的实际数据(但不使用 simpleXML

$url='https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510&demo';
$dom=new DOMDocument;
$dom->load( $url );

$xp=new DOMXPath( $dom );



$col=$dom->getElementsByTagName('product_info');
if( !empty( $col ) ){

    $dbhost =   'localhost';
    $dbuser =   'root'; 
    $dbpwd  =   'xxx'; 
    $dbname =   'experiments';

    $db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );

    $sql='insert into `temp` (`brand`,`title`,`price`) values (?,?,?);';
    $stmt=$db->prepare( $sql );

    if( $stmt ){

        $stmt->bind_param( 'sss', $brand, $title, $price );

        foreach( $col as $i => $product ){
            $brand = $xp->query( 'brand', $product )->item( 0 )->nodeValue;
            $price = floatval( $xp->query( 'price', $product )->item( 0 )->nodeValue );
            $title = $xp->query( 'title', $product )->item( 0 )->nodeValue;

            $stmt->execute();
        }
        $stmt->free_result();
        $stmt->close();
    }
    $db=null;
}

这会贯穿 xml 并按预期插入记录 - 我希望这会有所帮助。


读取 XML 并显示结果的示例 - 没有数据库,只是为了展示如何读取记录!

$url='https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510&demo';
$dom=new DOMDocument;
$dom->load( $url );

$xp=new DOMXPath( $dom );

$col=$dom->getElementsByTagName('product_info');
if( !empty( $col ) ){
    foreach( $col as $i => $product ){
        $data=array(
            'brand' =>  $xp->query( 'brand', $product )->item( 0 )->nodeValue,
            'title' =>  $xp->query( 'title', $product )->item( 0 )->nodeValue,
            'price' =>  floatval( $xp->query( 'price', $product )->item( 0 )->nodeValue )
        );
        echo '<ul><li>',implode('</li><li>',$data),'</li></ul>';
    }
}

然后输出:

<ul>
   <li>Dr. Fix</li>
   <li>Dr. Fix Organic Droge Voeten Balsem 75 ml</li>
   <li>11.95</li>
</ul>
<ul>
   <li>Lamberts</li>
   <li>Lamberts Selenium ACE 100 TAB</li>
   <li>19.1</li>
</ul>
<ul>
   <li>Annemarie Borlind</li>
   <li>Annemarie Borlind Lipcontourstift Red 1.05 G</li>
   <li>13.25</li>
</ul>
<ul>
   <li>Wapiti</li>
   <li>Wapiti Darmfunctie 20 dragees</li>
   <li>3.95</li>
</ul>
<ul>
   <li>Davitamon</li>
   <li>Davitamon Compleet Mama 60 capsules</li>
   <li>11.95</li>
</ul>
<ul>
   <li>Vitaminhealth</li>
   <li>Vitaminhealth Multi Vitaminen  30 tabletten</li>
   <li>9.95</li>
</ul>
<ul>
   <li>Vitaminhealth</li>
   <li>Vitaminhealth Multi Vitaminen  120 tabletten</li>
   <li>32.5</li>
</ul>
<ul>
   <li>Vitaminhealth</li>
   <li>Vitaminhealth Multi Vitaminen  240 tabletten</li>
   <li>58.95</li>
</ul>
<ul>
   <li>Vitaminhealth</li>
   <li>Vitaminhealth Botformule 60 tabletten</li>
   <li>12.95</li>
</ul>
<ul>
   <li>Vitaminhealth</li>
   <li>Vitaminhealth Betacaroteen 60 softgels</li>
   <li>16.95</li>
</ul>
<ul>
   <li>Brita</li>
   <li>Brita Optimax Cool Wit Waterfilterkan 1 exemplaar</li>
   <li>49.95</li>
</ul>
<ul>
   <li>Essential Organics</li>
   <li>Essential Organics Cal Mag &amp; Zink  90 tabletten</li>
   <li>11.5</li>
</ul>
<ul>
   <li>Vitotaal</li>
   <li>Vitotaal Canadese Geelwortel 45 vegicaps</li>
   <li>9.95</li>
</ul>
<ul>
   <li>Annemarie Borlind</li>
   <li>Annemarie Borlind Combination Skin Dagfluid  75 ml</li>
   <li>27.95</li>
</ul>
<ul>
   <li>Vitotaal</li>
   <li>Vitotaal Cranberry + C 45 vegicaps</li>
   <li>9.95</li>
</ul>
<ul>
   <li>Vital Cell Life</li>
   <li>Vital Cell Life Vitamine B6/B12 foliumzuur 60 cap</li>
   <li>12</li>
</ul>
<ul>
   <li>Brita</li>
   <li>Brita Marella XL Wit Waterfilterkan (3,5 liter) 1 exemplaar</li>
   <li>21.5</li>
</ul>
<ul>
   <li>Plantina</li>
   <li>Plantina Astaxanthin-eco 60 capsules</li>
   <li>33.1</li>
</ul>
<ul>
   <li>Terrasana</li>
   <li>Terrasana Umeboshi 150 G</li>
   <li>7.49</li>
</ul>
<ul>
   <li>Solgar Vitamins</li>
   <li>Solgar Vitamins Digestive Enzymes 250 tabletten</li>
   <li>39.9</li>
</ul>

【讨论】:

  • 您好 RamRaider,感谢您的回复。我已经通过复制您的代码、更改 URL 然后执行来尝试 PHP,但它再次没有插入任何数据。我真的不明白出了什么问题。这是数据示例 XML 的链接:link
  • 嗨 RamRaider,再次感谢。新代码为一种产品插入数据,但不会遍历整个 XML。我以前的代码也发生了这种情况。它只为一种产品插入数据。这是否与产品具有 update_info 和 product_info 部分的事实有关?
  • 我一直在尝试您的代码@RamRaider,但它一直只插入一种产品。我不明白为什么它没有插入所有 XML 产品...我还询问了我的虚拟主机是否对数据库有任何限制,例如只能插入一行。你认为这可能与它有关吗?
  • 是否有可能 $col 位于“product_info”上,而每个 存在于两个元素中:?所以循环只通过这个。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多