【问题标题】:Updating MySQL Table via contents of tab delimited text file (Through PHP)通过制表符分隔的文本文件的内容更新 MySQL 表(通过 PHP)
【发布时间】:2016-08-04 21:59:43
【问题描述】:

所以我在这方面遇到了很多可笑的困难,除了 PHP 不是多线程的,老实说,这可能是目前唯一的好事。

最近我的公司换了一个新的数据库。使用我们的旧数据库,我们通过使用一个非常旧的 Python 程序来更新我们的 mysql 记录(不要问为什么我们有一个数据库 PLUS mysql),该程序确实不起作用。现在,随着新数据库的实施,我有机会完全摆脱 Python,我决定使用 PHP 来翻译我们新数据库中的信息。

也就是说,我们使用的方法是将数量、价格等内容从这个新数据库导出到 Excel,然后将文件另存为制表符分隔的文本文件。我将这些文件弹出到一个文件夹并运行一个 .bat 文件,该文件调用我的 php 程序,该程序读取这三个文件,将所有内容存储在数组中,将这些数组的内容转换为 MySQL 准备语句,然后将这些信息放入 MySQL one一个项目。总共大约需要 10 分钟,这实际上很好 - 以前的 python 脚本需要 6 个小时以上。

到目前为止,我并不太担心速度。在这个脚本中对我进行了很多测试,并且可以稍后对其进行改进。导致我出现问题的部分(即 TLDR)是某些字段没有更新,我花了 AGES 时间才弄清楚原因。

我有几个价格字段设置为浮动字段。原因是这些字段的内容将被发送到另一个表的内容,这是浮动的,我无法更改该表的类型。该表基本上是“不要触摸或更改任何内容,因为它是圣经表”。所有其他表都是为容纳该表而构建的。发送到文本文件的价格、数量以及基本上任何数字字段都被保存为字符串,而不是浮点数或整数。

我做的第一件事是查找演员表,我尝试了以下方法:

$stmt = $dbh->prepare("INSERT INTO table1(modelNumber, itemName, UPC, OnHand, IsCommitted, OnOrder, quantity, mfgr_num, unitOfMeasure, modelDescription, weight, frozenFor, discontinued, dropship) VALUES (?, ?, ?, CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), CAST(? AS DECIMAL(10, 0)), ?, ?, ?, ?, ?, ?, ?);");

    $stmt->bindParam(1, $mod);
    $stmt->bindParam(2, $item);
    $stmt->bindParam(3, $u);

    $stmt->bindParam(4, $onh);
    $stmt->bindParam(5, $isCommitted);
    $stmt->bindParam(6, $order);

    $stmt->bindParam(7, $in);
    $stmt->bindParam(8, $mfgr);
    $stmt->bindParam(9, $measure);
    $stmt->bindParam(10, $deets);
    $stmt->bindParam(11, $w);
    $stmt->bindParam(12, $fro);
    $stmt->bindParam(13, $dis);
    $stmt->bindParam(14, $dr);

    $onh = $inStock2[$i];           // 1
    $isCommitted = $committed[$i];  // 2
    $order = $ordered[$i];          // 3
    $mod = $modelNumber02[$i];      // 4
    $item = $itemName[$i];          // 5
    $u = $upc[$i];                  // 6
    $in = $onh - $isCommitted;      // 7
    $mfgr = $mfgr_num[$i];          // 8
    $measure = $uom[$i];            // 9
    $deets = $itemDeets[$i];        // 10
    $w = $weight[$i];               // 11
    $fro = $frozenFor[$i];          // 12
    $dis = $disc[$i];               // 13
    $dr = $drop[$i];                // 14

我尝试通过这种类型的演员表选择一些东西,它似乎工作得很好......但它没有。我正在查看的一个特定示例字段应填充 2,032。在文本文件中,它显示为“2,032”,并带有引号。因此,该字段在 MySQL 中填充为 0。

还有其他三个实例与上面的实例相似。我尝试了一种非常简单的方法,尝试将 Excel 中的字段转换为浮点数……但这似乎不起作用。完全一样。

所以。建议?我错过了什么吗?我只是输入了错误的演员吗?我在吠叫错误的树吗?是的,我意识到这是一个巨大的插入。它被插入的表就像一个临时表,尽管它从未被删除。

编辑:尝试将数据放入表中的示例。这个 ("2032.00") 是我见过的唯一有引号的字段。它下面的字段也没有更新。

