Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вставка контексной рекламы внутри статьи
 
 автор: hitball   (29.03.2013 в 19:52)   письмо автору
 
 

Добрый день! Хочу вставить в тело статьи контексную рекламу гугл адсенс (после 5 абзаца информационной статьи или по-середине статьи), но никак не могу понять как это сделать. Прошерстив поисковики нашла только разные плагины для движков вордпрес и джумла.
пожалуйста, помогите мне в решении этой проблемы.

текст на страницу выводится из базы данных вот так:

<?  
printf 
(
<h1>%s</h1> 
<div><img src='%s'>
<div ><p>%s</p></div></div>
<p>Автор:%s</p>
"
,$myrow["title"],$myrow["mini_img"],$myrow["text"],$myrow["author"]);    
?> 


вот код рекламного блока

<script type="text/javascript"><!--
google_ad_client = "...";
/* pod_img */
google_ad_slot = "...";
google_ad_width = 125;
google_ad_height = 125;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>


заранее спасибо всем отозвавшимся!!!

  Ответить  
 
 автор: confirm   (29.03.2013 в 20:30)   письмо автору
 
   для: hitball   (29.03.2013 в 19:52)
 

Ну а где "середина" в этом, что вы представили (printf...)? Или как у вас выводится 5 абзацев?

  Ответить  
 
 автор: hitball   (29.03.2013 в 20:38)   письмо автору
 
   для: confirm   (29.03.2013 в 20:30)
 

<div ><p>%s</p></div></div>
$myrow["text"]

за вывод текста отвечает вот эти строки выделеные жирным

p.s. спасибо, что отозвались!

  Ответить  
 
 автор: confirm   (29.03.2013 в 20:52)   письмо автору
 
   для: hitball   (29.03.2013 в 20:38)
 

Это понятно, я не об этом. Вот ваш html-код:
<h1>Тут будет заголовок</h1>
Далее в элемент загружается некий текст
<div>
<img> картинка
<div > опять разметка
<p>И тут текст</p>
</div>
</div>
<p>Автор</p>

Вы в середину <p>И тут текст</p> пытаетесь вставить? Или 5 абзацев это значит через пять <h1>Тут будет заголовок</h1>?
Если первое, то что же у вас в базе храниться? Элемент Р это и есть параграф, а значит у вас в базе должен уже быть html-содержимое (параграфы) и выводить их надо циклом и не в параграф как у вас, а в DIV, и цикле определять место вставки. Если же у вас текст в базе, то не понятно как он у вас будет отображаться,
Если второе, значит в цикле определять достигнута ли середина, или 5 параграфов.

Покажите как вы вывод результата запроса осуществляете, а то не понять, что и куда.

  Ответить  
 
 автор: hitball   (29.03.2013 в 21:00)   письмо автору
 
   для: confirm   (29.03.2013 в 20:52)
 

Вы в середину <p>И тут текст</p> пытаетесь вставить?
да
в базе есть таблица с колонками заголовок (это то, что выводится в h1 (название графы title)) и текст (название графым text) - тело самой статьи с html версткой <p>
Вот в теле самой статьи я и хочу вставить рекламный код

  Ответить  
 
 автор: confirm   (29.03.2013 в 21:10)   письмо автору
 
   для: hitball   (29.03.2013 в 21:00)
 

Ну если у вас в базе уже html то зачем же вы ее в параграф вставляете, какой смысл в этом?
<p>Тут вывод, а обрамляющиего его теги параграфа удалить.</p>

Придется ту часть информации, которая заключена в параграфы ($myrow["text"]), разбить на массив (по закрывающему тегу параграфа), и осуществлять вывод их в цикле, закрывая каждый параграф. Вне цикла установить счетчик по которому можно будет определить достижение середины (для цикла for не обязательно). А середину узнать легко, достаточно разделить число элементов массива полученного после разбиения параграфов, округлив это значение.

  Ответить  
 
 автор: hitball   (29.03.2013 в 23:05)   письмо автору
 
   для: confirm   (29.03.2013 в 21:10)
 

