PHP为每个结果循环INSERT MySQL

时间:2017-10-30 08:38:14

标签: php mysql loops foreach

我已经使用简单的HTML dom废弃了一个csv的所有网址。

输出如下:

CoolerMaster Devastator II Azul
Coolbox DeepTeam - Combo teclado, ratón y alfombrilla
Asus Claymore RED - Teclado gaming
INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')

Items added to the database!

INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')

Items added to the database!

INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')

Items added to the database!

正如您所看到的,废料是3种不同的产品,但是当我尝试插入MySQL数据库时,它只保存了最后一个产品,但是只有三次。

在这里你可以看到我的PHP代码:

    <?php

    require 'libs/simple_html_dom/simple_html_dom.php';
set_time_limit(0);


    function scrapUrl($url) 
    {

        $html = new simple_html_dom();


        $html->load_file($url);

        global $name;

        $names = $html->find('h1');

        foreach ($names as $name) {
           echo $name->innertext;
           echo '<br>';


    }

    $rutaCSV = 'csv/urls1.csv'; // Ruta del csv.

    $csv = array_map('str_getcsv', file($rutaCSV));

    foreach ($csv as $linea) {

        $url = $linea[0];
        scrapUrl($url);

    }


$servername = "localhost";
$username = "";
$password = "";
$dbname = "";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 


foreach ($csv as $linea) {

$url = $linea[0];


 $sql = "INSERT INTO productos (nombre) VALUES('$name->plaintext')";
 print ("<p> $sql </p>");    
 if ($conn->query($sql) === TRUE) {
    echo "Items added to the database!";
 } else {
    echo "Error: " . $sql . "<br>" . $conn->error;
 }
}

$conn->close();



?>

所以,我需要的是MySQL查询添加:

INSERT INTO productos (nombre) VALUES('CoolerMaster Devastator II Azul')

Items added to the database!

INSERT INTO productos (nombre) VALUES('Coolbox DeepTeam - Combo teclado, ratón y alfombrilla')

Items added to the database!

INSERT INTO productos (nombre) VALUES('Asus Claymore RED - Teclado gaming')

Items added to the database!

任何帮助都非常感谢!

谢谢你,以及最好的问候

3 个答案:

答案 0 :(得分:0)

以下是您的代码,只是格式化:(请检查一下,您有}}

