0

更新:已解决,谢谢大家的帮助!


所以我想要一个 PHP 函数,它查询数据库中所有类型为“Check-out”的遭遇,然后使用最近一次遭遇的日期更新people表字段lastCO 。

但是在我的 UPDATE 函数的 while 循环中似乎以某种方式出错。你可以说我放了一个'echo'语句,这样我就可以看到循环的条件是否得到满足,事实上,当我查看源代码时,它会回显一次

但是当我注释掉我的第二个(UPDATE)SQL 语句时,while 循环似乎可以正确迭代(并且我的 echo 语句会打印很多次)。

  public static function getLastCO() {

    $conn = new PDO( DB, DBU, DBP );

    $sql = "SELECT UNIX_TIMESTAMP(encPastDate) AS encPastDate, encPastText,encPastPTRef
    FROM enctsPast WHERE encPastText = 'Check-out'";    
    $st = $conn->prepare( $sql );
    $st->execute();

    $row = $st->fetch();

       //trouble seems to start here!!!!

       while ( $row = $st->fetch() ) {

         $person = new Person( $row );

         if ($person->encPastDate != null){
            echo '123abc456';
            $sql1 = "UPDATE persons SET lastCO = 
             (CASE WHEN lastCO < '$person->encPastDate' THEN '$person->encPastDate'                      
             WHEN lastCO = null THEN '$person->encPastDate' END)";  
            $st = $conn->prepare( $sql1 );
            $st->execute();
        }
    }
    $conn = null;
  }      

那么我的 UPDATE 语句和执行有什么问题呢?问题是我在同一个“连接”上连接到两个不同的表的方式吗?还有什么?

我只是在调试时遇到了麻烦,而我可怜的回声尝试并没有让我走远:/

-

在此先感谢您的帮助!

4

3 回答 3

0

检查本手册http://php.net/manual/en/pdo.prepare.php应该很清楚,,

但是在 while 循环中创建一个新的 Persoon 对象而不使用 unset($persoon) after 是不好的内存管理。并且在循环中创建一个对象不是很好更好应该是一次又一次地重用同一个创建的对象并且又像下面的东西

$person = new Person();

while ( $row = $st->fetch() ) {

     person->populateFromArray($row)
于 2013-08-10T12:40:08.010 回答
0

替换这个:

WHEN lastCO = null 

和:

WHEN lastCO is null 

变量和 NULL 值之间的比较必须使用 IS NULL 语句完成,否则总是 UNKNOWN 所以你的 THEN 分支没有被执行。

在您的查询中,另一件事不适合我。

您使用 CASE 但如果 lastCO 不为 null 并且大于您的变量,则 lastCO 的值设置为 NULL,因此您可以放置​​ ELSE 分支来防止这种行为。

最后,您可以只在一个没有循环的 UPDATE 查询中合并查询。

编辑评论的答案:

试试这个:在这个查询中,你更新了 person 表的所有记录,因为你没有放置 where 子句

UPDATE persons
SET lastCO = 
CASE 
    WHEN lastCO < '$person->encPastDate'
    THEN '$person->encPastDate'                      
    WHEN lastCO is null
    THEN '$person->encPastDate' 
    ELSE lastCO = lastCO
END

以另一种方式:通过这种方式,您仅更新 lastCO 未评估或低于变量 '$person->encPastDate' 的人员记录

UPDATE persons
SET lastCO = 
CASE 
    WHEN lastCO < '$person->encPastDate'
    THEN '$person->encPastDate'                      
    WHEN lastCO is null
    THEN '$person->encPastDate' 
END
where lastCO is null or lastCO < '$person->encPastDate'

第三种方式:你有一个循环,你处理一个人的每一步。因此,您可以使用 where 子句限制该人的更新:persons.id = $person->id 或其他已存储人员 ID 的变量。

告诉我是否可以

于 2013-08-10T12:41:08.953 回答
-1
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);

在 WHILE 循环中运行无缓冲查询时无法执行某些操作。添加以下行以确保正在使用缓冲查询。

编辑

当然,这样做你需要 sql 中的 where 条件。

于 2013-08-10T12:42:33.383 回答