2012-09-18 59 views
0

我與表「book authors」鏈接的兩個表(作者和書籍)。更新mysqlDB的函數在foreach循環中不起作用

「書籍作者」表包含BookAuthorID,AuthorID和BookID,這意味着我可以擁有來自同一作者等的多本書籍,並且匹配它們是一件輕而易舉的事情。

不幸的是,我搞砸了作者表的ID字段,並創建了一個新的主鍵和自動增量。現在我需要使用新的ID填充「書籍作者」表中的匹配列,並將它們與舊的匹配。

我有以下功能更新「一書的作者」表...

function update_id($BookAuthorID, $NewAuthorID) { 
$result = mysql_query("UPDATE `book authors` SET NewAuthorID='$NewAuthorID' WHERE BookAuthorID='$BookAuthorID'") or trigger_error(mysql_error()); } 

知道此功能工作原理我已經用函數和兩個例如,創建一個空白頁測試它變量($ BookAuthorID,$ NewAuthorID)並正確更新了表。

現在我有以下的代碼,發現每個作者的每個實例,然後在每本書foreach循環的ID匹配...

$result = mysql_query("SELECT * FROM authors"); 

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    $AuthorID= $row["AuthorID"]; 

    $match = get_books($BookID); 

    foreach ($match as $value) {  
     update_id($value["BookAuthorID"], $value["NewAuthorID"]); 
    } 
} 

的get_books功能如下,並適用於其餘該網站的...

function get_books($id) { 
    $result = mysql_query("SELECT * FROM `book authors` WHERE AuthorID= $id") or trigger_error(mysql_error()); 
    $array = array(); 

    while($row_ids = mysql_fetch_assoc($result)){ 
     $array[] = $row_ids; 
    } 
return $array; 
} 

我無法弄清楚,爲什麼函數工作foreach循環之外,但什麼都不做內(不會生成錯誤)。

+0

嘗試回顯爲您的UPDATE查詢生成的SQL - 它看起來應該如何?它在數據庫中運行時是否工作? – andrewsi

+0

切換到PDO,返回結果集,你可以直接迭代它們。這應該會減少你的代碼量,也可能幫助你找到錯誤。此外,如果某些特定功能無法使用,則需要進行故障排除。函數實際上是否被調用?我沒有看到可以證明這一點的日誌記錄功能。 – hakre

+0

你在哪裏設置'$ BookID'?我的猜測是'$ BookID'是空的,'$ match'填充了一個空數組,並且foreach循環從不迭代,因爲沒有什麼可以迭代。 – Jrod

回答

2

你不能做這樣的事情:

UPDATE `book authors`, authors 
SET `book authors`.newauthorid = authors.newauthorid 
WHERE `book authors`.authorid = authors.authorid; 

,而不是循環?

+0

Bobwienholt謝謝,這是一個更簡單的解決方案的魅力! –