【问题标题】:Insert lines from a TXT file into a SQL Database using PHP使用 PHP 将 TXT 文件中的行插入 SQL 数据库
【发布时间】:2015-10-05 14:37:17
【问题描述】:

我有一个包含来自设备的数据的文件,我需要将此数据插入数据库。文本文件如下所示:

10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6
10/01/15-20:38:26 = 67.3,18.4,30.6,39.3,70.0,66.6
10/01/15-20:39:21 = 74.5,16.8,28.2,36.0,70.0,66.6
10/01/15-20:40:16 = 76.8,16.6,27.6,35.2,70.0,66.6
10/01/15-20:41:12 = 78.1,16.4,27.3,34.9,70.0,66.6

我的代码目前看起来像这样:

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


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

<?PHP

    $file_handle = fopen("datalog.txt", "r");

    while (!feof($file_handle) ) {

    $line_of_text = fgets($file_handle);
    $parts = explode('  ', $line_of_text);

    print $parts[0] . $parts[1]. "<BR>";

}

$datainsert = "INSERT INTO reading (val1, val2, val3, val4, val5, val6, val7, val8, val9, val10) VALUES ($parts[0])"; 

if (mysqli_query($conn, $datainsert)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $datainsert . "<br>" . mysqli_error($conn);
}


?>

<?php
$conn->close();
?>

我得到的错误是这样的:

错误:

INSERT INTO 读数(Box_ID、Time_Stamp、温度、湿度、CO_Level、VOC_Reading_UOM、VOC_Reading_V1、VOC_Reading_V2、VOC_Reading_V3、VOC_Reading_V4)VALUES () 列计数与第 1 行的值计数不匹配

我的数据库和站点确实连接没有错误,并且此页面是唯一有问题的页面。出了什么问题?

【问题讨论】:

  • 通过查看该错误消息,您没有在 SQL 的 VALUES 部分添加任何内容。检查$parts[0] 是否包含您认为它包含的内容。
  • 错误信息表明您没有在VALUES () 中传递任何数据,因此查询当然会失败
  • 我将 $parts [0] 放在值区域中,因为我认为这是代码从中提取信息的地方。如果您稍早看一下我的代码,您会看到 $parts = explode 然后它会将值拉出并将它们分开。所以我没有正确访问这些信息就是你的意思?
  • @graphicdesigner88 - 是的。如果失败,您将打印出您的 SQL 语句,并且那里的VALUES() 部分显示$parts[0] 中没有任何内容;或者至少,不是你所期望的。尝试在循环之后添加 var_dump($parts) 以查看其中的内容。
  • array(1) { [0]=> string(0) "" } 是我添加 var_dump ($parts) 后出现的内容

标签: php mysql sql-server database database-connection


【解决方案1】:

你似乎被一个包含两个空格的字符串爆炸了。但是,在您的文本文件中,您的“字段”由一个空格分隔。您应该将呼叫更改为 explode() 以使用单个空格(或者看中preg_split())。

【讨论】:

  • 顺便说一句,据我所知,您仍然需要做一些比您目前正在做的更有趣的事情,因为您的数据库列与您的文本文件的数据并不真正匹配。您真的不应该有名为val1、val2 等的列,因为这样就无法说出它们的实际含义。
  • 我在分解中有一个标签来分隔数据。我这样做是为了确保我的数据能够很好地分离,并且效果很好。我还没有听说过那个 preg_split 命令,我来看看它。我一周前才开始学习如何做到这一点,所以新信息总是好的
  • 这些值确实有不同的名称,但由于我参与的项目,我更改了它们。我把整个项目都丢给了我,我争先恐后地追赶并尝试让这个数据库阅读这个文件,这样我们就可以做一个测试服务器。没有人明白,作为一名平面设计师,我的代码知识有限。我可以设计东西并使它们看起来很棒,但我不能总是让它们正常工作。我希望有更多精通代码的人来做这件事,但我被告知不可以,而且我的预算变得如此便宜,以至于我不得不做比平常更多的事情。
  • 你肯定会到达那里。如果您需要一对一的帮助,请随时通过 gmail dot com 的 bobbyjack 给我发邮件。
【解决方案2】:

在我看来,您正在尝试使用空格作为分隔符 explode() 您的行字符串。但根据您的问题,这不是它的组合方式。

这是一个线串,用数字表示它是如何用空格分解的。

 10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6
 00000000000000000 1 22222222222222222222222222222

也许您想要两个explode() 调用的序列:

    $a = explode (' = ', $line_of_text);
    $vals = explode(',' $a[1]);

这样会破坏你的生产线

 10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6
 00000000000000000   11111111111111111111111111111
                     0000 1111 2222 3333 4444 5555

在这两个explode() 调用结束时,您将有一个 $vals 数组,其中包含您的六个数字。然后你可以像这样插入。

INSERT INTO reading
       (tstamp, val1, val2, val3, val4, val5, val6)
VALUES (STR_TO_DATE('%m/%d/%y %H:%i:%s',?), ?,?,?,?,?,?)

您可以将$a[0](观察行的时间戳)绑定到第一个? 占位符,并将$vals 的六个元素绑定到其余占位符。

编辑好的,我们来谈谈占位符。他们选择bind_param() in MySQLi。仔细阅读。认真的。

您的代码可能如下所示:

$linecount = 0; 

$file_handle = fopen("datalog.txt", "r");
while (!feof($file_handle) ) {
    $line_of_text = fgets($file_handle);
    $a = explode (' = ', $line_of_text);
    $vals = explode(',' $a[1]);

    if ($linecount == 0) {
        /* rig up your SQL statement, just once */
        $sql = "INSERT INTO reading (tstamp, val1, val2, val3, val4, val5, val6) VALUES (STR_TO_DATE('%m/%d/%y %H:%i:%s',?), ?,?,?,?,?,?)";
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param('dssssss', $a[0], $vals[0],$vals[1],$vals[2],$vals[3],$vals[4],$vals[5]);
    }
    if (!$stmt->execute()) {
         printf("Error: %s.\n", $stmt->error);
    }
    $linecount++;
}

$stmt->close();

请注意:我没有机会调试这段代码;如果您使用它,就交给您了。

【讨论】:

  • 哇!好吧,这看起来很有趣。我理解这两个爆炸,这是有道理的。爆炸后,我对在我的 VALUES 区域显示数字感到困惑。 STR_TO_DATE 有点道理,但问号让我很困惑。我很抱歉握着手,我对此非常陌生。非常感谢大家的帮助
  • 感谢您让我知道在哪里运行。我也会玩这个。我感谢代码 sn-p,感谢您提供的帮助。我一定会调查绑定参数。我可能对这个过程还有几个问题,但这会有所帮助
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多