我错过了什么? - PDO +交易+多个查询 -

时间:2012-05-07 07:41:09

标签: php mysql transactions pdo multi-query

更新 - 查看以下附加内容

好的,马上,我不是开发人员(也许有一天),我几乎什么都不知道,类,功能,方法,包装,foos,酒吧,而且最重要的是OOP会让爱好者感到困惑 - S 不在我身边。话虽这么说,我确信有很多事情我可以做得更好,并邀请你的批评和知识。然而...

我的具体问题是:我错过了接收数据的WSDL与PHP + PDO,MySQL组合之间的交互的一些重要条件,一旦我推送,一切都将崩溃?

下面代码中的三个表必须规范化通过客户端Web服务接收的相当大的数据集,这部分是一个自动化过程(cron作业),从其他6个文件中提取代码。我不得不对数据库进行一些更改以容纳一个新客户端,我想WTH,让我们再试一次PDO。只是现在我不觉得我对它看到的代码感到非常困惑,因为它可能正确地做到了(是的,我今天已经多次测试了,多次进口,一切都顺利完成)我我准备好在明天的某个时候推出最新的更新,老实说我有点担心我错过了一些重要的东西,并且在本周我出城的时候会结束一堆腐败的数据。很抱歉,如果它看起来不重要,但我在这些网站上花了很多时间,并且知道我做的很少,大部分信息要么假设太多,要么潜入我尚不能胜任的事情(参见清单)在顶部)。

我在这里做错了什么,或者这正是PDO真棒的原因?如果不是,我可以更有说服力吗?我是否遗漏了一些ON DUPLICATE KEY UPDATE不会继续做其工作的情况......?

仅供参考:除了我的autonumber primary之外,最后一个表中没有唯一数据。有一个由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>

ADDITION

更新为了安抚论坛之神,这就是我所学到的。同样对于从现在开始3年的1个人实际上会读到这个,并且生气它从未被回答过!这是给你的老兄!

首先,我仍然无法正确上课,出于某种原因,OOP对于我的大脑来说是一次艰难的跳跃,但是如果它们会像功能那样改变我的代码生命,我就等不及了(是的)我终于把我的简单思想包裹在了各种各样的功能之中。

PDO很棒!!!

未转义或未正确转发的数据很糟糕!因为一个名叫奥马利的人和一条名为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>

P.S。感谢Mike Purcell为我提出的最新问题提供了快速简单的答案。 PDO not escaping quotes

0 个答案:

没有答案