代码之家  ›  专栏  ›  技术社区  ›  AdRock

来自url和查询数据库的php breadcrumbs

  •  0
  • AdRock  · 技术社区  · 14 年前

    我有一个php函数可以满足我的需要,但现在我发现它有可能失败。我使用mod rewrite来重写url,这个函数需要重写url才能工作。如果我有两个页面被重写为相同的,即使他们是不一样的,它可能会失败。

    函数读取url并使用/作为分隔符将其拆分为多个部分。

    我想做的是检查url中是否有单词'forum',以及它是否使用查询中的以下url部分查询数据库。

    http://www.mydomain.com/forum/1/2/6 我想为我的查询得到1和2,这将是boardid和topicid。最后一位是页码。

    这是一个重写的url,通常看起来像 http://www.mydomain.com/topic.php?boardid=1&topicid=2&pagenum=6

    我可以做的查询足够简单,它只是检查网址,以确保'论坛'在那里,然后做查询。如果它不在网址上,那就照常做吧。

    下面是我的php breadcrumb的代码

    function breadcrumb(
                        $home = 'Home', // Name of root link
                        $division = ' / ', // Divider between links
                        $hidextra = true, // Toggle hide/show get data and fragment in text
                        $index = false,  // Toggle show/hide link to directory if it does not contain a file
                        $indexname = 'index.php' // The definition of the file the directory must contain
            ) {
    
                $breadcrumb="";
    
                // Requested addons...
                $extension = '.php'; // Extension to cut off the end of the TEXT links
                $ifIndex = 'index.php'; // Filename of index/default/home files to not display
                // End requested addons
    
                $whole = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    
                if(stristr($whole,"contact-bidder")) {
                    $whole = substr($whole,0,strrpos($whole,'/'));
                }
    
                $parts = explode('/', $whole);
                $parts[0] = 'http://'.$parts[0];
    
                $array = array('-', '%20');
    
                $breadcrumb .=  "<a href=\"{$parts[0]}\">{$home}</a>{$division}";
                $k = 1;
                for ($i=1;$i < sizeof($parts);$i++) {
                    $uri = '/';
                    while ($k <= $i) {
                            $uri .= $parts[$k];
                            if ($k != (sizeof($parts)-1)) $uri .= '/';
                            $k++;
                     }
                      if (($index && is_dir($_SERVER['DOCUMENT_ROOT'].$uri) && is_file($_SERVER['DOCUMENT_ROOT'].$uri.$indexname) 
                    || !$index 
                    || !is_dir($_SERVER['DOCUMENT_ROOT'].$uri)) && $parts[$i] != $ifIndex) {
                        $breadcrumb .= "<a href=\"$uri\">";
                        if ($hidextra) {
                            $breadcrumb .= rtrim(preg_replace("/\?.*$/", '', ucwords(str_replace($array," ",$parts[$i]))), $extension);
                        }
                        else {
                            $breadcrumb .= rtrim(ucwords($parts[$i]), $extension);
                        }
                        $breadcrumb .= '</a>';
                    }
                    else {
                        $breadcrumb .= ucwords(str_replace($array," ",$parts[$i]));
                    }
    
                      if (isset($parts[($i+1)])) {
                        $breadcrumb .= $division;
                    }
                      $k = 1;
                }
                return $breadcrumb;
            }
    

    如果这不可能或不容易,有没有一种方法,我可以分裂的基础上?和&只得到之前的东西?对于url中的每个变量

    2 回复  |  直到 14 年前
        1
  •  1
  •   phirschybar    14 年前

    URL后面的变量字符串称为查询字符串。检查查询字符串中是否存在变量的最佳方法是查看$\u GET数组。

    所以。。。如果您有:

    http://google.com/?key=value&another_key=another_value&forum=22

    您可以这样检查变量'forum':

    if (isset($_GET['forum'])){
    
      // 'forum' has been set in the query string, do something...
    
    } else {
    
      // 'forum' has NOT been set.
    }
    
        2
  •  0
  •   AdRock    14 年前

    我设法解决了它我需要的,它不是那么难

    function breadcrumb(
                    $home = 'Home', // Name of root link
                    $division = ' / ', // Divider between links
                    $hidextra = true, // Toggle hide/show get data and fragment in text
                    $index = false,  // Toggle show/hide link to directory if it does not contain a file
                    $indexname = 'index.php' // The definition of the file the directory must contain
        ) {
            global $host,$dbUser,$dbPass,$dbName;
    
            require_once("php/database/connection.php");
            require_once("php/database/MySQL.php");
    
            // Connect to the database and grab the email
            $db = & new MySQL($host,$dbUser,$dbPass,$dbName);
    
            $breadcrumb="";
    
            // Requested addons...
            $extension = '.php'; // Extension to cut off the end of the TEXT links
            $ifIndex = 'index.php'; // Filename of index/default/home files to not display
            // End requested addons
    
            $whole = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    
            $parts = explode('/', $whole);
            $parts[0] = 'http://'.$parts[0];
    
            $array = array('-', '%20');
    
            $breadcrumb .=  "<a href=\"{$parts[0]}\">{$home}</a>{$division}";
            $k = 1;
            for ($i=1;$i < sizeof($parts);$i++) {
                $uri = '/';
                while ($k <= $i) {
                        $uri .= $parts[$k];
                        if ($k != (sizeof($parts)-1)) $uri .= '/';
                        $k++;
                 }
                  if (($index && is_dir($_SERVER['DOCUMENT_ROOT'].$uri) && is_file($_SERVER['DOCUMENT_ROOT'].$uri.$indexname) 
                || !$index 
                || !is_dir($_SERVER['DOCUMENT_ROOT'].$uri)) && $parts[$i] != $ifIndex) {
                    $breadcrumb .= "<a href=\"$uri\">";
                    if ($hidextra) {
                        if($parts[$i-1]=="forum") {
                            $board = substr($parts[$i],6);
                            $sql = "SELECT boardname FROM boards WHERE boardid='".$board."'";
                            $result = $db->query($sql);
    
                            while($row=$result->fetch()) {
                                extract($row, EXTR_PREFIX_INVALID, '_');
                                $breadcrumb .= $boardname;
                            }
                        } 
                        else if($parts[$i-2]=="forum") {
                            $topic = substr($parts[$i],10);
                            $sql = "SELECT topicname FROM topics WHERE topicid='".$topic."'";
                            $result = $db->query($sql);
    
                            while($row=$result->fetch()) {
                                extract($row, EXTR_PREFIX_INVALID, '_');
                                $breadcrumb .= $topicname;
                            }
                        }
                        else {
                            $breadcrumb .= rtrim(preg_replace("/\?.*$/", '', ucwords(str_replace($array," ",$parts[$i]))), $extension);
                        }
                    }
                    else {
                        $breadcrumb .= rtrim(ucwords($parts[$i]), $extension);
                    }
                    $breadcrumb .= '</a>';
                }
                else {
                    $breadcrumb .= ucwords(str_replace($array," ",$parts[$i])); 
                }
    
                  if (isset($parts[($i+1)])) {
                    $breadcrumb .= $division;
                }
                  $k = 1;
            }
            return $breadcrumb;
        }
    

    我必须检查当前的部分,如果以前是'论坛',建立一个连接到数据库,抓取我需要的信息,然后更换什么是在面包屑在这一点上。下一个面包屑也是这样。

    现在它应该怎样工作。