php str_replace array не работает из вывода с sql

Рейтинг: 0Ответов: 1Опубликовано: 07.08.2025

Пришло время удалить маты из заголовков, но столкнулся с проблемой! Делаю по простому: одну запись в базе id-1 и text куда и сохраняю плохие слова через запятую. Называю таблицу maty

Далее уже на выводе к каждому слову добавляю кавычки и делаю строку:

    $sqlmaty = $conn->query("SELECT * FROM maty WHERE id='1'");
    $rowmaty = $sqlmaty->fetch(PDO::FETCH_ASSOC);   

$words = explode(",", $rowmaty['text']);
$quoted_words = array_map(function($word) {
  return '"'.$word .'"';
}, $words);
$badWords = implode(",", $quoted_words);

Далее массив уже готовых слов с кавычками через запятую + str_replace

$badWords2 = array($badWords);
    $title = str_replace($badWords2, " ", "оригинальный заголвоок");

В итоге: в базе символы хранятся без изменений (ЮТФ-8 без экранирования и тд)

В таком виде $badWords2 = array($badWords); не работает замена

А в таком $badWords2 = array(слова из базы в таком виде "слово","слово","слово","слово","слово"); - работает

Хотя $badWords и есть слова "слово","слово","слово","слово","слово" Я уже всё что мог, перепробовал. Где я ошибся?

Ответы

▲ 1Принят

Какие-то загадочные телодвижения. Во-первых, str_replace требует на входе массив, а не строку (строку то тоже, но это не наш случай). Во-вторых там не нужны никакие кавычки. И в-третьих гораздо удобнее было бы хранить в бд слова в отдельных записях, это и управлять списком позволяет гибче, да и не понадобился бы explode. А в вашем случае всё просто:

$sqlmaty = $conn->query("SELECT * FROM maty WHERE id='1'");
$rowmaty = $sqlmaty->fetch(PDO::FETCH_ASSOC);   

$words = explode(",", $rowmaty['text']);

$title = str_replace($words, " ", "оригинальный заголвоок");

Но я бы делал отдельные слова в бд и выглядело бы так:

$sqlmaty = $conn->query("SELECT text FROM maty");
$words = $sqlmaty->fetchAll(PDO::FETCH_COLUMN, 0);   

$title = str_replace($words, " ", "оригинальный заголвоок");