2016-01-13 22 views
1

我有一堆项目名称,我想覆盖其中的名称为子字符串的链接。所以我想把数据放入列中,并简单地覆盖子字符串是否匹配。然而,这比我想象的更加困难,经过很多尝试后我找不到任何解决方案。PHP/MYSQL:比较一列中的单元格并覆盖另一列或表中的匹配子字符串

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

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

+0

未经测试,但 - '更新测试设置\'项目\'= \'链接\'其中\'项目\'IS NOT NULL和0

+0

是项目名称'NULL '如果不匹配? – Kisaragi

回答

0

其中找到字符串中的子字符串的第一个位置使用LOCATE MySQL的功能,你需要找到ItemLink

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

如果你想跳过行,其中ItemNULL

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

所以在LOCATE中我可以放列名?我试过这个,但它实际上不会做任何事情。就像我在Links表中有“Coffee”和Links表中的“这是一个带有咖啡的句子”,没有任何反应。谢谢你的帮助。 – Alison

+0

它的工作原理有点不同,但它与我的PHP程序完全相同,它只是改变并排单元格,似乎并不扫描列。 – Alison

0

我正在过度这个一点点。我没有意识到我可以对数组使用strpos(如果你只是提取每个数组的值)。因此,现在这将通过文本增加,并通过链接扫描,直到匹配,然后用链接覆盖文本。

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

<?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); 

?> 
相关问题