2012-09-18 72 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谢谢,这是一个更简单的解决方案的魅力! –