title - это ведь название статьи. параграфы (абзацы и h2, h3) у меня только в столбце title. я, наверное, как-то не так все объяснила(
у меня в базе уже около 1,5 тыс статей...

  Ответить  
 
 автор: confirm   (29.03.2013 в 23:24)   письмо автору
 
   для: hitball   (29.03.2013 в 23:05)
 

Значит поясните куда вставить надо, я вас об этом изначально спросил.
Ну вы же не между 1500 статьями вставить хотите так ведь? ) Наверное же разбив какую-то статью, так?

1. Ваш print() выводит именно статью?
2. Переменная $myrow["text"] содержит параграфы этой статьи?
3. Значит надо найти середину $myrow["text"] и вставить в нее JS-код?

  Ответить  
 
 автор: hitball   (29.03.2013 в 23:33)   письмо автору
 
   для: confirm   (29.03.2013 в 23:24)
 

>Значит поясните куда вставить надо, я вас об этом изначально спросил.
простите(
>1. Ваш print() выводит именно статью?
да, верно
>2. Переменная $myrow["text"] содержит параграфы этой статьи?
здесь содержится тело статьи обрамленное тегами <p>, <h2>, <h3>,<br>
>3. Значит надо найти середину $myrow["text"] и вставить в нее JS-код?
да

  Ответить  
 
 автор: confirm   (29.03.2013 в 23:50)   письмо автору
 
   для: hitball   (29.03.2013 в 23:33)
 

Ну я вам и показал как это сделать. Мне трудно советовать вам как выгоднее разбить ваше содержимое пополам, так как содержится тело статьи обрамленное тегами <p>, <h2>, <h3>,<br> не дает представления о содержимом.
Тег BR вообще ничего не обрамляет, это одиночный тег. Если у вас в статье, например, заголовки H2 или H3 делят ее на части, и таких частей несколько, то можно разбить ее на массив по этим тегам. А можно по параграфам (по закрывающему тегу (</p>), как показано ниже.
В любом случае затем поступаем так как я и показал ниже - разбиваем этот массив на две части и в середину добавляем JS-код. Различие будет только в теге по которому implode() будет объединять эти части массива в строки - это должен быть тег на который вы разбивали текст.

  Ответить  
 
 автор: confirm   (29.03.2013 в 21:40)   письмо автору
 
   для: hitball   (29.03.2013 в 21:00)
 

Если вам так нравится printf(), то перед его использованием выполните:
<?
$myrow
["text"] = explode('</p>'$myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
$myrow["text"] = implode('</p>'$myrow["text"][0]).'</p><script type="text/javascript"><!-- 
google_ad_client = "..."; 
/* pod_img */ 
google_ad_slot = "..."; 
google_ad_width = 125; 
google_ad_height = 125; 
//--> 
</script> 
<script type="text/javascript" 
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 
</script>'
.implode('</p>'$myrow["text"][1]).'</p>';

Но лучше в данном случае отказаться от нее и сделать так:
<?
$myrow
["text"] = explode('</p>'$myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
?>
<h1><?=$myrow["title"]?></h1>  
<div><img src='<?=$myrow["mini_img"]?>' />
<div >
<?=implode('</p>'$myrow["text"][0])?>
</p><script type="text/javascript"><!-- 
google_ad_client = "..."; 
/* pod_img */ 
google_ad_slot = "..."; 
google_ad_width = 125; 
google_ad_height = 125; 
//--> 
</script> 
<script type="text/javascript" 
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 
</script>
<?=implode('</p>'$myrow["text"][1])?>
</p>
</div></div> 
<p><?=$myrow["author"]?></p>
Краткая запись <?=...?> возможна, если разрешены короткие php-теги (short_open_tag), или если у вас версия РНР 5.4.0, начиная с ней такая запись доступна всегда, независимо от разрешения коротких тегов.

  Ответить  
 
 автор: bond007   (24.01.2015 в 00:02)   письмо автору
 
   для: confirm   (29.03.2013 в 21:40)
 

Благодарю за код, под свои нужды сделал такой и все работает:
<? 
$myrow
["text"] = explode('</p>'$myrow["text"]); 
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2)); 
?> 
<?=implode('</p>'$myrow["text"][0])?> 
</p>
<center>  <?php  include ("blocks/gogle.php");  ?> </center>
<?=implode('</p>'$myrow["text"][1])?> 
</p> 


Очень бы хотелось размещать код не в середине статьи, а после определенного абзаца. Подскажите, пожалуйста, как это сделать?

  Ответить  
 
 автор: confirm   (24.01.2015 в 03:55)   письмо автору
 
   для: bond007   (24.01.2015 в 00:02)
 

Не разбивать массив пополам (array_chunk), а брать его срезы (array_slice) - первый от начала и по элемент, после которого необходимо разместить блок, а второй срез начиная с этого элемента + 1.

<?
$delim 
4//номер блока после которого подключение

$myrow["text"] = explode('</p>'$myrow["text"]);  

echo 
implode('</p>'array_slice($myrow["text"], 0$delim)) . '</p>' .
     include (
"blocks/gogle.php") .   
     
implode('</p>'array_slice($myrow["text"], $delim)) . '</p>';



Не используйте таких конструкций:

?>  
<?=implode('</p>'$myrow["text"][0])?>


Используйте короткий тег для вставки, там где он читаем и логичен.

А вообще на этот вопрос нужно смотреть несколько шире, нежели explode/insert/implode.

Первое - это результатом чего является html-код, которому при выводе требуется трепанация?
Второе - это чем является вставляемый в текст код, величиной постоянной или определяемой конфигурацией?

Если html-код в базе, это результат "ручного труда" посредством того же визуального редактора, то для гибкого управления выводом, желательно иметь не просто редактор, а редактор "вшитый" в управление сайтом. То есть этот редактор, это не стандартно-банальное форматирование текста и вставка чего либо, а вставка именно ресурсов сайта, ссылок на именно на ресурсы сайта, список которых динамичен также, как и само содержимое.

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

Можно поступить и иначе

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

В общем - все что мы будем добавлять в базу в качестве будущего содержания html-страницы, должно контролироваться нами поэлементно:

а) заголовки - кроме их текста еще их размер (h1, h2 ... h5), а если требуется, то и указания имени класса, определяющего стиль заголовка на странице;
б) содержание - это не "плоский по длине текст", а его фрагменты, положение которых можно менять (ранжирование);
в) вставки - код, который можно вставить и который также можно ранжировать относительно содержания, либо это html-вставки, которые можно выбрать из списка;
г) ссылки - можно выбрать из списка адрес ссылки на текущий документ (если он редактируется, иначе на имеющиеся) как непосредственно на него, так и на якоря внутри документа.

