Не нравятся результаты поиска? Попробуйте другой поиск!

Как исправить ошибку из-за символа ' в заголовке?


     03.09.2015    Общие вопросы по PHP    848

вопрос
Есть модуль последних комментариев (код ниже) в котором выводятся последние комменты и заголовки статей, в которых эти коменты были оставленны. Проблема в том, что если в заголовке публикации присутствует символ ' и пользователь к ней оставляет комментарий, то в модуле возникает критическая ошибка:


Parse error: syntax error, unexpected '', '' (T_CONSTANT_ENCAPSED_STRING) in /public_html/engine/modules/last_comments.php(125) : regexp code on line 1 Fatal error: preg_replace(): Failed evaluating code: trimming( '???µN?N‚?????°N? ????????N?N‚N? - ??N???N€?°???»N??µ?? ??N????±??N? '', '35', ' ...' ) in /public_html/engine/modules/last_comments.php on line 125


Сама 125я строка, которая выводит заголовки:


if ( search( $tpl->copy_template, '{title=' ) !== false ) $tpl->copy_template = preg_replace ( "#\{title=([0-9]{0,3})\|?([^\}]+)?\}#ie", "trimming( '{$row['title']}', '\\1', '\\2' )", $tpl->copy_template );


Пробовал изменять эту строку, итога два - либо ошибка, либо вместо заголовка выводится {title=35 ...} - это всё равно, что удалить строку вовсе.

Подскажите, как решить эту проблему? Что можно сделать?

Сумасшедший код всего модуля:

Ответа пока нет


Комментарии пользователей (12)

Gameer
225

1120 | 395

Gameer - 3 сентября 2015 20:44 - Эксперт

'{$row['title']}'
на
\"{$row['title']}\"
или
" . $row['title'] . "

Истина в противоречии.​

Dr.Riddle
15

Dr.Riddle - 3 сентября 2015 20:52 - Юзер

\"{$row['title']}\"


Этот вариант работает, спасибо большое, ошибки больше нет

" . $row['title'] . "


А с этим ошибка

Dr.Riddle
15

Dr.Riddle - 4 сентября 2015 09:35 - Юзер

\"{$row['title']}\"

Теперь другая проблема. С этим кодом возникает ошибка с символом "
Можно сделать что-то ещё?

Gameer
225

1120 | 395

Gameer - 4 сентября 2015 11:26 - Эксперт

Цитата: Dr.Riddle
" . $row['title'] . "
с этим какая ошибка ?

Истина в противоречии.​

Gameer
225

1120 | 395

Gameer - 4 сентября 2015 11:39 - Эксперт

Замените весь тот код вывода заголовка по лимиту на этот :
if ( preg_match( "#\\{title limit=['\"](.+?)['\"]\\}#i", $tpl->copy_template, $matches ) ) {
    $count= intval($matches[1]);
    $row['title'] = strip_tags( $row['title'] );
    if( $count AND dle_strlen( $row['title'], $config['charset'] ) > $count ) {
        $row['title'] = dle_substr( $row['title'], 0, $count, $config['charset'] );
        if( ($temp_dmax = dle_strrpos( $row['title'], ' ', $config['charset'] )) ) $row['title'] = dle_substr( $row['title'], 0, $temp_dmax, $config['charset'] );
    }
    $tpl->set( $matches[0], $row['title'] );
}

Истина в противоречии.​

Dr.Riddle
15

Dr.Riddle - 4 сентября 2015 11:52 - Юзер

" . $row['title'] . "

Такая же, как и с изначальной строкой:
Parse error: syntax error, unexpected '', '' (T_CONSTANT_ENCAPSED_STRING) in /public_html/engine/modules/last_comments.php(125) : regexp code on line 1 Fatal error: preg_replace(): Failed evaluating code: trimming( '???µN?N‚?????°N? ????????N?N‚N? - ??N???N€?°???»N??µ?? ??N????±??N? '', '35', ' ...' ) in /public_html/engine/modules/last_comments.php on line 125 

Однако ошибка возникает как на символ ' так и на символ "

if ( preg_match( "#\\{title limit=['\"](.+?)['\"]\\}#i", $tpl->copy_template, $matches ) ) {
    $count= intval($matches[1]);
    $row['title'] = strip_tags( $row['title'] );
    if( $count AND dle_strlen( $row['title'], $config['charset'] ) > $count ) {
        $row['title'] = dle_substr( $row['title'], 0, $count, $config['charset'] );
        if( ($temp_dmax = dle_strrpos( $row['title'], ' ', $config['charset'] )) ) $row['title'] = dle_substr( $row['title'], 0, $temp_dmax, $config['charset'] );
    }
    $tpl->set( $matches[0], $row['title'] );
}

С этим кодом не работает... {title=35 ...} вместо заголовков

Похоже модуль сам по себе кривоват

Gameer
225

1120 | 395

Gameer - 4 сентября 2015 11:55 - Эксперт

Dr.Riddle, потому что нужно писать так
{title limit="35"}

Истина в противоречии.​

Dr.Riddle
15

Dr.Riddle - 4 сентября 2015 12:09 - Юзер

В строке вывода, я вроде так и написал, но всё равно {title=35 ...}
Если строку вывода удалить совсем, то тоже самое. Вместо заголовков {title=35 ...}

Или
{title limit="35"}

где-то в другом месте надо написать?

Gameer
225

1120 | 395

Gameer - 4 сентября 2015 12:11 - Эксперт

Dr.Riddle, замените на тот код что я написал и в файле шаблона вместо
{title=35}
писать
{title limit="35"}

Истина в противоречии.​

Dr.Riddle
15

Dr.Riddle - 4 сентября 2015 12:24 - Юзер

Да, теперь всё работает,
спасибо за помощь!

Sander
1125

1637 | 1204

Sander - 4 сентября 2015 13:07 - Эксперт

А можно было просто перед кодом добавить:
$row['title'] = $db->safesql($row['title']);

Ну или по колхозному:
$row['title'] = str_replace("'","\'",$row['title']);

Экранирование-с.

SanDev.pro - мой блог.

ICQ: 404-037-556
Skype: Sander8804

Dr.Riddle
15

Dr.Riddle - 4 сентября 2015 17:29 - Юзер

Sander,
Так тоже работает, спасибо

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы