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

Форум MySQL

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

 

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

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

тема: НЕ вытягивается текст из базы
 
 автор: Лена   (24.12.2007 в 13:22)   письмо автору
 
 

Есть вот такой скрипт, который должен вытянуть из базы заголовок+1 абзац:
<?php
mysql_connect('localhost', 'lena', '***') or die( 'Соединение не установлено' );
mysql_select_db('news') or die( 'База данных не выбрана' );
$sql = "SELECT `text` FROM `txt` WHERE id = 3";
if( !($result = mysql_query($sql)) )
{
die( 'Failure: ' . mysql_error() . ', File: ' . __FILE__ . ', Line: ' . __LINE__ );
}

//вернуть количество рядов результатов запроса

if( mysql_num_rows($result) < 1 )
{
die( 'В таблице "txt" нет ни одной записи' );
}

if( $text == '' )
{
die( 'Текст отсутствует' );
}

$text = mysql_result($result, 0);

$text = htmlspecialchars( $text );

$text = nl2br( $text );

$text = explode('<br />', $text);

echo $text[0];
?>
При запуске скрипта пишет: Текст отсутствует, хотя текс в базе есть. Почему так получается? Заранее всем спасибо

   
 
 автор: sim5   (24.12.2007 в 13:30)   письмо автору
 
   для: Лена   (24.12.2007 в 13:22)
 

Вы определяете значение переменной $text после того, как проверяете ее значение.

<?
if( mysql_num_rows($result) < ) die ( 'В таблице "txt" нет ни одной записи' );
else {
//а вот здесь зачем проверять это, если не будет записей? 
if( $text == '' ) { die( 'Текст отсутствует' ); }
//но если проверять, то после этого:
$text mysql_result($result0);

$text htmlspecialchars$text );
$text nl2br$text );
$text explode('<br />'$text);
echo 
$text[0];
}
?>

   
 
 автор: Лена   (24.12.2007 в 14:05)   письмо автору
 
   для: sim5   (24.12.2007 в 13:30)
 

Сделала вот так:
<?php
mysql_connect('localhost', 'lena', 'alena') or die( 'Соединение не установлено' );
mysql_select_db('news') or die( 'База данных не выбрана' );
$sql = "SELECT `text` FROM `txt` WHERE id = 4";
if( !($result = mysql_query($sql)) )
{
die( 'Failure: ' . mysql_error() . ', File: ' . __FILE__ . ', Line: ' . __LINE__ );
}

if( mysql_num_rows($result) < 1 )
{
die( 'В таблице "txt" нет ни одной записи' );
}

$text = mysql_result($result, 0);

if($text != '' )
{

$text = htmlspecialchars( $text );

$text = nl2br( $text );

$text = explode('<br />', $text);

echo $text[0];

}
else {die( 'Текст отсутствует' );}

?>
Выводится один заголовок, без первого абзаца. Куда ж он подевался?

   
 
 автор: sim5   (24.12.2007 в 14:21)   письмо автору
 
   для: Лена   (24.12.2007 в 14:05)
 

Если вы приводите РНР-код, то вставляйте его в обрамление [соde][/соde] - для этого щелкните этот тег (ссылку) выше над полем ввода сообщения. Трудно читать код без подсветки.
А заголовок текста также в этом файле у вас, и также разделен тегом <br />? Если так, то echo $text[0]; вам и выдаст только его, а вот echo $text[1];, должен выдать первый абзац текста.

   
 
 автор: Лена   (24.12.2007 в 14:31)   письмо автору
 
   для: sim5   (24.12.2007 в 14:21)
 

Получилось, но не так, как хотела. Весь текст вышел на одной строке:

НЕ КУПИТЕСЬ НА РАСПРОДАЖУ Часто магазины прибегают ко всяким уловкам, чтобы избавиться от неходового товара. Одной из таких уловок и является хорошо знакомая нам распродажа. Раскроем вам несколько секретов магазинных хитростей, чтобы вы смогли обуздать свои хватательные рефлексы.