Чтобы это реализовать нужно ведь совсем не многое - это "правильную" структуру документа в базе, а именно:

а) идентификатор (поле с автоинкрементом) определяющее документ;
б) идентификатор родителя - раздел которому принадлежит документ;
в) номер блока в пределах документа - определяет ранжирование (собственно сортировку, порядок) блока внутри документа;
г) заголовок - текст заголовка;
д) размер - размер определяющий html тег заголовка, от 1 до 5;
е) содержание - блок содержания, это либо текст, либо вставка, которая является или исполняемым кодом, или html-заготовками, на которые можно указать по списку, значением которого могут быть либо ID таких включений, либо их имена;
ж) тип блока - для текстовых блоков определяющих содержание, это указывает на то, что данный тип можно редактировать, подвергать преобразованиям при выводе (например, htmlspecialchars), а для блоков исполняемых выводить как есть, и всякие преобразования запрещены.

Реализация ввода

Все просто, согласно списка структуры данных, это:

1) В простейшем случае это поле с кнопками позволяющее перемещать блок в форме (ранжирование, сортировка, перемещает строку таблицы, которая описывает/содержит все параметр блока/поля формы), а если решать с применением HTML5, то уже есть и готовое - drag and drop. Но как бы это не решалось, сервер получит порядок следования блоков на странице, который надо или записать или обновить в базе.
2) Текстовое поле - текст заголовка.
3) Поле select - html-размер заголовка.
4) Textarea - поле содержания. Если разбивать текст на блоки, а значит эти блоки в конечном итоге будут иметь некий фиксированный максимальный размер, то есть возможность хранить в базе его в поле VARCHAR, что выгоднее нежели попусту использовать TEXT.
5) Тип number или список под ENUM - тип блока как описано выше.
7) Удаление - при редактировании имеющегося блока, это его удаление, а для вновь добавляемого, это удаление полей из формы описывающей этот блок.
8) Кнопка - Добавить блок. Добавление нового блока, номер которого в базе при добавлении/обновлении клиент получает при получении этой формы, и определяется как последний номер автоинкремента, который будет применен к записи (во вновь создаваемом документе его получит первый по ранжиру блок).

