Мне нужно получить значение из таблицы 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
Выполняя 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//
Вы можете сделать это, используя один запрос на обновление. Вы можете использовать оператор 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_,'%');
Надеюсь, это поможет тебе.
$find = $row['Find']
- то, что вы выбрали значение, которое вы присваиваете$find
из ассоциативного массива, не означает,$find
сам$find
тоже будет одним из них. Сделайте некоторую базовую отладку и используйтеvar_dump
чтобы выяснить, что именно эти три переменные вы передаете в функцию в то время.