А мне нужно, чтобы заголовок отделялся от 1 абзаца переводом строки. И как в этом случае применить к заголовку и тексту стили? Можно ли использовать CSS? Чтобы текст выводился из базы сразу, допустим, заголовок - красного цвета, текст черного, меньше шрифт и т.д.?

   
 
 автор: sim5   (24.12.2007 в 15:01)   письмо автору
 
   для: Лена   (24.12.2007 в 14:31)
 

Так вы все это затеваете ради того, чтобы "разукрасить" страницу? А не лучше ли готовую, оформленную HTML-страницу держать в базе? Естественно используя стили. Причем стиль будет подключаться в другом месте, там где формируется шапка страницы, в базе же хранить то, что распологается между <BODY></BODY>.

   
 
 автор: Лена   (24.12.2007 в 15:09)   письмо автору
 
   для: sim5   (24.12.2007 в 15:01)
 

Конкретно объясняю, для чего я это делаю.
Есть у меня меню рубрик. Я хочу, чтобы при нажатии на рубрику, в центре появлялись заголовки статей (их может быть сколько угодно), с 1 абзацем каждый, возле заголовка - картинка. Все это (заголовок, 1 абзац) - в разных стилях. Разве можно все это держать в базе? А как тогда быть с внешним листом стилей? Если на страницах, которые у меня будут в базе, есть ссылки на внешний лист, где будет находиться сам внешний лист? Тоже в базе?
Честно, не совсем поняла ваш совет.

   
 
 автор: sim5   (24.12.2007 в 15:28)   письмо автору
 
   для: Лена   (24.12.2007 в 15:09)
 

Это называется не внешний лист, а "Каскадная таблица стилей", и она может быть во внешнем подключаемом файле. Вообще же, эта таблица и служит для того, чтобы вы в одном файле определили стиль своих рубрик - для всех один, что на много удобней, так как всегда легче исправить в одном месте, чем производить изменения в нескольких файлах. Если вы будете делать так, как хотите, то вам нужно "прогонять" полученный массив $text в цикле, прописывать каждому абзацу HTML теги, определять для них классы или id, а именно они будут служить указанием какой стиль элементу определен, ну и многое другое. Вы думаете, что это будет разумней?
Ничего страшного нет в том, если ваша страница (тело ее) будет в базе оформленной. Первый ее абзац это параграф, заключенный в соответсвующие теги - <P class="myclass">Здесь текст</P>, а потом изображение <img src="path/name.ext"> и т.д... "Вытянуть" первый абзац можно будет регулярным выражением. Таблица стилей будет подключаться в шапке страницы между тегами <HEAD></HEAD>, здесь же будет помещен и заголовок страницы, который также можно добавить и в тело страницы, но его слудует держать отдельно от основного текста, в другом поле таблицы.
Если вы хотите при выводе абзацев разделить их визуально, то совсем не обязательно это делать с помощью "раскраски" шрифта или иного его стиля, хотя это сделать тоже можно (теми же регулярными выражениями), можно будет просто чередовать цвет фона параграфов. Тут богатое поле для фантазий.

   
 
 автор: Лена   (24.12.2007 в 16:40)   письмо автору
 
   для: sim5   (24.12.2007 в 15:28)
 

Каскадную таблицу я уже подключила между тегами <HEAD></HEAD>. Попробую все-таки два варианта - и через цикл и чтобы помещать в базу оформленную страницу. Результат покажу уже завтра. Во втором случае как можно при помощи регулярного выражения вытянуть первый абзац текста? И как можно с помощью регулярных выражений чередовать цвета? Признаться, с регулярными выражениями я еще знакома мало, подскажите, пожалуйста.

   
 
 автор: Trianon   (24.12.2007 в 16:51)   письмо автору
 
   для: Лена   (24.12.2007 в 16:40)
 

Лучше всё ж не полениться и завести в таблице столбик для отдельной сущности.

   
 
 автор: sim5   (24.12.2007 в 17:35)   письмо автору
 
   для: Лена   (24.12.2007 в 16:40)
 

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

   
 
 автор: Лена   (25.12.2007 в 10:40)   письмо автору
 
   для: sim5   (24.12.2007 в 17:35)
 

Попробовала создать в таблице еще одно поле - поле заголовка head
Теперь я могу вытянуть из базы только заголовок:

<?php
mysql_connect
('localhost''lena''alena')
 or die( 
'Соединение не установлено' );
mysql_select_db('news'
or die( 
'База данных не выбрана' );
$sql "SELECT `head` FROM `txt` 
WHERE id = 4"
;
if( !(
$result mysql_query($sql)) )
{
 die( 
'Failure: ' mysql_error() . 
', File: ' __FILE__ ', Line: ' 
__LINE__ );
}
$text mysql_result($result0);
print 
$text;
?>


В таблице в поле head написала так:
<P id="head1" ">НЕ КУПИТЕСЬ НА РАСПРОДАЖУ</P>
В файле между <HEAD> и </HEAD>прописала вот что:
#head1 {
font-family : "Courier New";
color="blue";
font-size : "larger";
}
Но заголовок вытягивается без нужного цвета и размера. Почему?

И как теперь с помощью регулярного выражения вытянуть 1 абзац? В таблице я оформила его как

<P class=".hypertext ">Часто магазины 
прибегают ко всяким уловкам, чтобы 
избавиться от неходового товара. Одной из 
таких уловок и является хорошо знакомая 
нам распродажа. Раскроем вам несколько 
секретов магазинных хитростей, чтобы вы 
смогли обуздать свои хватательные рефлексы.
<img src="./resize-mims05-1-_tuning_191.jpg" 
width=150px height=100px alt="Авто" 
align="left"></P>

В каскадной таблице написала:
.hypertext {
text-align : justify;
background : White;
font-family : "Times New Roman";
font-size : medium;
letter-spacing : normal;
line-height : normal;
text-indent : 5px;
color : Olive;
}
Как одновременно вытянуть и заголовок, и 1 абзац?

   
 
 автор: sim5   (25.12.2007 в 11:53)   письмо автору
 
   для: Лена   (25.12.2007 в 10:40)
 

Ошибка №1. Если у вас встроенный стиль, то его надо обрамлять в теги <STYLE>:

<STYLE TYPE="text/css">
#head1 {
  font-family : "Courier New";
  color="blue";
  font-size : "larger";
}

.hypertext {
  text-align : justify;
  background : White;
  font-family : "Times New Roman";
  font-size : medium;
  letter-spacing : normal;
  line-height : normal;
  text-indent : 5px;
  color : Olive;
}
</STYLE>

Ошибка №2. Имя класса hypertext в параграфе должно быть прописано без точки. Эта точка приписывается в таблице стилей и по просту понимается как P.hypertext.

Если таблица стилей находится в отдельном подключаемом файле, то в этом файле прописаны только стили, без обрамления тегами <STYLE></STYLE>. В этом случае в заголовке страницы между тегами HEAD, нужно указать (подключить) файл стилей, так:
<link rel="stylesheet" media="all" href="path/file.css" type="text/css">
где path/file.css путь и имя файла стилей. Файлы стилей имеют расширение CSS.

Чтобы получить и заголовок и текст интересующей вас записи, то нужно указывать соответсвующие поля таблицы в запросе, например:
$sql = "SELECT `field1`, `field2`, `field2` FROM `txt` WHERE id = 4";
или
SELECT * ....
В общем вам надо читать документацию MySQL.

У вас каждый абзац заканчивается тегом </P>, и в абзаце же находится изображение, поэтому лучше (это быстрее), воспользоваться explode('</P>',$text); Берете первый элемент полученного массива, выводите его с добавлением в конце </P>.

   
 
 автор: Лена   (25.12.2007 в 14:54)   письмо автору
 
   для: sim5   (25.12.2007 в 11:53)
 

