2017-08-04 127 views
1

我有一个函数在我的PHP脚本中恢复备份数据。一切都很好,运转良好,直到几个月的工作良好后突然停止工作。我使用的是OC 2.2.0,此功能应该可以从oc_product_backup表中恢复产品及其数据。我print_r的每一步,这样我就看到问题的所在,并意识到,当它到达:php脚本返回true突然停止返回值

return true; 

它永远不会发生。突然间有什么可能是错的,我该如何做这项工作?我从来没有遇到过这样的问题。我的功能看起来是这样的:

function restoreBackup() 
{ 
    global $mysqli; 

    $i    = 0; 
    $getpic   = "SELECT * FROM oc_product_backup LIMIT 0, 100000"; 
    $backup   = $mysqli->query($getpic); 

    $mysqli->autocommit(FALSE); 
    $updateproduct_sql  = "UPDATE oc_product SET image = ?, modified_by = ?, date_modified = ? WHERE product_id= ?"; 
    $updatedescription_sql = "UPDATE oc_product_description SET meta_description = ?, meta_keyword = ?, tag = ?, modified_by = ? WHERE product_id = ? AND language_id = ?"; 

    $stmt = $mysqli->prepare($updateproduct_sql); 
    $stmt->bind_param('siss', $image, $modified_by, $date_modified, $product_id); 
    //print_r ($updateproduct_sql); 
    $stmt2 = $mysqli->prepare($updatedescription_sql); 
    $stmt2->bind_param('sssisi', $meta_description, $meta_keyword, $tag, $modified_by, $product_id, $language_id); 
    //print_r($updatedescription_sql); 

    while($row = $backup->fetch_array(MYSQLI_ASSOC)) 
    { 

     //$name    = removeslashes($row['name']); 
     //$name    = $row['name']; 
     //$description  = removeslashes($row['description']); 
     //$description  = $row['description']; 
     $meta_description = $row['meta_description']; 
     $meta_keyword  = $row['meta_keyword']; 
     $tag    = $row['tag']; 
     $product_id  = $row['product_id']; 
     $modified_by  = $row['modified_by']; 
     $language_id  = $row['language_id']; 
     //if($row['language_id'] == 1) 
     //{ 
     $image   = $row['image']; 
     //$ean   = $row['ean']; 
     //$name   = $row['name']; 
     //$model   = $row['model']; 
     //$status   = $row['status']; 
     $price_sync  = $row['price_sync']; 
     $date_modified = $row['date_modified']; 

     if(!$stmt->execute()) 
      return false; 

     //} 
     if(!$stmt2->execute()) 
      return false; 

     $i++; 
     if(($i % 500) === 0) $mysqli->commit(); 

    } 

    $mysqli->commit(); 
    $backup->close(); //the last line that gets executed 
    return true; //this never happens 
    writeToLog('- Backup restored'); 
} 
+0

也许你的脚本超时,因为数据库中的数据更多? (只是一个建议,不要钉死我) –

+0

@SchalkKeun Thanx为您的答复 - 我的数据库在整个时间内并没有显着增加,所以我不认为这会是问题。但是,无论如何,这个建议都是对的。 – Nancy

+0

你会得到一个空白页面或网络超时页面?该脚本是在浏览器上执行还是作为cron作业? –

回答

0

看一下代码后,好像你准备语句结合的数据是环外,因此从技术上讲就不会写入任何数据。

function restoreBackup() { 
    global $mysqli; 

    $i = 0; 
    $getpic = "SELECT * FROM oc_product_backup LIMIT 0, 100000"; 
    $backup = $mysqli - > query($getpic); 

    $mysqli - > autocommit(FALSE); 
    $updateproduct_sql = "UPDATE oc_product SET image = ?, modified_by = ?, date_modified = ? WHERE product_id= ?"; 
    $updatedescription_sql = "UPDATE oc_product_description SET meta_description = ?, meta_keyword = ?, tag = ?, modified_by = ? WHERE product_id = ? AND language_id = ?"; 


    while ($row = $backup - > fetch_array(MYSQLI_ASSOC)) { 

     $meta_description = $row['meta_description']; 
     $meta_keyword = $row['meta_keyword']; 
     $tag = $row['tag']; 
     $product_id = $row['product_id']; 
     $modified_by = $row['modified_by']; 
     $language_id = $row['language_id']; 
     $image = $row['image']; 
     $price_sync = $row['price_sync']; 
     $date_modified = $row['date_modified']; 

     $stmt = $mysqli - > prepare($updateproduct_sql); 
     $stmt - > bind_param('siss', $image, $modified_by, $date_modified, $product_id); 
     if (!$stmt - > execute()) 
      return false; 

     $stmt2 = $mysqli - > prepare($updatedescription_sql); 
     $stmt2 - > bind_param('sssisi', $meta_description, $meta_keyword, $tag, $modified_by, $product_id, $language_id); 
     if (!$stmt2 - > execute()) 
      return false; 

     $i++; 
     if (($i % 500) === 0) $mysqli - > commit(); 

    } 

    $mysqli - > commit(); 
    $backup - > close(); //the last line that gets executed 
    return true; //this never happens 
    writeToLog('- Backup restored'); 
} 
+0

你的解决方案应该可以工作,但它根本没有。我不知道发生了什么,我正在失去理智。 – Nancy

+0

@Nancy,我建议你只要在任何地方抛出'print_r()',以确保所有的数据实际上都是按照它的设想书写的。 –

+0

Thanx试图帮助。我做了print_r()的一切,一切看起来都很好,除非它不能正常工作。一旦我找到答案,我会尝试更多并在此发布答案。如果您有任何其他建议,请告诉我。 – Nancy