Непонятный пробел.

Тема в разделе "Как сделать...", создана пользователем Runapa, 2 ноя 2012.

Статус темы:
Закрыта.
  1. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    Пожалуйста объясните мне почему вот этот класс

    PHP:
    class Main_page extends Db {
        function 
    get_main_page(){
            
    $sql "SELECT page_name, position FROM buttons WHERE position = '0'";
            
    $result $this->sql($sql);
            return 
    $result;
        }
       
        function 
    search_main() {
            
    $res $this->get_main_page(); //Возвращаем ссылку на результат sql запроса.
            
    $row mysql_fetch_assoc($res);
            return 
    $row["page_name"];
        }
       
        function 
    print_main() {
            if (isset(
    $_GET["p"])) {
                
    $p $_GET["p"];
            }else{
                
    $p $this->search_main();
            }
            return 
    $p;
        }
    }
    который вызывается

    PHP:
    $main = new Main_page();
    $p $main->print_main();
    выводит пустую строку ? Причем в соурсе страницы это выглядит как пустая строка.
    Если
    PHP:
    return $p;
    поменять на
    PHP:
    echo $p;
    , то выводится содержимое переменной $p.
    Уже всю голову сломал. Помогите понять ?
     
  2. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Ну тут не совсем понятно... что там в Db?

    Давайте упростим класс и попробуем ещё раз:

    PHP:
    class Main_page extends Db {
     
        public function 
    get_main_page() {
            return 
    $this->sql("SELECT page_name, position FROM buttons WHERE position = '0'");
        }
     
        public function 
    search_main() {
            
    $row mysql_fetch_assoc$this->get_main_page() );
         
            if( !empty( 
    $row["page_name"] ) ) {
                return 
    $row["page_name"];
            }
         
            return 
    '';
        }
     
        public function 
    print_main() {
            global 
    $_GET;
         
            return ( isset(
    $_GET['p']) ) ? $_GET['p'] : $this->search_main();
        }
    }
    а что там должно выводится?
     
  3. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    А ничего. В $p попадает значение поля бд page_name. Но оно не должно выводиться.
    Кстати, упрощенный класс выводит тоже самое.
     
  4. tirrex

    tirrex

    Регистр.:
    9 ноя 2008
    Сообщения:
    213
    Симпатии:
    60
    честно говоря не очень понятно, чего нужно добиться, попробуем разобраться, итак
    в $p записывается: page_name или $_GET['p'],
    эта строка:
    $p = $main->print_main();
    ничего не выведет, т.к. это присваивание а не вывод
    так в чем проблема? что $p получается пустое или что $p не пустое но не выводится?
    тогда в 1-м случае
    либо этот запрос: SELECT page_name, position FROM buttons WHERE position = '0'
    выдает пустую выборку (или там page_name не заполнено), либо GET параметр p - существует, но тоже пустой
    во 2-м
    нужно смотреть (писать?) код который делает вывод, а его здесь нет
     
  5. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    А можно как то увидеть класс Db?
     
  6. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    PHP:
    class Db extends Config {
        private 
    $connection;
           
        function 
    __construct() {
            
    $this->open_connection();
        }
       
        private function 
    open_connection() {
            
    $this->connection mysql_connect($this->DB_HOST$this->DB_USER$this->DB_PASS);
            if (!
    $this->connection){
                die(
    "Database connection failed".mysql_error());
            }else{
                
    $db_select mysql_select_db($this->DB_NAME);
                if(!
    $db_select) {
                    die(
    "Database selection failed: ".mysql_error());
                }
            }
            
    mysql_query("set names utf8") or die("set names utf8 failed");
        }
       
        public function 
    sql($query) {
            
    $result mysql_query($query$this->connection);
            if(!
    $result){
                die(
    "Database query failed: ".mysql_error());
            }
            return 
    $result;
        }
           
    }

    Тут ничего не должно выводиться. $p просто содержит имя страницы которое используется при формировании url.

    Вот что меня беспокоит:

    HTML:
    </head>
    <body>
        <div class="container">
      <div class="header">
             
    <div class="lang_buttons">
    Пробел между header и lang_buttons выводится в браузере как пустая строка.
     
  7. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Позволил себе доработать класс:

    PHP:
    class Db extends Config {
        private 
    $connection$result;
     
        function 
    __construct() {
            
    $this->open_connection();
        }
     
        private function 
    open_connection()
        {
            
    $this->connection mysql_connect($this->DB_HOST$this->DB_USER$this->DB_PASS) or die('SQL not connected: '  mysql_error());
            
    $db_select        mysql_select_db($this->DB_NAME$this->connection) or die( mysql_error() );
       
            
    mysql_query("set names utf8") or die("set names utf8 failed");
        }
     
        public function 
    sql($query)
        {
            
    $query mysql_real_escape_string($query$this->connection);
            return 
    $this->result mysql_query($query$this->connection);
        }
     
        public function 
    fetch()
        {
            if( 
    is_resource($this->result) ) {
                return 
    mysql_fetch_assoc($this->result);
            }
       
            return 
    null;
        }
     
        public function 
    fetch_all()
        {
            if( !
    is_resource($this->result) ) {
                return 
    false;
            }
       
            
    $rows $this->count();
            
    $_    = array();
       
            if(
    $rows 0) {
                for(
    $j 0$j $rows$j++) {
                    
    $_[] = mysql_fetch_assoc($this->result);
                }
            }
       
            return 
    $_;
        }
     
        public function 
    count()
        {
            return ( 
    is_resource($this->result) ) ? mysql_num_rows($this->result) : 0;
        }
    }
    Теперь сам класс Main_page:

    PHP:
    class Main_page extends Db {
     
        public function 
    get_main_page() {
            return 
    $this->sql("SELECT * FROM buttons WHERE position = '0' LIMIT 1");
        }
     
        public function 
    search_main() {
            
    $this->get_main_page();
            
    $row $this->fetch();
     
            if( !empty( 
    $row['page_name'] ) ) {
                return 
    $row['page_name'];
            }
     
            return 
    '';
        }
     
        public function 
    print_main() {
            global 
    $_GET;
     
            return ( 
    array_key_exists('p'$_GET) ) ? $_GET['p'] : $this->search_main();
        }
    }
    Теперь два момента.
    1. Если есть что-то в $_GET['p'] даже пробел... будет выведен он
    2. Если есть запись в базе и в page_name что-то есть, то будет отображено оно если нед $_GET['p']

    Если и это не поможет... вышлите мне код весь... я помогу разобраться
     
    Runapa нравится это.
  8. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    Пипец .Я лошара.
    Спасибо всем кто откликнулся.Причина появления пробела оказалось проста. Это был символ что появляется в начале файла в кодировке UTF-8. Перекодировал в UTF-8 без бом, и всё заработало как надо.
     
Статус темы:
Закрыта.