Как применить CSS к динамически генерируемым результатам базы данных PHP

#php #mysql #css

#php #mysql #css

Вопрос:

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

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

Я могу сделать это с фиксированным текстом в HTML с <p> тегами или <br> тегами, но как я могу сделать это с динамически генерируемыми результатами, когда я понятия не имею, какой длины будет блок текста? Я совсем новичок в PHP. Любые предложения приветствуются.

Вот код:

 <?php
$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="db"; // Database name 
$tbl_name="sentence"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

$sn=$_POST['numberofsentences'];


$query="SELECT line FROM `sentence` ORDER BY rand() LIMIT $sn";
$result = mysql_query($query);

while ( $row = mysql_fetch_array($result) ) {
// do something with $row. The following echos the results and adds a space after each sentence.
echo $row['line'], "amp;nbsp";
}

// Close the database connection
mysql_close();

 ?>
 

Комментарии:

1. Одним из быстрых и простых способов было бы установить статическое количество предложений в абзаце, например, 4 или 5, и использовать это в своем цикле следующим образом: $count = 0; while ( $row = mysql_fetch_array($result) ) { // сделайте что-нибудь с $row . Следующее повторяет результаты и добавляет пробел после каждого предложения. echo $row[‘line’], «amp;nbsp; if ($count <= 4) { echo'<br />’; $count = 0; } else { $count ; } }

2. Привет. Я попробовал это, и я получаю каждое предложение (результат базы данных), отображаемое в отдельной строке. Мне нужно, чтобы они группировались в 4 или 5 предложений на абзац. Спасибо

3. Извините, я имею в виду поставить: if ($ count > = 4) . Попробуйте это! Здесь я вставлю это в формат ответа.

4. Ты гений! Это именно то, чего я хотел. Знаете ли вы, как я могу добавить три или четыре пробела перед первым предложением в каждом абзаце (например, отступ?) Спасибо.

5. ХЕхе, никаких проблем. Проверьте ответ, который я опубликовал… Теперь между каждым абзацем есть два тега ‘<br />’.

Ответ №1:

К сожалению, единственное, что вы можете сделать, это использовать HTML (и, необязательно, CSS) для этого.

Также у вас есть некоторые проблемы с вашим примером кода. ‘amp; nbsp’ должен иметь a ; в конце. Я предполагаю, что вы имеете mysql_fetch_assoc() в виду, а не mysql_fetch_array() поскольку вы ссылаетесь на $row массив со строковым индексом, а не числовым?

 $results = 0;
$max_results = 26;

while ($row = mysql_fetch_assoc($result))
{
  $results  ;
  echo $row['line'] . "amp;nbsp;";

  if ($results % max_results == 0)
    echo "<br /><br />";
}
 

Это выведет до 25 результатов, разделенных пробелами, в строке. Это очень грубо, но будет работать в браузере. В идеале вы должны добавить поддерживающие HTML-теги, такие как html, body и т. Д…

Кроме того, в качестве дополнительного примечания: я понимаю, что вы все еще учитесь, но, пожалуйста, пожалуйста, помните, что всякий раз, когда вы принимаете какие-либо внешние входные данные в своих строках SQL, вы должны сначала их очистить. Что, если $_POST['numberofsentences'] было равно 0;DROP DATABASE db; ?

Если вы ожидаете, что переменная POST будет целым числом, используйте mysql_real_escape_string() followed by intval() .


Редактировать: я не хотел удалять ошибку, которую я допустил в своем сообщении о точке и запятой, поскольку на нее ссылаются в комментариях ниже, но, похоже, это может вызвать некоторую путаницу, если я оставлю ее здесь. Вы можете echo string1 . string2 или echo string1, string2 . Оба они дают одинаковый результат, но работают совершенно по-разному под капотом. Чтобы увидеть исходное сообщение, просто посмотрите историю.

Комментарии:

1. echo $foo , $bar; отлично работает и быстрее, чем echo $foo . $bar;

2. Спасибо за это. Обязательно протестируйте против SQL-инъекций. Кроме того, почему мне нужно ставить точку вместо запятой. Он работает с точкой. Я понимаю, что это, вероятно, очень наивный вопрос. та

3. @user1022772 Они оба работают. Точка объединит несколько строк в 1, а затем echo() функция напечатает единственную строку. Через запятую вы передаете несколько параметров echo() , которые затем перебирают параметры и печатают их последовательно. Я всегда использовал точку, но, как прокомментировал AlienWebuy, запятая тоже подходит и, по-видимому, быстрее. На самом деле, я не думаю, что запятая и точка имеют значительную разницу в производительности для большинства скромных приложений PHP. Используйте то, что вам удобнее.

4. @Ozzah На самом деле, echo — это не функция, а языковая конструкция. Крайне не рекомендуется использовать круглые скобки с echo. (например, echo(‘string’); на самом деле должно быть echo ‘string’;) =)

