PHP / MYSQL:比较一列中的单元格并覆盖另一列或表中的匹配子串

时间:2016-01-13 20:21:41

标签: php mysql regex

我有一堆项目名称要覆盖其中包含名称作为子字符串的链接。所以我想把数据放到列中,如果子串匹配则简单地覆盖。然而,这比我想象的更难,经过大量尝试后我无法找到任何解决方案。

Item Name  |                 Link
==================================================
Ice Tea    | <a href="www.nothing.com">Spiced Rum</a>
Spiced Rum | <a href="www.nothing.com">Peaches</a>
           | <a href="www.nothing.com">Ice Tea</a>                 

我希望它看起来像:

Item Name                                |                 Link
====================================================================================
<a href="www.nothing.com">Ice Tea</a>    | <a href="www.nothing.com">Spiced Rum</a>
<a href="www.nothing.com">Spiced Rum</a> | <a href="www.nothing.com">Peaches</a>
                                         | <a href="www.nothing.com">Ice Tea</a> 

首先,我尝试使用一些PHP字符串函数执行此操作,但我找不到如何在每个项目名称找到匹配项之前循环遍历整个链接列。我设法做的就是逐行替换。

    <?php
require_once('connectvars.php');

// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
or die('Error connecting to MySQL server.');
$query = "SELECT Item, Link FROM MyDB";

$data = mysqli_query($dbc, $query)
or die(mysqli_error($dbc));

$i = 1;

while ($row = mysqli_fetch_array($data, MYSQLI_ASSOC)) {

    $item = $row["Item"];
    $link = $row["Link"];

    $match = stripos($link, $item);

    if ($match !== false) {

            $query = "UPDATE Test SET Item = '$link' where ID = $i";

            if (mysqli_query($dbc, $query)) {
                echo "Record updated successfully";
            } else {
                echo "Error updating record: " . mysqli_error($dbc);
            }

        }
$i++;
}
mysqli_close($dbc);

?>

然后我尝试了各种方法来使用MySQL函数来替换子字符串,但我似乎无法使其工作。

SELECT column1, column2 
FROM table 
WHERE column1 LIKE CONCAT('%', column2, '%');

如果有帮助,我可以将数据移动到单独的表中。

2 个答案:

答案 0 :(得分:0)

使用LOCATE mysql函数查找字符串中子字符串的第一个位置,您需要在Item中找到Link

UPDATE Test SET `Item` = `Link` WHERE 0 < LOCATE(`Item`, `Link`)

如果您想跳过Item NULL

的行
UPDATE Test SET `Item` = `Link` where `Item` IS NOT NULL AND 0 < LOCATE(`Item`, `Link`)

答案 1 :(得分:0)

我过度思考这一点。我没有意识到我可以使用带数组的strpos(如果你只是提取每个数组值)。所以现在这将通过Text递增并扫描Link直到匹配,然后用Link覆盖Text。

这仅用于更新大量提取数据,而不是“实时”代码。

<?php
require_once('connectvars.php');

// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
or die('Error connecting to MySQL server.');
$query = "SELECT Text, Link FROM Items";

$data = mysqli_query($dbc, $query)
or die(mysqli_error($dbc));

$text = array();
$link = array();
$id = 1;

while ($row = mysqli_fetch_array($data)) {

    $text[] = $row["Text"];
    $link[] = $row["Link"];

}


for ($i = 0; $i < sizeof($text); $i++) {

    $string_text = $text[$i];


    for ($j = 0; $j < sizeof($link); $j++) {

        $string_link = $link[$j];

        $match = stripos($string_link, $string_text);

        if ($match !== false) {

            $link[$j] = $string_link;

            $query = "UPDATE Items SET Text = '$link[$j]' WHERE ID = '$id'";
            if (mysqli_query($dbc, $query)) {
                echo "Record updated successfully";
            } else {
                echo "Error updating record: " . mysqli_error($dbc);
            }

        }


    }
    $id++;
}

mysqli_close($dbc);

?>