2013-10-24 75 views
0

我試圖爲數據庫中存在的每一行分配一個名爲'uniqueid'的字段。大約有188,000行可用。使用唯一值更新MYSQL中的每一行

這裏是我使用的代碼:

$connection = mysql_connect("localhost","root","root"); 
mysql_select_db("comics",$connection) or die ("Database not found"); 

$query = mysql_query("select * from comic_issues"); 

if ($query){ 
    $rows = mysql_num_rows($query); 

    foreach($rows as $row){ 
    $str = strtolower($row['series'].$row['volume'].$row['issue']); 
    $str = preg_replace('/[^A-Za-z0-9]/', '', $str); 

    $update = "update comic_issues set uniqueid='" . $str . "' where id='" . $row['ID'] . "'"; 
    mysql_query($update); 

    exit(); 
    } 
} 

正在發生的事情是,每一行都獲得具有相同UNIQUEID,這似乎是每一個我運行腳本時不同的值更新。

+2

爲什麼不把'AUTO_INCREMENT'屬性應用到'uniqueid'(如果它是一個整型數據類型),並讓MySQL爲你完成剩下的工作? – eggyal

+0

@eggyal我正在使用此字段可以將上傳的CSV文件與我的內部數據同步。他們的內容可能不匹配我的,因此獨特的領域。 – TerryG

回答

1

而不是

foreach($rows as $row){ 

你需要做的

while ($row = mysql_fetch_row($query)) { 

在你的代碼$rows是一個數字,而不是一個數組,因此你不能做一個foreach就可以了。

+0

或者,您也可以從3個值中生成一個散列,並將其用於您的唯一ID。例如。 '$ str = md5($ row ['series']。$ row ['volume']。$ row ['issue']);'然後你不需要**任何**特殊字符! – TheStoryCoder

+0

我試過這段代碼(while),它仍然不起作用。嗯。 – TerryG

+0

您的代碼中可能存在其他問題。需要一些關於這個問題的更多細節。你應該試着回顯$ str和$ update到屏幕上,看看它們是否包含正確的字符串......並且,在更新第一行後,你也會停止腳本 - 因爲你的退出() - 你不要那樣。 – TheStoryCoder

1

只是讓MySQL的做這一切爲您:

UPDATE comic_issues SET uniqueid = LOWER(CONCAT(series,volume,issue)) 

如果你還必須去除所有非字母數字字符,你可以寫一個存儲功能,或者使用UDF。

+0

特殊字符怎麼樣?很多都有連字符或撇號。 – TerryG

+0

@TerryGodier:如果你只關心連字符和撇號,你可以應用REPLACE()兩次。 – eggyal

+0

可能會有額外的特殊字符,包括空格,逗號,數據中的任何內容。 – TerryG

相關問題