Вывод

Все просто:

1) при выводе сперва выводится текст заголовка, который обрамляется тегом H указанного размера. Мало того, это же тег определяет и якорь на странице. Для этого тегу H добавляется атрибут id, имя которого можно определить переменной/константой (второе предпочтительнее, если вывод, это функция), например hs- с подстановкой идентификатора блока, то есть получим на странице: id=hs-1, id=hs-2..., и ссылки на них: ?doc=5#hs-8. Поставить перекрестные ссылки на якоря в документах тоже не сложно, для этого достаточно при выводе формы получить список документов группированных по родителю (optiongroup для select), и идентификаторы им принадлежащие (options для optiongroup в select). Сформировать ссылку при этом можно хотя бы при помощи BB-тегов, что не сложно.
2) Далее блоки текста по ранжиру, при этом включения ранее определенные будут там, где они определены, а исполняемый код во включениях будет выполнять предписанную им задачу.

Понятно, что таким образом можно включать в текст и графику в любое место будущего содержания, без всякого визуального редактора - нужно лишь добавить ввод параметров для такой вставки, это обтекание текстом, отступы, размер. А при приеме формы сервером сохранить изображение, связав его с идентификатором блока, и добавив тег IMG с прописанными параметрами и добавленным путем в текст блока-хозяина.

Вот и все.

  Ответить  
 
 автор: bond007   (24.01.2015 в 13:05)   письмо автору
 
   для: confirm   (24.01.2015 в 03:55)
 

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

Итак, на сайте множество статей. в каждой статье есть множество абзацев, все с тегами <p></p>. Текст статьи выводится данным кодом:
<?php echo $myrow['text'];  ?>


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

  Ответить  
 
 автор: confirm   (24.01.2015 в 19:22)   письмо автору
 
   для: bond007   (24.01.2015 в 13:05)
 

Да это не мой вариант, а ваш, описанный функциями РНР. Если ничего не выводится, значит где-то у вас допущена ошибка. Выполните этот пример отдельно:

<?
$delim 
3;
$insert '<p>BLOCK</p>';

$text '<p>A</p><p>B</p><p>C</p><p>D</p><p>F</p><p>G</p><p>H</p>';
$text explode('</p>'$text);

echo 
implode('</p>'array_slice($text0$delim)) . '</p>' 
     
$insert .    
     
implode('</p>'array_slice($text$delim)) . '</p>';


Все выводится, и абзац с текстом BLOCK будет включен в вывод как указано, после 3 параграфа.

  Ответить  
 
 автор: hitball   (12.09.2017 в 11:27)   письмо автору
 
   для: confirm   (24.01.2015 в 19:22)
 

Здравствуйте! Если логи сервера выдают ошибку
PHP Notice: Undefined offset: 1 in /var/www/.../view_articles.php on line 134
PHP Warning: implode(): Invalid arguments passed in /var/www..../view_articles.php on line 134
а на линии 134 как раз этот кусок
<?=implode('</p>'$myrow["text"][1])?>  

из кода

<?  
$myrow
["text"] = explode('</p>'$myrow["text"]);  
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));  
?>  
<?=implode('</p>'$myrow["text"][0])?>  
</p> 
<center>  <?php  include ("blocks/gogle.php");  ?> </center> 
<?=implode('</p>'$myrow["text"][1])?>  
</p> 

как это исправить?

  Ответить  
 
 автор: confirm   (12.09.2017 в 14:15)   письмо автору
 
   для: hitball   (12.09.2017 в 11:27)
 

