#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>';
}
Обратите внимание, что обычно рекомендуется отделять извлечение данных от отображения (обеспечивает большую гибкость).