Не получается. Выводится весь текст+заголовок:

<?php
mysql_connect
('localhost''lena''alena') or die( 'Соединение не установлено' );
mysql_select_db('news') or die( 'База данных не выбрана' );
$sql "SELECT `head`, `text` FROM `txt` WHERE id = 4";
if( !(
$result mysql_query($sql)) )
{
die( 
'Failure: ' mysql_error() . ', File: ' __FILE__ ', Line: ' __LINE__ );
}

if(
mysql_num_rows($result) < )
{
die( 
'В таблице "txt" нет ни одной записи' );
}

$text explode('</p />'$text);
while(
$text=mysql_fetch_row($result)) {
echo 
$text[0], $text[1];
}

?>


А нужно заголовок+1 абзац...

   
 
 автор: sim5   (25.12.2007 в 16:06)   письмо автору
 
   для: Лена   (25.12.2007 в 14:54)
 

Вы опять пытаетесь сделать все наоборот - переменную, которую еще не определили, разбиваете на массив:
$text = explode('</p />', $text);
причем не правильно, закрывающий тег параграфа пишется так </p>, а потом только ее определяете:
$text=mysql_fetch_row($result).
Вы запросом получили одну строку записи, и цикла не требуется.

<?
if(mysql_num_rows($result) < ) die('В таблице "txt" нет ни одной записи');
else {
  
//получаем запись - читать о mysql_fetch_row
  
$text mysql_fetch_row($result);
  
//получаем заголовок рубрики
  //если его требуется вставить также в заголовок страницы
  //в тег <TITLE>$title</TITLE>, например, то сохраним его
  //в переменную $title для подключаемого скрипта шапки страницы
  
$title $text[0];
  
//выводим заголовок на страницу, например в теге H1  
  
print "<H1>".$title."</H1>";
  
//получаем и разбиваем текст статьи на абзацы
  //следить за тегом параграфа, он должен быть прописан
  //в верхнем регистре - </P> 
  
$text explode("</P>"$text[1]);
  
//после explode, закрывающий тег параграфа </P> теряется
  //восстановим его, и теперь $text уже не массив
  
$text $text[0]."</P>";
  
//выводим первый абзац рубрики на страницу
  
print $text;
  
//======
  //если, например, параграф рубрик имеет имя класса myclass
  //и при получении нескольких  записей (страниц)
  //теперь уже в цикле, пулучив текст первого абзаца,
  //с помощью str_replace меняем имя класса каждую
  //четную итерацию цикла на myclass2  
  
$newtext str_replace("myclass""myclass2"$text);
  
//а нечетной не трогаем,
  //тогда, если для первого класса шрифт, например, черный,
  //а для второго красный, то при выводе они будут черодоваться  
  
print $newtext;
}
?>

   
 
 автор: Лена   (26.12.2007 в 13:55)   письмо автору
 
   для: sim5   (25.12.2007 в 16:06)
 

Не понятна строка
 $text = $text[0]."</P>"; 

из вышеприведенного кода. Почему $text[0], если это заголовок, ведь сам текст статьи у нас в $text[1] и делили мы на абзацы $text[1], значит, восстановить тэг </P> нужно в $text[1]?
Подскажите, как оформляется четная и нечетная итерация цикла. Приведите, пожалуйста, только шаблон, код я хочу сама попробовать написать

   
 
 автор: sim5   (26.12.2007 в 15:31)   письмо автору
 
   для: Лена   (26.12.2007 в 13:55)
 

Допустим, у вас есть индексная страница, и она обрабатывает и описывает код только тот, что будет помещен в результате между тегами <BODY></BODY> (включая и их, может быть). А вот шапка страницы у вас формируется, например, скриптом head.php, и в этом скрипте у вас прописано (к примеру):

<?
print "<HEAD><TITLE>$head<TITLE>..."// и прочее
//этот файл вы подключаете к индексной странице
include("head.php");
//по умолчанию у вас заголовок определен как
$head "Мой сайт";
//а вот после того как вы будете делать запросы к базе
//и получать заголовки запрашиваемых страниц
//заголовок страницы будет изменяться
?>

