在一个PHP函数中使用SQL选择然后更新时出现问题-MYSQL PHP ST EXECUTE PDO

在一个PHP函数中使用SQL选择然后更新时出现问题-MYSQL PHP ST EXECUTE PDO,php,mysql,pdo,execute,Php,Mysql,Pdo,Execute,更新:解决了,谢谢大家的帮助 因此,我希望有一个PHP函数,它可以查询数据库中所有类型为“Check out”的遭遇,然后用最近的遭遇的日期更新persons表字段lastCO 但在我的更新函数的while循环中,似乎出现了某种错误。你可以看出,我输入了一个“echo”语句,这样我就可以看到循环的条件是否得到满足,事实上,当我查看源时,它会回显一次 但是当我注释掉我的第二条(更新)SQL语句时,while循环似乎可以正确地迭代(并且我的echo语句可以打印很多次) 公共静态函数getLastC

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


因此,我希望有一个PHP函数,它可以查询数据库中所有类型为“Check out”的遭遇,然后用最近的遭遇的日期更新persons表字段lastCO

但在我的更新函数的while循环中,似乎出现了某种错误。你可以看出,我输入了一个“echo”语句,这样我就可以看到循环的条件是否得到满足,事实上,当我查看源时,它会回显一次

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

公共静态函数getLastCO(){
$conn=新的PDO(数据库、数据库单元、数据库处理单元);
$sql=“选择UNIX\u时间戳(encPastDate)作为encPastDate、encPastText、encPastPTRef
来自enctsPast,其中encPastText='Check out';
$st=$conn->prepare($sql);
$st->execute();
$row=$st->fetch();
//麻烦似乎从这里开始!!!!
而($row=$st->fetch()){
$person=新人员($row);
如果($person->encPastDate!=null){
回声‘123abc456’;
$sql1=“更新人员设置lastCO=
(当lastCO<'$person->encPastDate'然后是'$person->encPastDate'时的情况)
当lastCO=null时,则为“$person->encPastDate”END”;
$st=$conn->prepare($sql1);
$st->execute();
}
}
$conn=null;
}      
那么,我的UPDATE语句和执行有什么问题?问题是我在同一个“连接”上连接到两个不同表的方式吗?还有别的吗

我只是调试这个有困难,我可怜的回声尝试并没有让我走远:/

- 提前感谢您的帮助

检查本手册,它应该清楚

但是在while循环中创建一个新的Persoon对象而不使用unset($Persoon)after是糟糕的内存管理。。 在循环中创建一个对象不是很好,最好是一次又一次地重复使用同一个创建的对象,如下所示

$person = new Person();

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

     person->populateFromArray($row)
替换此项:

WHEN lastCO = null 
与:

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

在你的询问中,还有一件事不适合我

您可以使用用例,但如果lastCO不为null并且大于变量的值,则lastCO的值将设置为null,以便您可以放置ELSE分支以防止这种行为

最后,您可以只在一个更新查询中合并查询,而无需循环

编辑评论回复:

试试这个: 在这个查询中,您将更新persons表的所有记录,因为您没有放置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=
案例
当lastCO<'$person->encPastDate'
然后“$person->encPastDate”
当lastCO为空时
然后“$person->encPastDate”
ELSE lastCO=lastCO
终止
换句话说: 通过这种方式,您只更新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'
更新人员
设置lastCO=
案例
当lastCO<'$person->encPastDate'
然后“$person->encPastDate”
当lastCO为空时
然后“$person->encPastDate”
终止
其中lastCO为null或lastCO<'$person->encPastDate'
第三条道路: 你有一个循环,你处理一个人的每一步。因此,您可以使用in where子句限制该人员的更新: persons.id=$person->id或存储personid的其他变量

告诉我可以吗

$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
在while循环中运行无缓冲查询时无法执行某些操作。 添加以下行以确保正在使用缓冲查询

编辑


当然,如果您需要sql中的where条件,它就可以做到这一点。

谢谢!我肯定知道我的方法不是最有效的,但不确定如何找到更好的方法。一定会读的!还在做这个。你是说我的陈述错了吗?正在阅读手册,但不太清楚。谢谢!这肯定有帮助,尽管我仍然有问题。“最后,您可以只在一个更新查询中合并到查询,而不使用循环。”--不太清楚您的意思……这很奇怪,即使在更改之后,SQL查询的行为似乎也很奇怪。该查询似乎确实影响了我的所有记录,但所有记录都具有相同的值(我可以通过查看命令行看到它们被更改),但我的echo语句只打印一次。如果我删除SQL语句,我的echo语句会重复很多次。谢谢你的回复,但我仍然有问题。我可以从命令行中看到,我的查询正在为我的所有人员设置表中的lastCO字段,但我的循环似乎中断了,因为它提取相同的单一日期并将其插入所有记录中。同样,当我注释掉SQL更新行时,我在源代码中得到了大量的回音,但是当我在SQL更新仍然存在的情况下这样做时,我在源代码中得到了一个回音。关于第二个SQL更新语句的内容正在破坏我的循环啊,你是对的。重大失误。然而,这仍然是同一个问题。当我运行此功能时,只有一个人记录受到影响!我知道第一条SQL语句正在工作并获得完整的列表,但出于某种原因,我的UPDATE语句似乎只执行一次。SQL语句本身导致了这一点(我认为)
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'
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);