2012-07-06 145 views
3

我想打印出錯的原因。PHP:rename()我如何找到錯誤原因?

error_get_last()似乎沒有返回任何東西。 rename()返回TRUE | FALSE而不是異常。

if (!rename($file->filepath, $full_path)) { 
    $error = error_get_last(); 
    watchdog('name', "Failed to move the uploaded file from %source to %dest", array('%source' => $file->filepath, '%dest' => $full_path)); 
} 
+1

你想解決一個錯誤,或者你想這是你的最終計劃的功能嗎?如果這是一個錯誤重命名發出E_WARNING,你可以閱讀,如果你設置error_reporting顯示E_NOTICE。如果這是爲了生產,你應該添加一些文件檢查,如剛剛發佈的建議 – 2012-07-06 10:37:42

回答

3

答案是'另一個錯誤處理程序'捕獲錯誤,按照php手冊中的註釋http://php.net/manual/en/function.error-get-last.php。在這種情況下,它是drupal錯誤處理程序,錯誤被捕獲到錯誤日誌中。

+1

應該說你在使用框架是你的問題。框架爲你做了很多事情,並經常改變你將收到的建議。 – Brian 2012-07-07 07:56:14

3

首先,這是一個更好的做法,之前添加一些安全檢查:

if (file_exists($old_name) && 
    ((!file_exists($new_name)) || is_writable($new_name))) { 
    rename($old_name, $new_name); 
} 

其次,你可以打開錯誤報告:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 
+1

這不起作用,因爲有'另一個錯誤處理程序。我正在運行調試器並期待錯誤,但drupal正在捕獲它們。 rename()和copy()都會報告消息。對error_get_last()的注意是讓我得以枝葉http://php.net/manual/en/function.error-get-last.php。我有點偏執的檢查,或創建目錄file_check_directory($路徑,FILE_CREATE_DIRECTORY) – Interlated 2012-07-07 03:47:32

0

的另一種方式做,這是做一個copy()複製到所需的新名稱(您可以驗證)與消息...然後使用unlink()刪除原來的。

但是,是的,rename()不正是像你說的,不生成錯誤,當它不工作:)

+0

當我制定了錯誤處理程序的事情時,copy()和rename()做了同樣的事情 – Interlated 2012-07-07 07:52:38

0

似乎您試圖移動上傳的文件,使用move_uploaded_file代替。

+0

Insightful,我喜歡工具的目的。從我的問題剔除 - 我沒有說這是drupal。使用http://drupal.org/project/upload_element然後調用drupal file_save_upload()。清理文件並將其放入tmp目錄中。上傳可以基於ajax或提交。所以我不信任$ _POST並且文件在磁盤上。這就是爲什麼我只是在重命名() – Interlated 2012-07-07 02:38:12