Вы в таблице держите заголовок страницы и ее текст в отдельных полях, а получаете их сразу - и то, и другое одной функцией, присваивая результат переменной $text:

<?
$text 
mysql_fetch_row($result);
?>

Я вам давал ссылку, где можно читать и изучать MySQL, и если вы читали, то должны знать, что функция mysql_fetch_row() извлекает один ряд данных из результата, ассоциированного со специфицированным идентификатором результата. Ряд возвращается как массив. Каждый результирующий столбец хранится как смещение массива, начиная со смещения 0.
Поэтому $textх[0] будет содержать значение первого поля таблицы которое указано в запросе, $textх[1] второе и т.д., если полей больше. У вас первым полем в запросе стоит заголовок страницы, потом текст, поэтому $textх[0] вернет вам заголовок текста. Далее это значение (для примера), указывается переменной $head для включения ее в head.php и вывода на странице.
Затем вы получаете текст ($textх[1]), абзацы которого у вас заключены в теги прагарафа <P></P>. Вам уже более не нужен первоначальный массив $textх (вы забрали из него значение заголовка), поэтому, этому значению вы присваиваете новый массив, который получается в результате разбиения $textх[1] функцией explode() по разделителю </P>. После этого, $textх[0] будет содержать текст первого абзаца на странице, но без закрывающего тега </P>, так как он вырезается в результате работы функции explode(). А так как вам более не нужен массив текста, а его первое значение, то мы и использовали переменную $text, просто переназначив ее значение, добавив недостающий тег </P>:
$text = $text[0]."</P>";
Конечно, если эта переменная будет требоваться, то следует использовать другие переменные, или просто в конструкции вывода производить операции, не присваивая их результата какой либо переменной.
Четное это 0, 2, 4... нечентное 1,3, 5... Если вы проходите цикл, например, от 0 до 10, то можете узнать какова у вас итерация в данный момент. Например в цикле:
for ($i=0; $i<10; $i++) можно проверять значение $i либо делив ее по модулю, либо логической операцией И, результат которой вам и будет указывать четный или нечетный шаг на данный момент у цикла.

   
 
 автор: Лена   (27.12.2007 в 11:26)   письмо автору
 
   для: sim5   (26.12.2007 в 15:31)
 

В код добавила:


for ($i=0; $i<10; $i++):
    if($i%2==0):
    $newtext = str_replace("myclass", "myclass2", $text);
    endif;
endfor;
  print $newtext;


В каскадную таблицу стилей style.css добавила:

