PHP MYSQL 深度查询

标签 php mysql

我是新人,我感到迷失。这段代码是在无限循环吗?
我应该删除第 2-4 行吗?第 19 行“$_row['employee_manager_id'],”还重要吗?
关于我应该如何做到这一点有什么建议吗?谢谢。

function get_employees_by_hierarchy( $_employee_id = 0,$_depth = 0,$_org_array = array() ) {
  if ( $this->org_depth < $_depth ) {
      $this->org_depth = $_depth;
}
  $_depth++;
  $_query = "SELECT * FROM employees WHERE ";
  if ( !$_employee_id ) {
      $_query .= "employee_manager_id IS NULL OR employee_manager_id = 0";
      }
  else { 
      $_query .= "employee_manager_id = " . $this->dbh->quoteSmart( $_employee_id );
     }
  $_result = $this->query( $_query );

  while ( $_row = $_result->fetchRow() ) {
      $_row['depth'] = $_depth;
      array_push( $_org_array, $_row );
      $_org_array = $this->get_employees_by_hierarchy(
                      $_row['employee_manager_id'],
                      $_depth,
                      $_org_array
                    );
      }
  return $_org_array;
  }

最佳答案

从外观上看:

  1. 它确实会无限循环。递归没有终止条件。您需要一个导致此情况的条件:

    $_org_array = $this->get_employees_by_hierarchy( $_row['employee_manager_id'], $_深度, $_org_array );

    不运行,或者至少将其分配给不是 get_employees_by_hierarchy 的对象。

    修复此问题后,如果员工在某个时刻成为自己的经理,则会出现无限循环。

  2. 不可能说,“深度”还用在其他地方吗?此函数返回具有“深度”字段的 $_org_array,但我们无法查看它是否已被使用。它当然不会破坏这段代码中的任何内容。

  3. 如果没有看到示例数据,我会说,是的,这很重要。该代码使用自引用员工表进行递归,并使用经理的 ID 作为层次结构的下一级。
  4. 在分配 $_org_array 之前进行检查,检查经理的 ID 是否为空,如果发生这种情况,请执行如下操作:$_org_array = $this

关于PHP MYSQL 深度查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380357/

相关文章:

php - 在 symfony 2 phpunit 中测试表单

php - paypal 模块中的 Drupal 7 添加额外费用

php - Adsense Onclick(php, javascript)

php - 将电子邮件保存到 MySQL 供员工 CRM 使用

PHP/MySQL : Getting Multiple Columns With the Same Name in Join Query Without Aliases?

php - Laravel 5.1 电子邮件 View 和模板

php - 有没有一种正确的方法可以更好地构造数组以进行循环

php - 在WordPress中从functions.php执行更新查询

php - 在两个表和 ID 中搜索查询

用于识别并发访问/使用的 MySQL 查询