841 1333    0.00    0.00    0.00
842 1334    0.00    0.00    0.00
843 1338    0.00    0.00    0.00
844 1339    0.00    0.00    0.00
845 1340    0.00    0.00    0.00
846 1341    0.00    0.00    0.00
847 1344    "2,032.00"  7.00    0.00
848 1345    95.00   0.00    300.00
849 1345EA  60.00   0.00    0.00
850 1346    733.00  41.00   200.00
851 1346EA  67.00   0.00    0.00
852 1348    7.00    0.00    400.00
853 1348EA  21.00   0.00    0.00
854 1349    348.00  1.00    400.00
855 1350    91.00   1.00    300.00
856 1350EA  60.00   0.00    0.00
857 1351    0.00    0.00    1.00
858 1354    10.00   0.00    0.00
859 1357    4.00    12.00   6.00
860 1358    0.00    2.00    1.00
861 1360    0.00    0.00    0.00
862 1361    0.00    0.00    0.00
863 1362    0.00    0.00    0.00
864 1363    0.00    0.00    0.00
865 1364    0.00    0.00    24.00
866 1365    3.00    0.00    24.00
867 1366    0.00    2.00    1.00

编辑 2.0:我将 FLOAT 字段更改为 VARCHAR,以尝试查看它们是否会出现在我希望它们到达的表中。这样做时,我意识到该字段实际上包括带有数字的引号,即使引号不在文件中开头。因此,这些字段中的一些似乎可能已经为它们添加了原本不存在的值。我将尝试创建一个提取,这也可以解决这个问题。

【问题讨论】:

  • "数据库 PLUS mysql"? mysql是数据库...
  • 并注意:php.net/manual/en/pdostatement.bindparam.php 参数 #3 - $data_type
  • @MarcB,是的,我知道。措辞很奇怪,但我们最终不会将 MySQL 视为这里的数据库——不要问为什么,我一直在推动完全删除辅助数据库,但最终决定不只依赖 MySQL。所以他们对待它,基本上,就像它是一种...... Idk,记事员。最终,我们有两个数据库。一个运行 SQL Server,另一个运行 MySQL。这基本上是我的人间地狱。
  • @MarcB 刚刚注意到您的第二条评论,我已经有一段时间没有阅读 bindParam 页面了。这可能正是我正在寻找的东西
  • @MarcB 几乎可以工作。不幸的是,浮点/双精度没有 bind_param PDO::PARAM。所以我还是卡住了。除了我的价格字段之外的所有内容都将准确更新。

标签: php mysql casting


【解决方案1】:

我已经弄清楚我的程序出了什么问题,虽然这不是我最初想的那样,那就是我遗漏了一些东西。

因为某些字段包含逗号,所以当我将数据从 Excel 文件转换为制表符分隔的文本文件时,它们被转换为字符串,并在数据上添加了引号。因此,为了保留逗号,将看起来像 2,323 的值转换为“2,323”。

由于 MySQL 中表的字段是 FLOAT 字段,并且它们无法读取逗号,因此我使用以下方法来修复值:

else if($i == 2 || ($i - 2) % $len3 == 0) {
    $stk = str_replace('"', '', $docContents3[$i]);
    $stk = str_replace(',', '', $stk);
    array_push($inStock2, $stk);

我删除了逗号和引号,这解决了我的字段没有正确更新的问题,即使我删除了引号,逗号也会导致 MySQL 自动截断信息。所以 2,323 变成了 2。这显然是非常错误的。

感谢那些试图帮助我并因我缺乏完整信息而遭受痛苦的人——有一些关于我还没有看到的主题的建议,我现在知道我实际上可以用文件的内容填写一张表格,我将来可能会使用它来使这个过程更顺畅。

换句话说...标点符号。字面上的标点符号。

【讨论】:

  • 一定要喜欢一个自我回答的解决方案和一个很好的启动解释;-)
  • @Fred-ii- 谢谢^_^ 我觉得有点傻。我一直很确定这是我使用的方法中的某些东西,结果证明是标点符号。如果我早点看到实际问题,我就不会来这里>.>
  • 不客气。您不会相信我们在 Stack 上看到的糟糕和/或错误地提出/形成的问题,这太可悲了。另外,您的语法、拼写... brava!! 您可能期待“bravo”,对吧?嘿,在意大利语中,“bravo”代表“男人”,而“brava”是女性版本,(同样)表示某人做得很好。 干杯,继续努力。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 2012-08-08
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2022-10-08
  • 1970-01-01
相关资源
最近更新 更多