.myclass {color : Yellow;}
.myclass2 {color : #ADFF2F;}


Подключила style.css в index.php:

<link rel="stylesheet" href="style.css" type="text/css">

Выводится не в цвете, вот что появляется на странице:
<P id="head1" ">НЕ КУПИТЕСЬ НА РАСПРОДАЖУ

А дальше - 2 раза текст первого абзаца, без картинки, хотя у меня в базе прописано:
<img src="./resize-mims05-1-_tuning_191.jpg" width=150px height=100px alt="Авто" align="left">
Почему не получается?

   
 
 автор: sim5   (27.12.2007 в 12:19)   письмо автору
 
   для: Лена   (27.12.2007 в 11:26)
 

Вы где такой синтаксис цикла FOR увидели? В ваших примерах вы получаете одну запись из таблицы, и из полученного текста берете первый абзац, потому выводить собственно в цикле нечего. Но если выводить каждый абзац, разделяя его стилями, то простой пример:

<?
//это, например, ваш HTML текст
$text '<P CLASS="myclass">Text1 <img src="image1.jpg" /></P>
<P CLASS="myclass">Text2 <img src="image2.jpg" /></P>
<P CLASS="myclass">Text3 <img src="image3.jpg" /></P>
<P CLASS="myclass">Text4 <img src="image4.jpg" /></P>'
;
//разбиваем его на массив по разделителю </P>
$text explode('</P>'$text);
//посмотрим что мы получили в масиив
print_r($text);
//заметьте, что закрывающих тегов параграфа </P>
//элементы массива не содержат
//он вырезан функцией explode, как собственно
//был бы вырезан любой другой указанный разделитель
//а так же обратите внимание,  
//что последний элемент массива пустой
//подумайте почему так получается
//просмотрели и удалили print_r($text);
//а далее вывод всего

//для простоты встраиваем стиль в страницу
print '<STYLE TYPE="text/css">
.myclass {color : #669900;} 
.myclass2 {color : #FF3300;}
</STYLE>'
;

//выводим в цикле абзацы
//размер цикла определяется 
//числом элементов массива $text
//с вычетом 1, так как последний
//элемент массива пустой и нам не нужен 
for ($i=0$i<count($text)-1$i++) {
  if (
$i 1//если итерация цикла нечетная
  //выводим класс параграфа по умолчанию
  
print $text[$i]."</P>"//добавляя закрывающий тег 
  
else //иначе  
  //заменяем имя класса параграфа   
  
print str_replace("myclass""myclass2"$text[$i])."</P>";
}
?>

Укажите любую произвольную картинку и посмотрите, все будет работать. Закрывающий тег параграфа </P> можно и не выводить, но это есть не хорошо.

PS. Вы много не знаете, вам видимо надо с более простого начинать.

   
 
 автор: Лена   (27.12.2007 в 14:19)   письмо автору
 
   для: sim5   (27.12.2007 в 12:19)
 

Спасибо, все получилось.
Согласна, что многого не знаю, но желание развиваться не пропало. Начинать с более простого - с чего? С учебников? Как мне показалось, основной недостаток учебников по программированию - они не имеют комплексного прикладного характера, то есть дается отдельный учебник по РНР, по MySQL, но ведь на странице эти языки могут сочетаться в разных вариациях, почему не существует учебника, например, описывающего пошагово, как создать динамичный сайт с нуля, какими средствами это сделать и почему не приводятся оптимальные варианты решений? Поэтому и бьюсь я, как рыба об лед - много читала, разбирала скрипты, но как дошла до конкретного (создание сайта), сразу растерялась. Может, вы подскажете, где взять дельный учебник? Я имею ввиду учебник - использование РНР с конкретными примерами - например, как было у меня (вытянуть один абзац из базы, разукрасить текст и т.д.)
Поэтому и пришлось мне пойти на форум, где проблема решается с ходу: написал-сделал-получилось. Не получилось - найдутся верные друзья-товарищи :-)))
Сложно это все объяснить...
Честно говоря, удивляюсь вашему терпению и выдержке, другой бы на вашем месте отмазался бы какими-то хитроумными фразами и я бы осталась с тем, чем была.
Еще раз огромное человеческое спасибо.

   
 
 автор: sim5   (27.12.2007 в 14:55)   письмо автору
 
   для: Лена   (27.12.2007 в 14:19)
 

В шапке форума есть ссылки на книги, авторами которых явлются создатели этого форума: М. Кузнецов, И. Симдянов. Среди этих книг, есть и книга в которой описан пример создания сайта. Книги имеют вложенный CD c примерами. Но ведь каждую идею, которая вас может посетить, в книге не опишут, потому как идей (тонкостей) гораздо больше чем функций в языке. :) Главное ведь не выучить наизусть функции, а представлять способы решения ваших задач с помощью функций и конструкций языка.

   
 
 автор: Faraon   (24.12.2007 в 15:22)   письмо автору
 
   для: Лена   (24.12.2007 в 14:05)
 

>Выводится один заголовок, без первого абзаца. Куда ж он подевался?

Как я понял до первого <br> это заголовок?
Так он один и будет выводиться потому-что Вы выводите только первый элемент массива
$text[0], коим он и является

   
Rambler's Top100
вверх

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