2017-01-19 5 views
0

Я застрял на этом какое-то время, и все поиски, которые я сделал для этой темы, не принесли мне решение. Этот код вставляет значение первого продукта XML в таблицу MySQL.PHP foreach не вставляет

$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?, foreach, xml_parse_into_struct. Но я не могу найти нужную информацию, было бы здорово, если бы кто-то мог указать, что я делаю неправильно.

+0

Его нормально, что он говорит вам, что новые записи создаются. В конце вашего кода вы просто повторяете эту фразу без какого-либо предложения if, которое проверяет, действительно ли они были вставлены. – Twinfriends

+0

if $ key! = 'Product', тогда он связывает неопределенный параметр ($ price) и выполняет в любом случае – Cashbee

+0

oh, а массив $ price становится все больше на каждой итерации. вы должны сбросить $ price за каждый тег – Cashbee

ответ

0

следующее не проверено, но я думаю, что он должен дать представление. Создайте 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> 
+0

Hi RamRaider, спасибо за ответ. Я попробовал PHP, скопировав свой код, изменив URL-адрес и выполнив его, но опять же не вставлял никаких данных. Я действительно не понимаю, что происходит не так. Это ссылка на пример XML для данных: [link] (https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510&demo) – Hn3M

+0

Привет, RamRaider, еще раз спасибо. Новый код вставляет данные для одного продукта, но не проходит через весь XML. Также с моим предыдущим кодом это произошло. Он вставил данные только для одного продукта. Связано ли это с тем фактом, что в продукте есть раздел update_info и product_info? – Hn3M

+0

Я пробовал ваш код @RamRaider, но он постоянно должен вставлять только один продукт. Я не понимаю, почему он не вставляет все продукты XML ... Я спросил мой веб-хостинг также, если есть какие-либо ограничения в базе данных, что можно только вставить одну строку, например. Считаете ли вы, что это может иметь какое-то отношение к этому? – Hn3M

Смежные вопросы