更新 - 请参阅下面的补充
好的,马上,我不是开发人员(也许有一天),我几乎一无所知,类、函数、方法、包装器、foos、bars,最重要的是 OOP 让我永远热爱S感到困惑。话虽如此,我相信还有很多事情我可以做得更好,并邀请您的批评和知识。然而...
我的具体问题是:我是否错过了我从中接收数据的 WSDL 与 PHP+PDO、MySQL 组合之间交互的一些重要条件,一旦我推送,一切都会崩溃?
下面代码中的三个表必须规范化通过客户端 Web 服务接收到的相当大的数据集,这部分是一个自动化过程(cron 作业),它从其他 6 个文件中提取代码。我不得不对数据库进行一些更改以适应新客户,我想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 帽子。如果您不知道这意味着什么,请浪费您的时间并阅读它!希望我放慢脚步,从一开始就这样做。
最后也是最重要的 - 我仍然是一名学生,一个非常绿色和饥饿的学生。所以再一次,我确定我在这里做了一些不好或不是最好的事情。我邀请你的批评,其实很期待!
<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 不转义引号