2016-01-13 21 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); 

?> 
相關問題