所以我在这方面遇到了相当多的困难,除了PHP不是多线程的这一事实,老实说,这可能是目前唯一的好事。
最近我的公司换了一个新的数据库。在旧数据库中,我们通过使用一个非常旧的Python程序来更新mysql记录(不要问为什么我们有一个数据库加上mysql),这个程序实际上不起作用。现在,随着新数据库的实现,我有机会完全摆脱Python,我决定使用PHP从新数据库中翻译信息。
也就是说,我们使用的方法是从这个新数据库中将数量、价格等数据导出到excel,然后将文件保存为一个制表符分隔的文本文件。我将这些文件弹出到一个文件夹并运行一个.bat文件,该文件调用我的php程序,该程序读取这三个文件,将所有内容存储在数组中,将这些数组的内容转换为MySQL准备的语句,然后将这些信息一次一条地放入MySQL中。总共大约需要10分钟,这实际上很好——python脚本通常需要6个小时以上。
从现在起,我不太担心速度。在这个脚本中对我进行了很多测试,以后可以对它进行改进。引起我问题的部分(即TLDR)是一些字段没有更新,我花了很长时间才弄清楚原因。
我有几个价格字段设置为浮动字段。原因是因为这些字段的内容将被发送到另一个表的内容(浮动),而我无法更改该表的类型。那张桌子基本上就是“不要碰或改变任何东西,因为它是圣经的桌子”。所有其他的桌子都是为容纳那个而建的。发送到文本文件中的价格,以及数量,基本上是任何数字字段,都被保存为字符串,而不是浮点数或整数。
我做的第一件事是查找选角,我尝试了以下操作:
$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
我试着通过那种类型的演员来选择一些东西,看起来效果不错。。。但事实并非如此。我正在观看的一个特定示例字段应该填充2032。在文本文件中,它读作“2032”,并加上引号。所以在MySQL中该字段被0填充。
还有三个其他的例子和上面的一样。我尝试了一种非常简单的方法,尝试将Excel中的字段转换为float。。。但这似乎不起作用。完全一样。
所以。建议?我遗漏了什么吗?我只是把演员打错了吗?我找错树了吗?是的,我知道这是一个巨大的插入。插入它的表的行为类似于临时表,尽管它从未被删除。
编辑:试图放入表中的数据的示例。这个(“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,以查看它们是否能进入我希望它们进入的表。这样做的时候,我意识到这个字段实际上包含了带数字的引号,尽管引号不在文件中。因此,似乎这些字段中的一些可能已经向它们添加了原本不存在的值。我将尝试创建一个提取,这也可能解决这个问题。
最佳答案
我已经知道我的程序出了什么问题,尽管这不是我最初的想法,那就是我缺少了一些东西。
因为有些字段包含逗号,所以它们被转换成字符串,并且在我将数据从excel文件转换为制表符分隔的文本文件时,将引号逐字添加到数据中。因此,一个看起来像2323的值被转换成“2323”,以便保留逗号。
由于MySQL中表的字段是浮点数字段,并且它们不能读取逗号,所以我使用以下方法修复这些值:
else if($i == 2 || ($i - 2) % $len3 == 0) {
$stk = str_replace('"', '', $docContents3[$i]);
$stk = str_replace(',', '', $stk);
array_push($inStock2, $stk);
我删除了逗号和引号,这解决了字段更新不正确的问题,就好像删除了引号一样,逗号导致MySQL自动截断信息。所以2323变成了2。这显然是非常离谱的。
感谢那些试图帮助我并因我缺乏完整信息而受苦受难的人——有人对我还没有看到的主题提出了建议,我现在知道我实际上可以用一个文件的内容填满一个表格,这是我将来可能用来使这个过程更顺利的东西。
换句话说。。。标点符号。字面上是标点符号。
关于php - 通过制表符分隔的文本文件的内容更新MySQL表(通过PHP),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38778100/