Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有一种方法可以从SQL查询返回绑定结果?_Php_Mysql_Sql_Hierarchical Data - Fatal编程技术网

Php 有没有一种方法可以从SQL查询返回绑定结果?

Php 有没有一种方法可以从SQL查询返回绑定结果?,php,mysql,sql,hierarchical-data,Php,Mysql,Sql,Hierarchical Data,我有一个菜单系统的SQL表。它具有id作为索引、显示字段和父字段。以下是数据: id, display, parent 1, File, 0 2, View, 0 3, Window, 0 4, Open, 1 5, Save, 1 6, Export, 1 7, Export to Image, 6 8, Export to PDF, 6 9, JPEG, 7 10, PNG, 7 我希望有一个函数以HTML select格式返回菜单层次结构。所需的输出如下所示: <option va

我有一个菜单系统的SQL表。它具有id作为索引、显示字段和父字段。以下是数据:

id, display, parent
1, File, 0
2, View, 0
3, Window, 0
4, Open, 1
5, Save, 1
6, Export, 1
7, Export to Image, 6
8, Export to PDF, 6
9, JPEG, 7
10, PNG, 7
我希望有一个函数以HTML select格式返回菜单层次结构。所需的输出如下所示:

<option value='1'>File</option>
<option value='4'>-- Open</option>
<option value='5'>-- Save</option>
<option value='6'>-- Export</option>
<option value='7'>---- Export to Image</option>
<option value='9'>------ JPEG</option>
<option value='10'>------ PNG</option>
<option value='8'>---- Export to PDF</option>
<option value='2'>View</option>
<option value='3'>Window</option>
$categories = array( 
   array(
     'id' => 1,
     'name' => 'File',
     'parent' => 0
   ),
   ... etc.
);
这就是我提出的功能:

function SelectPage($pdo, $default = "", $depth = 0, $id = 0, $opts = "") {
  $sql = $pdo->prepare("SELECT id,display FROM pages WHERE parent = ?");
  $sql->execute(array($id));
  while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
    $opts .= "<option value='{$row["id"]}'>";
    $opts .= trim(str_repeat("--", $depth) . " ");
    $opts .= "{$row["display"]}</option>";
    $tmp = SelectPage($pdo, $default, ($depth + 1), $row["id"], $opts);
    $opts = $tmp;
  }
  return $opts;
}

它是有效的,但我怀疑它的效率有多高。我想知道是否有一种方法可以使SQL查询以正确的顺序返回它们,从而避免对自身进行循环调用?

不要在SQL语句中使用递归。在一个查询中,将所有类别按如下方式放入数组:

<option value='1'>File</option>
<option value='4'>-- Open</option>
<option value='5'>-- Save</option>
<option value='6'>-- Export</option>
<option value='7'>---- Export to Image</option>
<option value='9'>------ JPEG</option>
<option value='10'>------ PNG</option>
<option value='8'>---- Export to PDF</option>
<option value='2'>View</option>
<option value='3'>Window</option>
$categories = array( 
   array(
     'id' => 1,
     'name' => 'File',
     'parent' => 0
   ),
   ... etc.
);
接下来使用这个简单的函数。如果需要,可以修改

function isSubCategory( $id, $cats )
{
    foreach( $cats as $cat )
    {
        if( $id != $cat['id'] && $id == $cat['parent'] )
         return true;
    }
    return false;
} 
echo '<select>';
function getRecursiveTree( $parent, $cats, $level = -1 )
{
  $separator = '-';
  foreach( $cats as $i => $cat )
    {
      if( $cat['parent'] == $parent ) 
        {
          $level++;
      if( isSubCategory( $cat['id'], $cats ) )
      {
        echo '<option value="',$cat['id'],'">', str_repeat( $separator, $level ) , $cat['name'],'</option>' . PHP_EOL;
        getRecursiveTree( $cat['id'], $cats, $level );                        
      }
      else
      {
        echo '<option value="',$cat['id'],'">', str_repeat( $separator, $level ) , $cat['name'],'</option>' . PHP_EOL;
      }
      $level--;        
    } 
    }   
}

echo ( getRecursiveTree( 0, $k ) );
    echo '</select>';