Сообщение гласит о том, что в массиве $myrow["text"] указанного смещения $myrow["text"][1], а значит и implode не может быть выполнено. То есть после разбиения массива array_chunk($myrow["text"], .... в нем всего один элемент. Проверять нужно.

  Ответить  
 
 автор: hitball   (20.09.2017 в 11:00)   письмо автору
 
   для: confirm   (12.09.2017 в 14:15)
 

Добрый день! Все ношусь с этой проблемой.
Сервер в логах выдает эту ошибку
PHP Notice:  Undefined offset: 1 in view_articles.php on line 134
PHP Warning:  implode(): Invalid arguments passed in /view_articles.php on line 134

после чего выбивает сайт по ERR_CONNECTION_TIMED_OUT
думаю, что это может быть из-за большого обращения посетителей к этой странице. Может такое быть?
И я совершенно не знаю как это исправить и сделать проверку!

  Ответить  
 
 автор: confirm   (20.09.2017 в 11:57)   письмо автору
 
   для: hitball   (20.09.2017 в 11:00)
 

Что носится то, причина в том, что не существует элемента под индексом 1 в массиве $myrow["text"], попытка обращения которому в 134 строке - $myrow["text"][1].

Проверяйте, что такое $myrow["text"]? С чего вдруг $myrow["text"][1]?

  Ответить  
 
 автор: hitball   (20.09.2017 в 13:15)   письмо автору
 
   для: confirm   (20.09.2017 в 11:57)
 

я думала, что мы так делили текст на несколько частей

<? 
$myrow
["text"] = explode('</p>'$myrow["text"]); 
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2)); 
?> 
<h1><?=$myrow["title"]?></h1>   
<div><img src='<?=$myrow["mini_img"]?>' /> 
<div > 
<?=implode('</p>'$myrow["text"][0])?> 
</p><script type="text/javascript"><!--  
google_ad_client = "...";  
/* pod_img */  
google_ad_slot = "...";  
google_ad_width = 125;  
google_ad_height = 125;  
//-->  
</script>  
<script type="text/javascript"  
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">  
</script> 
<?=implode('</p>'$myrow["text"][1])?> 
</p> 
</div></div>  
<p><?=$myrow["author"]?></p> 

  Ответить  
 
 автор: confirm   (20.09.2017 в 14:52)   письмо автору
 
   для: hitball   (20.09.2017 в 13:15)
 

Да, помню, речь была о разбиении текста по тегу параграфа. Но вы же пишите, что код строки 134, это:

<?=implode('</p>'$myrow["text"][1])?>


Где не разбиение, а обратная операция и вывод. Более того, если настройками подавлен вывод предупреждений, то интерпретатор примет значение несуществующей переменной равное null и в данном случае ничего не выведет.

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

Либо вы ошиблись строкой, либо массив $myrow["text"] имеет один элемент (согласно сообщению), а значит это

<?=implode('</p>', $myrow["text"][1])?>

нелогичный подход. Проанализируйте что получаете в $myrow["text"] простым выводом на экран.

  Ответить  
 
 автор: hitball   (20.09.2017 в 16:44)   письмо автору
 
   для: confirm   (20.09.2017 в 14:52)
 

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

  Ответить  
 
 автор: confirm   (20.09.2017 в 19:09)   письмо автору
 
   для: hitball   (20.09.2017 в 16:44)
 

Вы не смотрите на то, что на странице, вы проанализируйте, что получаете после разбиения массива на части (array_chunk) и у вас гарантировано нет элемента с индексом 1 в нем. А так как в логах, это не ошибки, тем более не фатальные, то что есть в этом массиве будет выедено, чего нет - нет. Вот вам и кажется, что все Ок, чего еще надо.

PHP Notice: Undefined offset: 1 in view_articles.php on line 134
PHP Примечание: неопределенное смещение: 1 в view_articles.php в строке 134
(то есть нет в указанном массиве элемента к которому ссылаются)

PHP Warning: implode(): Invalid arguments passed in /view_articles.php on line 134
PHP Warning: implode (): неверные аргументы, переданные в /view_articles.php в строке 134
(то есть функция implode ожидает массив, а ей передается иное)

Учитесь выявлять причины, и самые простейшие для этого элементы инструменты, это echo, print_r, var_dump "сомнительных" переменных.

  Ответить  
 
 автор: hitball   (24.02.2017 в 15:33)   письмо автору
 
   для: confirm   (29.03.2013 в 21:40)
 

confirm, огромное вам человеческое спасибо через четыре года! только сейчас заметила ваш ответ! Тогда так и не решила вопрос, а сегодня пришлось снова им занятся и единственное место где нашла ответ - это здесь! СПАСИБИЩЕ!!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования