Вставка html-кода в таблицу mysql
Я использую joomla для управления веб-сайтом... и я разрабатываю отдельное приложение php, которое будет вставлять и изменять данные в таблицы, которые используются joomla для хранения html веб-страниц, которые он динамически создает...
Как это работает, я использую компонент joomla для создания контента, а html-код этих статей хранится в поле в таблице, скажем, content_table, joomla.. Этот HTML-код позже извлекается для создания части веб-страницу.
Я хочу сделать то же самое с моим автономным приложением... добавьте код html к файлу в content_table, который позже может быть получен joomla для создания части страницы.
Проблема заключается в следующем: в коде html, естественно, есть много одиночных и двойных кавычек, и это создает проблему при вставке в базу данных. Я пробовал mysql_escape_string() и все еще получаю синтаксические ошибки.
Я могу использовать addslashes(), но поскольку joomla сам извлекает код позже, невозможно использовать stripslashes() при получении позже.
В любом случае я могу добавить html-код в поле таблицы...
Спасибо за ваши предложения...!!
Изменить: после добавления mysql_escape_string() я получаю
Error adding details. Reason : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'fulltext = '\n
Это мой запрос:
UPDATE $jos_content
SET introtext = '$intro_code',
fulltext = '$article_code'
WHERE id = '$article_id'";
Входная строка выглядит следующим образом:
$article_code = '<hr id="system-readmore" />
<center>{loadposition user50}</center>
<p style="text-align: center;">
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
</span>
</span>
</b>
</i>
</span>
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
<?php echo $title; ?>
</span>
</span>
</b>
</i>
</span>
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
<br />
</span>
</span>
</b>
</i>
</span>
</p>
<p style="text-align: center;">
<img height="269" width="515" border="3"
title="<?php echo $title; ?>"
alt=" <?php echo $title; ?>"
src="<?php echo $article_image;?>"
</p>
<p>
<span style="font-size: small;">
<span style="font-family: Arial;">
<span style="color: rgb(153, 204, 255);">
<p style="margin-top: 2px; margin-bottom: 2px; margin-left: 120px; text-align: left;">
<i>
<span style="color: rgb(0, 255, 0);">
<strong>
Cast :
</strong>
<b>
</b>
</span>
</i>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $cast; ?>
</b>
</span>
<i>
<span style="color: rgb(0, 255, 255);">
<b>
<br />
</b>
</span>
</i>
<span style="font-family: Arial;">
<span style="font-size: small;">
<span style="color: rgb(153, 204, 255);">
</span>
</span>
<span style="color: rgb(0, 255, 0);">
<i>
<strong>
Direction
</strong>
</i>
<strong>
:
</strong>
<b>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<span class="href"
id="ctl00_ContentPlaceHolderMainContent_FormView1_Director">
<?php echo $director; ?>
</span>
</b>
</span>
</span>
<span style="font-family: Arial;">
<br />
<span style="color: rgb(0, 255, 0);">
<i>
<strong>
Production
</strong>
</i>
<strong>
:
</strong>
<b>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $direction; ?>
</b>
</span>
<span style="color: rgb(255, 102, 0);">
<i>
<b>
<br />
</b>
</i>
</span>
<span style="font-family: Arial;">
<span style="color: rgb(0, 255, 0);">
<span style="font-family: Arial;">
<span style="font-size: small;">
<i>
<strong>
Music
</strong>
</i>
<strong>
:
</strong>
</span>
</span>
</span>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<i>
</i>
<?php echo $music; ?>
<i>
<br />
<span style="color: rgb(0, 255, 0);">
Lyrics
</span>
</i>
<span style="color: rgb(0, 255, 0);">
:
</span>
<i>
</i>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $lyrics; ?>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<i>
<br />
</i>
<span style="color: rgb(0, 255, 0);">
<i>
Year
</i>
:
</span>
<?php echo $year; ?>
</b>
</span>
</span>
<i>
<span style="color: rgb(0, 255, 255);">
<b>
</b>
</span>
</i>
</p>
</span>
</span>
</span>
</p>
<p>
<left>
{loadposition user14}
</left>
</p>
<div style="text-align: center;">
<p>
<i>
<span style="font-family: Arial;">
<b>
<span style="font-size: medium;">
<span style="color: rgb(51, 255, 255);">
Click
<img src="images/stories/Play button1.png"
alt="alt" />
in the Playlist to Download Songs
</span>
</span>
</b>
</span>
</i>
</p>
</div>
<table border="0" align="center">
<tbody>
<tr>
<td>
<h4 style="text-align: center;">
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
High Bandwidth Users
</b>
</b>
</span>
</i>
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
</b>
</b>
</span>
</i>
<span style="color: rgb(102, 255, 0);">
<b>
</b>
</span>
</h4>
</td>
<td>
<h4 style="text-align: center;">
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
Low Bandwidth Users
</b>
</b>
</span>
</i>
<span style="color: rgb(102, 255, 0);">
<b>
<br />
</b>
</span>
</h4>
</td>
</tr>
<tr>
<td>
{auto width="235" displayheight="0" height="225"} <?php echo $hqList; ?> {/auto}
</td>
<td>
{auto width="235" displayheight="0" height="225"}<?php echo $lqList; ?>{/auto}
</td>
</tr>
</tbody>
</table>
<center>
{loadposition user50}
</center>';
Ответы
Ответ 1
Ну..Добавлено это.. Оказывается, проблема была в конце концов не с функцией экранирования...
Проверьте запрос:
UPDATE $jos_content
SET introtext = '$intro_code',
fulltext = '$article_code'
WHERE id = '$article_id'";
Вы можете увидеть поле "полный текст"... По-видимому, слово "полный текст" является ключевым словом mysql... Если быть точным, это тип поля, например TEXT, INT, MEDIUMTEXT и т.д.
Я изменил запрос на этот
"UPDATE $jos_content
SET $jos_content.introtext = '$intro_code',
$jos_content.fulltext = '$article_code'
WHERE $jos_content.id = '$article_id'";
И вуаля...!!!!
Ответ 2
Я предпочитаю преобразовывать код в обычную строку перед вставкой в базу данных. Я думаю, это самый безопасный сценарий. Рассмотрите возможность использования этого кода:
$article_code = base64_encode($article_code);
/* insert to database */
Итак, когда вы хотите использовать этот код обратно, просто декодируйте с помощью base64_decode. Я предлагаю вам использовать тип данных "text" для сохранения $article_code, а не "varchar".
Ответ 3
Вам не нужны косые черты. Единственное, что вызовет проблему при нормальных вставках, - это кавычки, а mysql_escape_string()
должно обрабатывать это, кроме проблем с кодировкой. Попробуйте mysql_real_escape_string()
.
Кроме того, обратите внимание, что сохранение необработанного HTML-кода в базе данных может привести к проблемам безопасности. Вместо этого используйте вместо этого что-то вроде bbcode или markdown.
Ответ 4
Это лучший способ найти addslashes()
$article_code = addslashes($article_code);
UPDATE $jos_content
SET introtext = '$intro_code',
fulltext = '$article_code'
WHERE id = '$article_id'";
Ответ 5
Просто чтобы подтвердить, ваш запрос выглядит так:
$query = '
UPDATE "'.mysql_real_escape_string ($jos_content).'"
SET introtext = "'.mysql_real_escape_string ($intro_code).'",
fulltext = "'.mysql_real_escape_string ($article_code).'"
WHERE id = "'.mysql_real_escape_string ($article_id).'"
";
Ответ 6
fulltext
- ключевое слово predefine mysql. Пожалуйста, используйте Острый (`) или одинарный кавычек (')
Вот код -
UPDATE $jos_content
SET `introtext` = '$intro_code',
`fulltext` = '$article_code'
WHERE `id` = '$article_id'";
Ответ 7
У меня была та же проблема, я исправил ее с помощью регулярных выражений.
Вы можете использовать что-то вроде этого: $target = '{~p class={{q}}important-text{{q}}~}Some text here {~/p~}';
а затем используйте функцию preg_replace()
:
class handle
{
public static function makehtml($target)
{
$output = preg_replace("#{~#", "<", $target);
$output = preg_replace("#~}#", ">", $target);
$output = preg_replace("#{{q}}#", '"', $target);
return $output;
}
}
echo handle::makehtml($target);
// output : <p class="important-text">Some text here</p>
Ответ 8
если вы беспокоитесь о пространстве и используете метод кодирования base 64, размещенный здесь, вы можете использовать команду gzdeflate в php, чтобы сократить ее, а затем закодировать. Ниже приведен небольшой тест script на некоторые сгенерированные образцы символов. Очевидно, что существуют различные методы сжатия, если вы заинтересованы в размере, но это означало бы, что вы могли бы поместить его в mysql, минимизируя размер на db. Затем вы можете прочитать его с помощью gzinflate (base64_decode (...));
<?php
//generate sample chars for the example
function generateRandomString($length = 10000) {
$characters = '01234"56/789abcdefghij:klmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
//
$string =generateRandomString();
echo 'string size:'.strlen($string);
$b64html = base64_encode($string);
echo '<br/>'.'Original base64 size:'.strlen($b64html);
$compressed = gzdeflate($string, 9);
echo '<br/>'.'compressed size:'.strlen($compressed);
echo '<br/>'.'base64 compressed size:'.strlen(base64_encode($compressed));
/* insert into db the base64_encode($compressed); */
?>
Ответ 9
Вызов функции mysql_escape_string(), проходящей в переменной, которая содержит текст html, например:
mysql_escape_string ($ _ POST [ "текст" ]);
гарантирует, что специальные символы, такие как кавычки в тексте, не вызовут ошибку php, и база данных будет успешно обновлена.