【问题标题】:MySQL query with joins works in Phpmyadmin but not in php带有连接的 MySQL 查询在 Phpmyadmin 中有效,但在 php 中无效
【发布时间】:2019-09-18 10:27:14
【问题描述】:

我有一个 Mysql (mariaDB) 查询,其中包含一些在 phpmyadmin 终端中运行良好的连接。但是,如果我尝试在 php (pdo) 中执行,数据库的工作量会很大,直到我在 nginx 上得到一个坏网关。

如果我从查询中删除连接,它也适用于我的 php 脚本。

所以问题一定出在连接上,但这里有什么问题?

public function exportCSVById($id){
$this->db->query('
SELECT DISTINCT
positions_list.id,
positions_list.order_id,
positions_list.position,
positions_list.comment,
positions_list.result,
positions_list.created,
positions_list.modified,
positions_list.releaseSuS1,
positions_list.releaseSuS2,
positions_list.releaseCuS1,
positions_list.releaseCuS2,
us1.lastname as SuS1,
us2.lastname as SuS2,
orderstates.keynr,
orderstates.content,
companies.id,
companies.company,
users.id,
users.lastname,
ordertype_positions.keynr,
ordertype_positions.p_company,
ordertype_positions.content as orderstate,
repkey.keynr,
repkey.p_company,
repkey.content as repkey,
rk2.keynr,
rk2.p_company,
rk2.content as repkey2

FROM positions_list

JOIN ordertype_positions
ON positions_list.optionindex=ordertype_positions.keynr
AND ordertype_positions.p_company = positions_list.comp_id

JOIN repkey
ON positions_list.keyindex=repkey.keynr
AND repkey.p_company = positions_list.comp_id

JOIN repkey as rk2
ON positions_list.keyindex2=rk2.keynr
AND rk2.p_company = positions_list.comp_id

JOIN companies
ON positions_list.comp_id=companies.id

JOIN users
ON positions_list.uid=users.id

JOIN users as us1
ON positions_list.releaseSuS1=us1.id

JOIN users as us2
ON positions_list.releaseSuS2=us2.id

JOIN orderstates
ON positions_list.repstate=orderstates.keynr

WHERE 
positions_list.order_id =:id

ORDER BY
positions_list.created ASC
');

$this->db->bind(':id', $id);

$results = $this->db->resultSet();
return $results;
}

public function resultSet(){
$this->execute();
    return $this->stmt->fetchAll(PDO::FETCH_OBJ);
}

【问题讨论】:

  • JOIN更改为LEFT JOIN
  • @Gulshan:为什么?发帖人知道数据库模式,你我都不知道。 JOIN 与 LEFT JOIN 不同。 Normal JOIN 表示 INNER JOIN。 LEFT JOIN 表示 LEFT OUTER JOIN。

标签: php mysql pdo


【解决方案1】:

PHPMYADMIN 对结果进行了限制。

您只需拥有一个巨大的结果集。 PHP 尝试将其全部加载到内存中:

return $this->stmt->fetchAll(PDO::FETCH_OBJ);

显然这超出了您当前的 PHP 内存限制。

解决方案?

分批工作,或开始使用游标:

What is PDO scrollable cursor?

【讨论】:

  • 查询结果很少
  • 在这种情况下,您的问题出在代码的其他地方。也许是一个无限循环?我建议隔离此查询并在测试文件(无框架)中独立运行,以查看它是否按预期返回。这只是基本的 PDO。
  • 我做到了,只有一个带有 pdo 的文件。结果相同。可能是服务器故障?
  • 我不知道 nginx,但如果我在 Apache 上,我会首先查看该网站的 error.log 中的最新错误消息。还要查看(再次尝试找到 nginx 等效项)Apache2 的 OWN error.log。通常,您可以在其中找到提示。如果这没有任何结果,请开始添加检查点(记录到错误文件)。只是为了确保它挂在查询本身上。
  • 它是一个托管服务器。在我的网站日志中没有相关错误。我请我的主人检查核心日志....谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多