PHP str_ireplace на Mysql Результат

0

Мне нужно получить значение из таблицы MySQL, а затем заменить его на что-то еще.

У меня есть таблица поиска и замены, которая имеет три столбца: ID, Find, Replace. Я хочу прокрутить каждую строку этой таблицы, а затем найти значение поиска в другой таблице и изменить ее на замену.

Например:

ID | Find                   | Replace
1  | This is a product name | Product Name 

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

$lookups = mysqli_query($connect, "SELECT * FROM value_lookup");

while($row = mysqli_fetch_assoc($lookups)) {
    $find = $row['Find'];
    $replace = $row['Replace'];

    $table = mysqli_query($connect, "SELECT ID, Reference FROM table");

    while($row = mysqli_fetch_assoc($table)) {
        $ref = $row['Reference'];
        $newRef = str_ireplace($find, $replace, $ref);

        echo $newRef . PHP_EOL;
        mysqli_query($connect, "UPDATE table SET Reference = '$newRef' WHERE Reference LIKE '%$find%'");
    }
}

Мне кажется, что str_ireplace не работает, потому что значения, которые я использую, являются ассоциативным массивом. Если я вручную вводим значения в виде строки, она отлично работает.

Мне нужно знать, как получить значения в виде строки или преобразовать их в один. Мне также нужно использовать str_ireplace, я не могу просто взять значение find и заменить на замену. Поскольку некоторые значения имеют разные префиксы и суффиксы, которые я хочу сохранить одинаковыми:

Это некоторые полотенца: Red TO Towels: Red
Это некоторые полотенца: Blue TO Towels: Blue

  • 0
    Не могли бы вы настроить минимальный проверяемый sqlfiddle, пожалуйста? Возможно, это можно сделать с чистым mysql, но я не продумал это полностью.
  • 0
    «Мне кажется, что str_ireplace не работает, потому что значения, которые я использую, являются ассоциативным массивом». - это не так. $find = $row['Find'] - то, что вы выбрали значение, которое вы присваиваете $find из ассоциативного массива, не означает, $find сам $find тоже будет одним из них. Сделайте некоторую базовую отладку и используйте var_dump чтобы выяснить, что именно эти три переменные вы передаете в функцию в то время.
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Выполняя SQLfiddle для mickmackusa, мне действительно удалось это сделать для себя, используя чистый SQL.

DELIMITER //
CREATE PROCEDURE findreplace()
BEGIN   
DECLARE cnt INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
DECLARE original VARCHAR(255);
DECLARE new VARCHAR(255);

SELECT COUNT(*) FROM lookup INTO total;

WHILE cnt < total DO
    SELECT find FROM lookup LIMIT cnt, 1 INTO original;
    SELECT repl FROM lookup LIMIT cnt, 1 INTO new;

    UPDATE test SET Reference = replace(Reference, original, new);
    SET cnt = cnt + 1;
END WHILE;
END//
0

Вы можете сделать это, используя один запрос на обновление. Вы можете использовать оператор REGEXP ИЛИ LIKE в предложении WHERE для соответствующего поиска и замены, ниже приведены запросы:

Использование REGEXP:

UPDATE table, findreplacetable SET table.name = REPLACE(table.name, findreplacetable.find_, findreplacetable.replace_) WHERE table.name REGEXP CONCAT('[[:<:]]', findreplacetable.find_,'[[:>:]]');

Использование LIKE:

UPDATE table, findreplacetable SET table.name = REPLACE(table.name, findreplacetable.find_, findreplacetable.replace_) WHERE table.name LIKE CONCAT('%', findreplacetable.find_,'%');

Надеюсь, это поможет тебе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню