PHP 循环 INSERT MySQL 获取每个结果

标签 php mysql loops web-scraping foreach

我已经有一个脚本,可以使用简单的 HTML dom 抓取一个 csv 的所有 url。

输出如下:

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 数据库时,它只保存最后一个产品 --- 但保存了 3 次。

在这里你可以看到我的 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!

最佳答案

您的代码中有很多问题。

  1. 首先,您有函数 scrapUrl,它接受 $url 作为参数,但不输出任何内容。它正在设置全局 $name 变量,但是,尽管它找到了多个名称,但它只将最后一个名称放入 $name 变量中,因为它正在遍历一系列 $names,将其文本放入 $name 中,然后查找下一个,因此,只有最后一项存储到您的 $name 变量中。

我建议您更改 scrapUrl 函数,以便它将抓取产品的名称存储到数组中,并返回该数组。

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

  • 第三种:您正在从 csv 读取数据,并且在循环中逐行移动时,但数据无处可去。在我看来,您应该将 $linea[0] 放入 SQL 查询中,但是当 $name 在 scrapUrl 中仅设置一次时,您将 $name->plaintext 放入其中,正如我上面提到的。

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

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

    关于PHP 循环 INSERT MySQL 获取每个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47010924/

    相关文章:

    php - POST 表单不适用于 PHP,与 Postman 一起使用

    php - 包含通配符参数时,Laravel 原始表达式不起作用

    java - 在 Mule 3.4 中模拟 while 循环

    c - 一次从数组读取两个字节?

    php - 拉拉维尔。在where中使用表名

    php - 如何在 PHP 中使用类型检查来执行 >=

    多次连接同一个表的 MySQL 替代方案

    mysql - 不希望分区键成为唯一键的一部分。任何解决方法?

    c++ - 我的循环寻找素数的问题

    php - 在模块中查找 Prestashop 商店可用的语言