更新 - 以下の追加を参照
OK、すぐに、私は開発者ではありません (おそらくいつか)、ほとんど何も知りません。クラス、関数、メソッド、ラッパー、foos、バー、そして何よりも OOP は、常に愛するSを混乱させます。そうは言っても、私が改善できることがたくさんあると確信しており、あなたの批判と知識を求めています. でも...
私の具体的な質問は次のとおりです。データを受信している WSDL と、PHP + PDO、MySQL の組み合わせとの間の相互作用の重要な条件が欠落しており、プッシュするとすぐにすべてが崩壊しますか?
以下のコードの 3 つのテーブルは、クライアントの Web サービスを介して受信したかなり大きなデータセットを正規化する必要があります。この部分は、他の 6 つのファイルからコードを取得する自動化されたプロセス (cron ジョブ) です。新しいクライアントに対応するためにデータベースにいくつかの変更を加える必要があり、WTH を考え出しました。PDO をもう一度試してみましょう。今のところ、コードが正しく動作している可能性があると思われるコードにほとんど混乱しているようには感じていません (はい、今日何度もテストしましたが、複数のインポートが問題なく実行されました)。明日のいつか最新のアップデートをプッシュする準備をしていますが、正直なところ、何か大きなことを見逃していて、今週町を離れている間に大量の破損したデータが発生するのではないかと少し心配しています. 重要ではないように思われる場合は申し訳ありませんが、私はこれらのようなサイトに多くの時間を費やしてきましたが、ほとんど知りません。
ここで何か間違ったことをしたのでしょうか、それとも PDO が優れているのはまさにこのためですか? いいえの場合、これをもっと雄弁に行うことができますか? ON DUPLICATE KEY UPDATE
仕事を続けられないような状況を見逃しているのでしょうか...?
参考までに: 最後のテーブルには、自動採番のプライマリを除いて一意のデータがありません。以前の挿入からの外部を含む 3 つのフィールドから作成された複合一意キーがあります。ビジネス ルールでは、この種の推論が可能です。3 つすべてが関連しており、table1 はそれらの最終的な親であり、2 はその次などです...
<pre><code><?php
// connect to db Mysqli style
require_once 'MysqliCurrentLoginQuery.file'; //get the variables not supplied below
/*~~~~~~~~~~~~~~~~SET YOUR VARIABLES HERE~~~~~~~~~~~~~~~~~*/
/*A bunch of soap variables to be passed to MySOAPReq.file*/
/*~~~~~~~~~~~~~~~~SET YOUR VARIABLES HERE~~~~~~~~~~~~~~~~~*/
require_once 'MySOAPRequest.file'; //This is where $soapresult is passed from
//convert array to ph objects for use in prepared stmt
$xmlResponse = new SimpleXMLElement($soapresult);
foreach ($xmlResponse->xmlWorkOrders->workOrder as $order) {
try {
require 'MyPDOdbConfigAndConnection.file'; //where $conn is passed from
$conn->beginTransaction();
try {
$query1 = "INSERT INTO table(`id`,`b`,`c`,`d`)
VALUES ('" . "','". 1 . "','". 1 . "','". $order->D . "')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id),d=$order->D";
$result1 = $conn->prepare($query1);
$result1->execute();
$lastid = $conn->lastInsertID();
} catch(PDOExecption $e) {
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
try {
$query2 = "INSERT INTO table2(`id`, `f`, `g`)
VALUES ('" . "','" . $order->F . "','" . $lastid . "')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), f=$order->F";
$result2 = $conn->prepare($query2);
$result2->execute();
$lastid = $conn->lastInsertID();
print "<br />" . $conn->lastInsertID() . "<br />";
} catch(PDOExecption $e) {
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
try {
$dnsdateparts=explode(' ',$order->H);
$query3 = "INSERT INTO table3(`id`, `g`, `h`, `i`)
VALUES ('" . "','" . $order->G . "', STR_TO_DATE('" . $dateparts[0] . "','%m/%d/%Y'),'" . $dateparts[1] . "')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), g=G, h=H, i=$lastid";
$result3 = $conn->prepare($query3);
$result3->execute();
$conn->commit();
} catch(PDOExecption $e) {
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
} catch( PDOExecption $e ) {
print "Error!: " . $e->getMessage() . "</br>";
}
}
?><code><pre>
添加
更新フォーラムランドの神々をなだめるために、私が学んだことは次のとおりです。また、3年後に実際にこれを読んで怒っている1人の男にとっても、答えはありませんでした! これはあなたのためです!
まず第一に、私はまだクラスを正しく行うことができません.OOPは何らかの理由で私の脳にとって難しいジャンプですが、関数がそうであったのと同じくらい私のコードライフを変えるなら、私は待ちきれません(はい、ついにやった.関数の周りに私の単純な心を包み込みます)。
PDOは素晴らしいです!!!
エスケープされていない、または不適切にエスケープされたデータは最低です! O'malley という名前の人物と CRS'Road という名前のストリートのおかげで、X を 1 週間帽子にかぶっていました。それが何を意味するのかわからない場合は、時間を無駄にして読んでください。速度を落として最初からやればよかったのに。
最後に、そして最も重要なこと - 私はまだ学生です。繰り返しますが、私はここで良くない、または最善ではないことをしたと確信しています。私はあなたの批判を歓迎します、そして実際にそれを楽しみにしています!
<pre><code>
<?php
// I actually got some functions to work!!
// So everything necesary self-requires from one required file
require_once ('/path/to/this/file/some.functions.php');
/*~~~~~~~~~~~~~~~~SET YOUR VARIABLES HERE~~~~~~~~~~~~~~~~~*/
/*A bunch of soap variables to be passed to MySOAPReq.file*/
/*~~~~~~~~~~~~~~~~SET YOUR VARIABLES HERE~~~~~~~~~~~~~~~~~*/
// Uses function from some.functions.php
$soapresult = mySoapClientMaker($avariable, $anothervariable);
//convert array to ph objects for use in prepared stmt
$xmlResponse = new SimpleXMLElement($soapresult);
foreach ($xmlResponse->xmlWorkOrders->workOrder as $order) {
try {
//$conn is now already there from some.functions.php
$conn->beginTransaction();
try {
// Create the query string and store it in a variable
$query1 = "INSERT INTO table(`id`,`b`,`c`,`d`) "
. "VALUES (:col1, :col2, :col3, :col4)"
. "ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id),d=" . $order->D;
// Prepare the query i.e. assemble the pieces of the string
$result1 = $conn->prepare($query1);
// Bind Values/Params
// PDO will not properly escape everything in the inserts without this
// This was the source of the broken import, lesson learned
$result1 ->bindValue(':col1', NULL, PDO::PARAM_NULL);
$result1 ->bindValue(':col2', 1, PDO::PARAM_INT);
$result1 ->bindValue(':col3', 1, PDO::PARAM_INT);
$result1 ->bindValue(':col4', $order->D, PDO::PARAM_STR);
// Execute (still in try mode) the now prepared/escaped query
$result1->execute();
// Remember the primary key from this insert to use as
// the foreign key in the next insert
$lastid = $conn->lastInsertID();
} catch(PDOExecption $e) {
// If your insert breaks, here everything
// goes back to its pre-insert state.
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
// Repeat as above
try {
$query2 = "INSERT INTO table2(`id`, `f`, `g`) "
. "VALUES (:col1, :col2, :col3) "
. "ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), f=" . $order->F;
$result2 = $conn->prepare($query2);
$result2 ->bindValue(':col1', NULL, PDO::PARAM_NULL);
$result2 ->bindValue(':col2', 1, PDO::PARAM_INT);
$result2 ->bindValue(':col3', $order->D, PDO::PARAM_INT);
$result2->execute();
$lastid = $conn->lastInsertID();
} catch(PDOExecption $e) {
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
// Repeat as above again
try {
$dateparts=explode(' ',$order->H);
$query3 = "INSERT INTO table3(`id`, `g`, `h`, `i`) "
. "VALUES (:col1, :col2, :col3, :col4) "
. "ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), g=G, h=H, i=" . $lastid;
VALUES ('" . "','" . $order->G . "', STR_TO_DATE('" . $dateparts[0] . "','%m/%d/%Y'),'" . $dateparts[1] . "')
$result3 = $conn->prepare($query3);
$result3 ->bindValue(':col1', NULL, PDO::PARAM_NULL);
$result3 ->bindValue(':col2', $order->G, PDO::PARAM_INT);
$result3 ->bindValue(':col3', "STR_TO_DATE(" . $dnsdateparts[0] . "','%m/%d/%Y')", PDO::PARAM_STR);
$result3 ->bindValue(':col4', $dateparts[1], PDO::PARAM_STR);
$result3->execute();
// NOW if everything made it this far without error
// it will all be committed to the db
$conn->commit();
} catch(PDOExecption $e) {
$conn->rollback();
print "Error!: " . $e->getMessage() . "</br>";
}
} catch( PDOExecption $e ) {
print "Error!: " . $e->getMessage() . "</br>";
}
}
?>
<code><pre>
PS 私の最新の質問に対して、彼が他の誰かに提供した迅速で簡単な回答をくれた Mike Purcell に感謝します。 PDO が引用符をエスケープしない