2016-08-04 6 views
1

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フィールドを変更しました。そうすることで、引用がファイルの中に始まっていなくても、実際にフィールドには引用符が含まれていることがわかりました。だから、これらのフィールドのいくつかは、そこにはなかった値を追加しているようです。私は抽出を作成しようとしているし、これも同様に解決する可能性があります。

+0

"database PLUS mysql"? mysqlはデータベースです... –

+1

と注:http://php.net/manual/en/pdostatement.bindparam.php引数#3 - '$ data_type'。 –

+0

@MarcB、はい、私はそれを知っています。言い換えれば奇妙ですが、私たちは最終的にはMySQLをデータベースとして扱いません。理由は問いませんが、私は二次データベースを完全に削除しようとしていますが、最終的な決定はMySQLだけに依存しないということでした。だから、彼らは基本的に、それを一種のように扱います... Idk、notekeeper。最終的には、2つのデータベースがあります。 1つはSQL Serverから実行され、もう1つはMySQLから実行されます。それは基本的に地球上の地獄です。 – Kitfoxpup

答えて

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になった。

完全な情報が不足しているために私を助けようとした人に感謝します。まだ見たことのないトピックの提案がありました。実際にはこのプロセスをよりスムーズにするために私が将来使用する可能性があるファイルです。

他の言葉では...句読点。文字通り句読点。

+0

自信を持って解決して良い解説が好きなのです;-) –

+0

@ Fred-ii-ありがとう^ _ ^私はちょっとばかばかしいと感じました。私は使用していた方法で何かであると確信していたし、句読点になっていた。 > – Kitfoxpup

+0

本当に大歓迎です。私たちがスタック上で見ている悪い、あるいは間違って尋ねられた/形成された質問は信じられません。プラス、あなたの文法、スペルは... * brava !! *あなたはおそらく "bravo"を期待していました、ここは正しいのですか? Hehはイタリア語で "bravo"は "男性"を意味し、 "brava"は女性版であり、誰かがうまくいったことを意味します(同じように)。 *乾杯、良い仕事を続けてください。 –

関連する問題