代码之家  ›  专栏  ›  技术社区  ›  Edward144

PHP str\u ireplace on Mysql结果

  •  0
  • Edward144  · 技术社区  · 6 年前

    我需要从MySQL表中获取一个值,然后用其他内容替换它。

    我有一个查找和替换表,它有三列:ID、Find、Replace。我想遍历该表的每一行,然后在另一个表中搜索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\u ireplace不起作用,因为我使用的值是一个关联数组。如果我手动键入字符串形式的值,效果很好。

    我需要知道如何将值作为字符串获取,或将其转换为字符串。我也必须使用str\ireplace,我不能直接获取查找值并更改为替换。由于某些值的前缀和后缀不同,我希望保持不变:

    这些是一些毛巾:红色的
    这些是一些毛巾:蓝色到毛巾:蓝色

    2 回复  |  直到 6 年前
        1
  •  1
  •   Edward144    6 年前

    在为mickmackusa制作SQLfiddle时,我实际上已经使用纯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//
    
        2
  •  0
  •   Pradeep Rajput    6 年前

    您可以通过使用单个更新查询来实现这一点。您可以在WHERE子句中使用REGEXP或LIKE运算符来分别查找(&A);替换,以下是查询:

    使用 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_,'%');
    

    希望它能帮到你。