function scrapUrl($url) 
{
    $html = new simple_html_dom();
    $html->load_file($url);
    global $name;  // -- using global is crap - I would avoid that.  Pass the object in as an argument of the function eg.  scrapUrl($url, $name) 
    $names = $html->find('h1');
    foreach ($names as $name) {
         // -- your re-assigning $name overwriting you global on each iteration of this loop 
        // -- What is the purpose of this? it does nothing but output?
        echo $name->innertext;
        echo '<br>';
    }
// -- missing }  where is this function closed at?

    $rutaCSV = 'csv/urls1.csv'; // Ruta del csv.
    $csv = array_map('str_getcsv', file($rutaCSV));

    foreach ($csv as $linea) {
        // -- this can be combined with the one with the query
        // -- just put the function call in that one and delete this one
        $url = $linea[0];
        scrapUrl($url); //recursive? depends where you function is closed
        // -- whats the purpose of this function, it returns nothing?
    }

    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    foreach ($csv as $linea) {
        $url = $linea[0]; // -- whats this url used for?
        $sql = "INSERT INTO productos (nombre) VALUES('$name->plaintext')";
         // -- query is vulnerable to SQL injection? prepared statement
         // -- whats $name->plaintext? where is it assigned at?
        print ("<p> $sql </p>");    
        if ($conn->query($sql) === TRUE) {
            echo "Items added to the database!";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
       // -- when you loop over the CSV but insert $name->plaintext multiple times
       // -- where is that property changed inside this loop, how is it correlated to the csv data
    }

    $conn->close();

首先,你错过了一个结束}取决于你应该做什么,取决于你还有什么不对。

CSV的其中一个循环可以被删除(也许),无论如何我把大量的笔记放在这样的评论中// --

您的主要问题或插入的原因与这些行相同

foreach ($csv as $linea) {
    $url = $linea[0]; // -- whats this url used for?
    $sql = "INSERT INTO productos (nombre) VALUES('$name->plaintext')";
    // -- $name->plaintext does not change per iteration of the loop
    // -- you are just repeatedly inserting that data
   ...

请参阅插入$name->plaintext的值,但这与$csv变量没有关联,并且您没有修改它。它保持不变并不奇怪。

好的,现在我选择了你的代码(没有个人的)。让我们看看我们是否可以简化它。

更新鉴于上述代码,这是我能做的最好的事情。我只是结合它,修复了一些逻辑错误,修剪了它并简化了它。初学者常常错误地将任务过度复杂化。 (但是我没办法测试这个)

<?php
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$rutaCSV = 'csv/urls1.csv'; // Ruta del csv.
$csv = array_map('str_getcsv', file($rutaCSV));

//prepare query outside of the loops
$stmt = $conn->prepare("INSERT INTO productos (nombre)VALUES(?)");

foreach ($csv as $linea) {

    //iterate over each csv line
    $html = new simple_html_dom();

    //load url $linea[0]
    $html->load_file($linea[0]); 

    //find names in the document, and return them
    foreach( $html->find('h1') as $name ){
        //iterate over each name and bind elements text to the query
        $stmt->bind_param('s', $name->plaintext);

        if ($stmt->execute()){
            echo "Items added to the database!";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
    }
}

我进一步简化了它,因为拥有函数scrapUrl()并没有多大意义。我们没有重复使用该代码,因此它添加了一个函数调用,并通过拥有它来使代码更难阅读。

即使它不能正常工作,我也鼓励你将原始代码与我所拥有的代码进行比较。并且在你的脑海中逐步完成它,这样你就可以了解我如何删除了一些冗余等。

供参考

希望有所帮助,欢呼!

答案 1 :(得分:0)

您的代码中存在许多问题。

  1. 首先,你有一个函数scrapUrl,它以$ url作为参数,但不输出任何内容。它设置了全局$ name变量,但是,虽然它找到了几个名称,但它只将最后一个放在$ name变量中,因为它遍历了一系列$ name,put它将文本写入$ name,然后转到下一个,因此,只有最后一项存储在$ name变量中。
  2. 我建议您更改您的scrapUrl函数,以便将报废产品的名称存储到数组中,然后返回该数组。

    1. 其次,我无法理解你如何将数据放入csv文件中,你所拥有的代码看起来不应该正常工作。您确定,您正在csv文件中写入正确的数据吗?也许在这里你只是从文件中读取数据 - 在这种情况下,我很抱歉。

    2. 第三种:您正在从csv中读取数据,并且在循环中逐行移动,但数据无处可去。在我看来,你应该在你的SQL查询中使用$ linea [0],但是你将$ name-&gt; plaintext放在哪里,当你的scrapUrl中只设置$ name时,就像我上面提到的那样。 / p>

    3. 我建议您在SQL查询中使用正确的变量将数据传递给它。

      此外,最好使用PDO和预处理语句,而不是在字符串文字SQL查询中插入原始数据。

答案 2 :(得分:0)

好吧,经过一段时间的思考,我已经设法让它发挥作用。

我留下代码以防其他人可以使用它。

    <?php


    require 'libs/simple_html_dom/simple_html_dom.php';
set_time_limit(0);


    function scrapUrl($url) 
    {

        $html = new simple_html_dom();

        $html->load_file($url);

        global $name;
        global $price;
        global $manufacturer;


        $result = array();
        foreach($html->find('h1') as $name){
        $result[] = $name->plaintext;
            echo $name->plaintext;
            echo '<br>';
        }
        foreach($html->find('h2') as $manufacturer){
        $result[] = $manufacturer->plaintext;
            echo $manufacturer->plaintext;
            echo '<br>';
        }
        foreach($html->find('.our_price_display') as $price){
        $result[] = $price->plaintext;
            echo $price->plaintext;
            echo '<br>';
        }

        $servername = "localhost";
$username = "";
$password = "";
$dbname = "";

        // Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

        $price_go=str_replace(",",".",str_replace(" €","",$price->plaintext));


$sql = "INSERT INTO productos (nombre, nombreFabricante, precio) VALUES('$name->plaintext', '$manufacturer->plaintext', $price_go)";


print ("<p> $sql </p>");

if ($conn->query($sql) === TRUE) {
    echo "Producto añadido al comparador!";
    echo '<br>';
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
        //echo $url;

    }

    $rutaCSV = 'csv/urls1.csv'; // Ruta del csv.

    $csv = array_map('str_getcsv', file($rutaCSV));

    //print_r($csv); // Verás que es un array donde cada elemento es array con una de las url.





foreach ($csv as $linea) {
    $url = $linea[0];
    scrapUrl($url);
}


    ?>

我很确定我的代码中有一些垃圾,但它确实有用。

我希望对某人有所帮助。

关心并感谢所有帮助。