Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: мистический пробел =(
Форумы портала PHP.SU » PHP » Программирование на PHP » мистический пробел =(

Страниц (2): [1] 2 »
 

1. Вездеход - 15 Декабря, 2009 - 13:23:52 - перейти к сообщению
привет всем

помогите найти ошибку плз...

есть сайт.
в нем есть файл с темой. в нем есть возможность полностью проконтролировать вывод всего контента.
в том числе вызвать в нужном месте вывод блоков...
так вот.
функция для вызова блока выглядит вот так:

PHP:
скопировать код в буфер обмена
  1. function get_block($name, $start='', $end='') {
  2.                 if(!check_block($name)) { return ''; }
  3.                 include_once("blocks/".$name."/block.php");
  4.                 if(!function_exists('block__'.$name)) return '';
  5.                 $return = $start.@call_user_func('block__'.$name).$end;
  6.                 return $return;
  7.         }


та функция, которая вызывается здесь выглядит вот так:

PHP:
скопировать код в буфер обмена
  1. function block__top_services() {
  2.         return '<hr>';
  3. }


и вот в чем вопрос.
при таком выводе инфы у меня появляется на верху страницы перенос строки. откуда берется - неизвестно. причем в коде страницы его нет и небыло и неоткуда взяться...
пример того что получается в браузере можно посмотреть в картинке

в опере все работает правельно
в мазиле вот такая гадость((

так же прикрепепил страничку которая получается.. может поможет
2. Вездеход - 15 Декабря, 2009 - 13:27:37 - перейти к сообщению
вот страничка
(Добавление)
я даже готов немного заплатить за помощь...
а то не могу дальше писать проект из-за этой ошибки...
3. valenok - 15 Декабря, 2009 - 14:30:45 - перейти к сообщению
по исходнику пробела нет. значит проблема в рендеринге и стилях. попробуй hr
поменять margin и display:inline
4. Stierus - 15 Декабря, 2009 - 14:35:55 - перейти к сообщению
а <hr /> ситуацию не меняет ?
5. Вездеход - 15 Декабря, 2009 - 20:38:39 - перейти к сообщению
valenok пишет:
по исходнику пробела нет. значит проблема в рендеринге и стилях. попробуй hr поменять margin и display:inline

проблем не в том как именно написать..
если вместо тега hr написать что угодно - смысл не меняется...
многоуважаемый чемпион сказал что там появляется некий символ, который не видно просто в коде HTML, а вот нотпад++ (или тупо ворд) этот символ выводят...
а вот откуда он берется - не понятно. я все коды првоерил - без результатно(
6. valenok - 15 Декабря, 2009 - 21:49:53 - перейти к сообщению
И все браузеры видят эдакий символ, но не один из них его не отображает в исходниках страницы?
7. Вездеход - 15 Декабря, 2009 - 22:53:31 - перейти к сообщению
я тестил на 3х - опера выводит все корректно, ИЕ и мазила делают почему то перенос строки на месте этого символа...
проверьте сами если не верите - файлик я выше прикрепил
8. CenapaTop - 15 Декабря, 2009 - 23:03:45 - перейти к сообщению
В notepad++ есть какая-то точка, между <body> и <hr>.
9. Вездеход - 15 Декабря, 2009 - 23:48:06 - перейти к сообщению
угу.. вопрос как ее убрать и откуда эта сволочь берется((
все свои коды перепроверил - ее нигде нет. это какая то функия генерит ее как то...
убрать ее тоже никак не получается



проверил вызов функции. все работает стабильно, т.е. данный мистический символ берется непонятно где и откуда, но он не имеет отношения именно к вызовам функций.
видимо где то еще косяк...
публикую коды дальше...

в ядре прописывается путь к шаблону.
потом он грузится через вот эту функцию:
PHP:
скопировать код в буфер обмена
  1. function return_page() {
  2.         include('pager/theme/page.tpl.php');
  3. }


в файле с темой простой HTML код, с вставками php
примерно так:
PHP:
скопировать код в буфер обмена
  1. <html<? return_params('HTML');?>>
  2. <head>
  3. <? return_params('HEAD');?>
  4. <meta http-equiv="Content-Type" content="text/html; charset=<? return_params('CHARSET');?>">
  5.  
  6. <meta content="<? return_params('DESCRIPTION');?>" name="description">
  7. <meta content="<? return_params('KEYWORDS');?>" name="keywords">
  8. <title><? return_params('TITLE');?></title>
  9. <link href="<? return_params('FAVICON');?>" type="image/x-icon" rel="shortcut icon">
  10.  
  11. <? return_params('CSS_');?>
  12. <link rel="stylesheet" type="text/css" href="<? return_params('CSS');?>">
  13. <style type="text/css">
  14.         body {margin:0px;}
  15. </style>
  16. <? return_params('JAVASCRIPT');?>
  17. </head>
  18. <body><?show_block('top_services');?>

может это как то влияет??
(Добавление)
в исходных кодах страницы опера показывает этот мистический символ оказывается...
и возникла новая проблема.
если сохранить странице которая получается в итоге - то код страницы меняется!

т.е. должно быть так:
CODE (text):
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  4. <meta content="описание сайта сюды" name="description">
  5. <meta content="ключевые, слова, игры" name="keywords">
  6. <title>***</title>
  7. <link href="FAVICON.ico" type="image/x-icon" rel="shortcut icon">
  8.  
  9. <link rel="stylesheet" type="text/css" href="/pager/blocks/logo/style.css" />
  10. <link rel="stylesheet" type="text/css" href="pager/blocks/top_services/style.css" />
  11. <link rel="stylesheet" type="text/css" href="/pager/theme/style.css">
  12. <style type="text/css">
  13.         body {margin:0px;}
  14. </style>
  15. </head>
  16. <body>

а после сохранения получается воттакое:
Цитата:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="описание сайта сюды" name="description"><meta content="ключевые, слова, игры" name="keywords"><title>***</title></head><body>






<link href="***/FAVICON.ico" type="image/x-icon" rel="shortcut icon">

<link rel="stylesheet" type="text/css" href="***_files/style.css">
<link rel="stylesheet" type="text/css" href="***_files/style_003.css">
<link rel="stylesheet" type="text/css" href="***_files/style_002.css">
<style type="text/css">
body {margin:0px;}
</style>


ребят, че за мистика происходит?
(Добавление)
если у кого нить есть лишних пара минут - буду рад помощи
могу дать полные исходники даже если нужно
10. Stierus - 16 Декабря, 2009 - 08:50:21 - перейти к сообщению
Цитата:
<? return_params('TITLE');?>
отдельно посмотри, что выдает?
11. valenok - 16 Декабря, 2009 - 09:26:09 - перейти к сообщению
Не соответсвуют у тебя "должно быть" и "получается после сохранения"
В одном стили до body во втором после. Браузер сам их переставил ?
--
Едем дальше, файл твой сохранил. Хромиум сразу нашел в исходном коде какой-то символ. Удалив его hr встал на месте. Ищем откуда он взялся.

Вывелся он после <body> значит виноват show_block (top_services)
Выше ты привел код get_block, самого show_block я не вижу.

А если стереть return '<hr>'; и написать return "aoeu"; все встанет на место?
Может символ в редакторе не отображается, но он там где-то есть ?
Сотри сразу всю строку и напиши всю заного.
Если не поможет - давай читать show_block
12. Вездеход - 16 Декабря, 2009 - 13:34:26 - перейти к сообщению
Stierus пишет:
отдельно посмотри, что выдает?

тут проблем нет... я проверил по исходникам.
эта функция просто берет по ключу значение из массива и выдает... косяков нету)
(Добавление)
valenok пишет:
Не соответсвуют у тебя "должно быть" и "получается после сохранения"
В одном стили до body во втором после. Браузер сам их переставил ?

да, в том то и дело - первый раз такое вижу...

valenok пишет:
Вывелся он после <body> значит виноват show_block (top_services)
Выше ты привел код get_block, самого show_block я не вижу.

PHP:
скопировать код в буфер обмена
  1. function get_block($name, $start='', $end='') {
  2.                 $return = '';
  3.                 if(!check_block($name)) { return ''; }
  4.                 include_once("blocks/".$name."/block.php");
  5.                 if(!function_exists('block__'.$name)) return '';
  6.                 $return .= $start.call_user_func('block__'.$name).$end;
  7.                 return $return;
  8.                 //return $start.$name.$end; -вот так выводит без этого символа...
  9.         }
  10.        
  11.         function show_block($name, $start='', $end='') {
  12.                 echo get_block($name, $start, $end);
  13.         }

(Добавление)
valenok пишет:
А если стереть return '<hr>'; и написать return "aoeu"; все встанет на место?
Может символ в редакторе не отображается, но он там где-то есть ?
Сотри сразу всю строку и напиши всю заного.
Если не поможет - давай читать show_block


я полностью переписал блок. написал вывод заного...
пока мистический символ пропал...
щас дальше првоерю

зы. в исходниках блока этого символа все равно там не было!
13. valenok - 16 Декабря, 2009 - 13:49:10 - перейти к сообщению
include_once("blocks/top_services/block.php"); у тебя вызывается тут впервые. Ничего интересного там нет? Если вызвать дважды <?show_block('top_services');?> между двумя hr будет пробел ?
(Добавление)
А, ну хорошо что все рашилось.
Возможно действительно попался какой-то наглый stx или еще какой нибудь eol символ
не отображаемый в редакторе. Хотя меня удивило что notepad++ его не заметил.
14. Вездеход - 16 Декабря, 2009 - 14:18:03 - перейти к сообщению
valenok пишет:
А, ну хорошо что все рашилось.
Возможно действительно попался какой-то наглый stx или еще какой нибудь eol символ
не отображаемый в редакторе. Хотя меня удивило что notepad++ его не заметил.


тестирование продолжается...
символ появляется в любом случае.
если после символа идет тег, который делает перенос строки (hr, div, p) то получается разрыв.
если перенос не нужен (тег span или вообще без тегов) то перенос и не видно...
(Добавление)
новые подробности.
переписал вызов блоков...
до этого у меня система получала массивом названия блоков необходимых для работы и загружала только файл с "инструкциями" - ну чтобы прописать все первоначальные параметры.
после этого при вызове блока через функцию show(get)_block у меня подтягивался основной файл с кодом и уже выполнялась основная функция.

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

результат - теперь вывод идет правельно.
но это еще не все...
если сохранить страницу - шапка опять криво сохраняется (боди перед стилями идет).
и сразу после тега body появляются эти мистические символы, в количестве, равном количеству вызовов разных блоков...
(Добавление)
новые подробности))

опера сохраняет страницу корректно, и добавляет эти мистические символы перед тегом HTML
мазила сохраняет все криво и вставляет после тега body

тестирование продолжается))
(Добавление)
у меня в файле index.php
есть такая запись:

PHP:
скопировать код в буфер обмена
  1. include_once('kernel/kernel.php');
  2. include_once('pager/pager.php');
  3. return_page();

сперва гружу ядро системы - все настройки, и все нужное
потом загружаю файл, ответственный за генерацию страницы.
потом вызываю функцию которая собственно и выводит саму страницу.

так вот.
если вызвать только ядро - проблем нет - символы не появляются.
если загрузить файл pager.php - то появляются 4 мистических символа (дальше ничего, так как вывода инфы нет)
если вызвать функцию return_page - то появляется 5й мистический символ...
больше 5 не выводится =)
(Добавление)
итак, методом научного тыка выяснилось:

PHP:
скопировать код в буфер обмена
  1. // список разрешенных блоков
  2.         $ACTIV_BLOCKS = array('top_banner','logo','top_services');
  3. // тут указаны блоки, которые уже "прогрузились"
  4.         $LOAD_BLOCK = array();
  5.  
  6.         foreach($ACTIV_BLOCKS as $value) {
  7.                 if(!in_array($value,$LOAD_BLOCK))       {
  8.                         include_once("blocks/".$value."/load.php");
  9.                         include_once("blocks/".$value."/block.php");
  10.                 }
  11.         }


вот этот код возвращает 4 мистических символа. как и откуда берутся они не понятно.
тщательно проверил все 6 файлов - толку нет...
при этом не важно сколько загружать так блоков - при загрузке файла load.php от всех блоков - символ получается только один.
при загрузке файла block.php - символов образуется столько же, сколько и требуется загрузить блоков. (в данном случае 3)

так же 5й символ образуется вот здесь:

function return_page() {
include_once('pager/theme/page.tpl.php');
}

(Добавление)
скопировал этот мистический символ.
и вставил сюда, в форум
потом через исходный код страницы нашел его - это вот эта сволочь мне мешает:
CODE (text):
скопировать код в буфер обмена
  1. &#65279;

а что за символ такое кто нить знает?
(Добавление)
нашел инфы немного в нете... не я один такой оказывается

http://www[dot]imho[dot]ws/showthread[dot]ph[dot][dot][dot]5177#post1335177
вот здесь чел написал чтото про этот символ. кто нить расшифруйте плз...
я не понял а то...))
http://www.imho.ws/showthread.php?p=1335177#post1335177 пишет:
На всякий случай (вдруг у кого что-то подобное будет) поделюсь, что же было: проблемным символом оказался FEFF - это ByteOrderMark, который некоторые редакторы добавляют в UTF-8 файлы
15. Champion - 16 Декабря, 2009 - 15:11:40 - перейти к сообщению
Zero width no-break space. Keep a word from breaking at that point (works as designed in IE6/Win) - вот что это такое

 

Powered by ExBB FM 1.0 RC1