PHP хлебные крошки из URL и базы данных запросов - PullRequest
0 голосов
/ 01 августа 2010

У меня есть функция php, которая работает для того, что мне нужно, но теперь я обнаружил, что есть шанс, что она потерпит неудачу Я использую mod rewrite, чтобы переписать URL-адреса, и эта функция должна быть переписана, чтобы она работала. Если у меня есть 2 страницы, которые были переписаны как одинаковые, даже если они не совпадают, это может привести к сбою.

Функция считывает URL-адрес и разбивает его на части, используя / в качестве разделителя.

Что я хочу сделать, это проверить, есть ли в URL слово «форум» и выполняет ли он запрос к базе данных, используя следующие части URL в запросе.

Скажем, у меня есть 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, но с помощью функции я не смогу разделить, потому что нет /.

Запрос, который я могу сделать достаточно просто, он просто проверяет URL, чтобы убедиться, что там находится «форум», а затем выполняет запрос. Если это не в URL, то продолжайте как обычно.

вот код для моего 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 ]

1 голос
/ 02 августа 2010

Строка переменных после URL называется строкой запроса. Лучший способ проверить наличие переменных в строке запроса - посмотреть в массиве $ _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.
}
0 голосов
/ 02 августа 2010

Мне удалось исправить это так, как мне было нужно, и это было не так сложно

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;
    }

Мне пришлось проверить текущую часть, была ли предыдущая «форум», установить соединение с базой данных,возьмите информацию, в которой я нуждался, затем замените то, что находится в крошке в этой точке.Это было то же самое для следующей крошки.

Теперь работает так, как должно.

...