MySQL / 17. Внедрение результатов запросов в веб-страницы

Представление результатов запроса в виде абзацев

Задача
Вы хотите представить результат запроса в виде простого текста.

Решение
Используйте для его отображения только теги абзаца HTML.

Обсуждение
Абзацы используются для вывода простого текста, не имеющего определенной структуры. В этом случае все, что вам нужно, – это извлечь отображаемый текст, конвертировать специальные символы в соответствующие HTML-конструкции и ограничить каждый абзац тегами <p> и </p>. Следующий пример показывает, как сформировать абзац для служебной страницы, включающей в себя текущее время и дату, версию сервера, имя клиента и имя текущей базы данных (если имеется). Эти значения получены таким запросом:

mysql> SELECT NOW(), VERSION(), USER(), DATABASE();

+-----------------------+-----------------+-----------------+----------------+
| NOW()                    | VERSION()      | USER()            | DATABASE() |
+-----------------------+-----------------+-----------------+----------------+
| 2002-05-18 11:33:12 | 4.0.2-alpha-log | paul@localhost | cookbook     |
+-----------------------+-----------------+-----------------+----------------+

Для Perl в модуле CGI.pm имеется функция p(), заключающая в теги абзаца передаваемую ей строку. Функция p() не занимается HTML-кодированием своего аргумента, поэтому вы должны сделать это самостоятельно, вызвав функцию escapeHTML():

($now, $version, $user, $db) =
$dbh->selectrow_array ("SELECT NOW(), VERSION(), USER(), DATABASE()");
$db = "NONE" unless defined ($db);
$para = <<EOF;
Local time on the MySQL server is $now.
The server version is $version.
The current user is $user.
The current database is $db.
EOF
print p (escapeHTML ($para));

В PHP можно вывести теги <p> и </p> в начале и конце перекодированного текста абзаца:

$query = "SELECT NOW(), VERSION(), USER(), DATABASE()";
$result_id = mysql_query ($query, $conn_id);
if ($result_id)
{
list ($now, $version, $user, $db) = mysql_fetch_row ($result_id);
mysql_free_result ($result_id);
if (!isset ($db))
$db = "NONE";
$para = "Local time on the MySQL server is $now."
. " The server version is $version."
. " The current user is $user."
. " The current database is $db.";
print ("<p>" . htmlspecialchars ($para) . "</p>\n");
}

Или можно после получения результата запроса начать вывод абзаца в режиме HTML, переключаясь затем между режимами:

<p>
Local time on the MySQL server is
<?php print (htmlspecialchars ($now)); ?>.
The server version is
<?php print (htmlspecialchars ($version)); ?>.
The current user is
<?php print (htmlspecialchars ($user)); ?>.
The current database is
<?php print (htmlspecialchars ($db)); ?>.
</p>

Чтобы вывести абзац в Python, сделайте так:

cursor = conn.cursor ()
cursor.execute ("SELECT NOW(), VERSION(), USER(), DATABASE()")
row = cursor.fetchone ()
if row is not None:
if row is None: # проверить имя БД
row = "NONE"
para = ("Local time on the MySQL server is %s." +
" The server version is %s." +
" The current user is %s." +
" The current database is %s.") % (row)
print "<p>" + cgi.escape (para, 1) + "</p>"
cursor.close ()
В JSP эту задачу можно решить так:
<sql:query var="rs" dataSource="${conn}">
SELECT NOW(), VERSION(), USER(), DATABASE()
</sql:query>
<c:set var="row" value="${rs.rowsByIndex[0]}" />
<c:set var="db" value="${row}" />
<c:if test="${empty db}">
<c:set var="db" value="NONE" /></c:if>
<p>
Local time on the server is <c:out value="${row[0]}" />.
The server version is <c:out value="${row}" />.
The current user is <c:out value="${row}" />.
The current database is <c:out value="${db}" />.
</p>

Сценарий JSP использует rowsByIndex, так что столбцы результирующего множества доступны по индексу.

Статьи по MySQL на эту тему:

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