PHPはマルチスレッドではないことを除けばばかげたことがあります。正直なことはおそらく唯一の良いことです今すぐ。タブ区切りのテキストファイル(PHP経由)の内容でMySQLテーブルを更新する
最近私の会社は新しいデータベースに変更されました。以前のデータベースでは、実際には動作しなかった非常に古いPythonプログラムを使用して、mysqlレコードを更新していました(データベースPLUS mysqlがある理由を尋ねません)。今度は新しいデータベースが実装されたので、私はPythonを完全に廃止する機会を得ました。新しいデータベースの情報をPHPで翻訳することに決めました。
私たちが使っている方法では、この新しいデータベースの量や価格などをエクスポートして、Excelで区切ってファイルをタブ区切りのテキストファイルとして保存しています。これらのファイルをフォルダにポップし、.batファイルを実行します。このファイルは3つのファイルを読み込み、配列にすべてを格納し、これらの配列の内容をMySQLプリペアドステートメントに変換し、この情報をMySQLの1つに入れます項目を一度に表示します。すべてで約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
私は、キャストのそのタイプを経由していくつかのものを選択してみました、そして、すべての権利を動作するように見えた:
私は最初のものは、キャストを見て、私は次のことを試してみたましたそれはしませんでした。私が見ている1つの特定の例のフィールドは、2,032で満たされるべきです。テキストファイルでは、 "2,032"が引用符で囲まれています。したがって、フィールドはMySQLで0で埋められます。
上記のような3つのインスタンスがあります。 Excelのフィールドを浮動小数点に変換しようとすると、非常に単純化されたアプローチを試みました...しかし、それは動作するようには見えませんでした。全く同じように。
です。助言?何か不足していますか?私はキャストを間違って入力しましたか?私は間違った木を吠えますか?そして、はい、私はこれが1つの巨大なインサートであることを認識します挿入されているテーブルは一時テーブルのように動作しますが、削除されることはありません。
編集:テーブルに配置しようとしているデータの例。これは私がを引用している唯一のフィールドです( "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:私は彼らが私は彼らがに取得したいテーブルにそれを作るだろうかどうかを確認する試みでVARCHARにFLOATフィールドを変更しました。そうすることで、引用がファイルの中に始まっていなくても、実際にフィールドには引用符が含まれていることがわかりました。だから、これらのフィールドのいくつかは、そこにはなかった値を追加しているようです。私は抽出を作成しようとしているし、これも同様に解決する可能性があります。
"database PLUS mysql"? mysqlはデータベースです... –
と注:http://php.net/manual/en/pdostatement.bindparam.php引数#3 - '$ data_type'。 –
@MarcB、はい、私はそれを知っています。言い換えれば奇妙ですが、私たちは最終的にはMySQLをデータベースとして扱いません。理由は問いませんが、私は二次データベースを完全に削除しようとしていますが、最終的な決定はMySQLだけに依存しないということでした。だから、彼らは基本的に、それを一種のように扱います... Idk、notekeeper。最終的には、2つのデータベースがあります。 1つはSQL Serverから実行され、もう1つはMySQLから実行されます。それは基本的に地球上の地獄です。 – Kitfoxpup