【发布时间】: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。所以我还是卡住了。除了我的价格字段之外的所有内容都将准确更新。