5. Спасибо за вашу помощь в этом. Это делает все намного понятнее.

Ответ №2:

Одним из быстрых и простых способов было бы установить статическое количество предложений в абзаце, например, 4 или 5, и использовать это в своем цикле следующим образом:

 $count = 0; 
while ($row = mysql_fetch_array($result)) { 
    // do something with $row. The following echos the results and adds a space after each sentence. 
    echo $row['line'], "amp;nbsp"; 
    if ($count >= 4) { 
        echo '<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;'; 
        $count = 0; 
    } else { 
        $count  ; 
    } 
}
 

Ответ №3:

Попробуйте это:

 <?php
$host     = "localhost"; // Host name 
$username = "";          // Mysql username 
$password = "";          // Mysql password 
$db_name  = "db";        // Database name 
$tbl_name = "sentence";  // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

$sn           = $_POST['numberofsentences'];
$s_count_orig = $s_count = 1; // Sentence counter
$p_count      = 1;            // Paragraph counter
$per_para     = 4;            // 4 sentences per paragraph
$paras        = array();      // Array to hold the paragraphs
$para         = array();      // Array to hold the sentences

$query  = "SELECT line FROM `sentence` ORDER BY rand() LIMIT $sn";
$result = mysql_query($query);

while ( $row = mysql_fetch_array($result) ) {
    // do something with $row. The following echos the results and adds a space after each sentence.

    // If there is room in the paragraph array for a sentence...
    if($s_count <= $per_para) {

        // Add the sentence to the array
        $para[$p_count] = $row['line'];

        // Next sentence
        $s_count  ;
    }
    else {
        // We have a full paragraph, add it to our master array
        $paras[] = $para[$p_count];

        // Next paragraph
        $p_count  ;

        // Reset sentence counter
        $s_count = $s_count_orig;
    }
}

// Iterate our master array of paragraphs
foreach($paras as $p){

    // Echo each paragraph, and each sentence in each paragraph separated by two spaces
    echo '<p>' . implode('amp;nbsp;amp;nbsp;',$p) . '</p>';
}

// Close the database connection
mysql_close();

 ?>
 

Комментарии:

1. Привет. Я попробовал это и получил сообщение об ошибке: Предупреждение: implode() [function.implode]: переданы недопустимые аргументы.

Ответ №4:

Непроверенный

 define('NB_SENTENCE_PER_PARAGRAPH', 5);

// after the query...

$paragraphs = array();
$i = 0;

// prepare data

while ($row = mysql_fetch_array($result))
{
  $index = floor(%i / NB_SENTENCE_PER_PARAGRAPH);

  if (!isset($paragraphs[$index]))
    $paragraphs[$index] = array();

  $paragraphs[$index][] = $row['line'];
  $i  ;
}

// display

foreach ($paragraphs as $sentences)
{
  echo '<p>'.implode('amp;nbsp;', $sentences).'</p>';
}
 

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