【问题标题】:Why this query is always working in phpmyadmin but on my php pdo code it works sometimes?为什么此查询始终在 phpmyadmin 中有效,但在我的 php pdo 代码中有时有效?
【发布时间】:2019-09-27 16:08:18
【问题描述】:

我正在尝试获取在过去 35 分钟内添加的行。字段日程表的类型为日期时间(YYYY-MM-DD HH:ii:ss)。当我复制完全相同的查询并粘贴到 phpmyadmin 时,它可以正常工作,但是在我使用 pdo 的 php 代码中,它可以根据自己的意愿工作(哈哈)。有时它会正确返回,并且在几秒钟内它不再返回任何结果,然后再次工作。也没有返回错误 var_dump($_SESSION['userid']) 正在返回预期值。

我的php代码:

function db_exec($conn,$sql,$values=null){
    $sth = $conn->prepare($sql);
    if($values!=null)
        foreach($values as $key => $value){
            $index=++$key;
            $sth->bindValue($index,$value);
    }
    $sth->execute();
    return $sth;
}

$agendamentos=db_exec($dbread,"SELECT agendamentos.id as id, agendamentos.userid as userid, 
agendamentos.paciente as paciente,agendamentos.agendadoPara as agendadoPara,usuarios.nome as nome,
usuarios.contaTipo as contaTipo, profissionais.sexo as sexo, profissionais.profissao as profissaoId,
tipoProfissionalPF.tipo as profissao,tipoProfissionalPF.urlprefix as urlprefix, tipoProfissionalPJ.tipo as estabelecimento,
tipoProfissionalPJ.urlprefix as clinprefix,empresaDados.nomeFantasia as nomeFantasia
FROM agendamentos 
LEFT JOIN usuarios ON usuarios.id=agendamentos.userid 
LEFT JOIN profissionais ON profissionais.userid=agendamentos.userid 
LEFT JOIN empresaDados ON empresaDados.userid=agendamentos.userid 
LEFT JOIN tipoProfissionalPF ON tipoProfissionalPF.id=profissionais.profissao 
LEFT JOIN tipoProfissionalPJ ON tipoProfissionalPJ.id=empresaDados.tipoProfissionalPJ 
WHERE agendamentos.paciente=? AND agendamentos.confirmado=0 AND TIMESTAMPDIFF(MINUTE,agendamentos.agendadoEm,NOW())<35",array($_SESSION['userid']));

if($agendamentos->rowCount()>0) 
  echo 'ok';
else 
  echo 'none';

正如我之前所说,有时它会起作用,但几分钟后它就不再起作用了。通过在 phpmyadmin 上运行此查询始终有效,即使它不在我的 php 页面上运行。 有谁知道我做错了什么?对我来说是个谜,我没有找出问题所在。

【问题讨论】:

  • “没有错误返回” - 你检查了 PDO 错误还是设置了PDO::ERRMODE_EXCEPTION
  • 根据 PDOStatement::rowCount 的文档:如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都保证此行为,并且不应依赖于可移植应用程序。相反,您应该在执行 SELECT 之后发出 PDOStatement::fetchAll 调用,然后计算返回的实际行数。
  • @Jeff 我已经设置了 PDO::ERRMODE_EXCEPTION
  • @RonaldAaronson 同样的问题,兄弟!我曾想象它不会工作,因为我使用 rowCount 完成了所有应用程序并且它工作得很好,但我真的很感激你的建议,下次我会接受这个建议。但是现在我仍然坚持这个问题。

标签: php mysql


【解决方案1】:

问题是我的 rds 实例的时区。主 rds 设置为从属的不同时区,因此查询对于 NOW() 可能有两个不同的结果,具体取决于到达的 rds。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多