首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP ZipArchive 壓縮文件報錯:open 方法參數括號位置錯誤導致判斷失效

     編輯:程式設計綜合問答

問題代碼分析

<?php
$zip = new ZipArchive();
if ($zip->open('F:\test.zip', ZIPARCHIVE::OVERWRITE === TRUE)) {  // ❌ 錯誤寫法
    $zip->addFile("1439879545373869963.jpg");
    zip_close();  // ❌ 過時函數,應用 $zip->close()
    echo 'ok';
} else {
    echo 'failed';
}

核心錯誤

1. 運算符優先級導致邏輯錯誤

ZIPARCHIVE::OVERWRITE === TRUE 先執行,**比較常數值**,結果為 false (整數 ≠ 布爾)。實際傳給 open() 的第二參數是 false (即 0),而非 ZIPARCHIVE::OVERWRITE (值為 8)。

正確寫法:

if ($zip->open('F:\test.zip', ZIPARCHIVE::OVERWRITE) === TRUE) {
    // 成功邏輯
}

2. 路徑字符串轉義問題

PHP 雙引號字符串中 \t 會被解析為制表符。Windows 路徑建議:

  • 單引號:'F:\test.zip'
  • 雙反斜槓:"F:\\test.zip"
  • 正斜槓:"F:/test.zip" (跨平台推薦)

3. 過時函數 zip_close()

PHP 5.2+ 推薦面向對象風格:$zip->close()。

完整修正代碼

<?php
header("Content-Type: text/html; charset=utf-8");

$zip = new ZipArchive();
$zipPath = 'F:/test.zip';  // 正斜槓避免轉義
$fileToAdd = '1439879545373869963.jpg';

// 檢查文件存在
if (!file_exists($fileToAdd)) {
    die("源文件不存在: $fileToAdd");
}

// 正確調用 open:第二參數為常數,=== TRUE 判斷返回值
$res = $zip->open($zipPath, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE);
if ($res === TRUE) {
    $zip->addFile($fileToAdd);
    $zip->close();  // 正確關閉
    echo "壓縮成功: $zipPath";
} else {
    // 錯誤碼對照:https://www.php.net/manual/en/ziparchive.open.php
    $errors = [
        ZIPARCHIVE::ER_EXISTS => '文件已存在',
        ZIPARCHIVE::ER_INCONS => '壓縮包不一致',
        ZIPARCHIVE::ER_MEMORY => '記憶體不足',
        ZIPARCHIVE::ER_NOENT => '文件不存在',
        ZIPARCHIVE::ER_NOZIP => '非有效壓縮包',
        ZIPARCHIVE::ER_OPEN => '無法打開文件',
        ZIPARCHIVE::ER_READ => '讀取失敗',
        ZIPARCHIVE::ER_SEEK => '定位失敗',
    ];
    echo "壓縮失敗,錯誤碼: $res - " . ($errors[$res] ?? '未知錯誤');
}

進階用法:遞歸壓縮目錄

function zipDirectory($sourceDir, $zipPath) {
    $zip = new ZipArchive();
    if ($zip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== TRUE) {
        throw new Exception("無法創建壓縮包: $zipPath");
    }
    $sourceDir = rtrim($sourceDir, '/\\');
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($sourceDir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $file) {
        if ($file->isFile()) {
            $relativePath = substr($file->getPathname(), strlen($sourceDir) + 1);
            $zip->addFile($file->getPathname(), $relativePath);
        }
    }
    $zip->close();
    return true;
}

常見錯誤碼對照表

常數值含義排查方向
ER_OPEN11無法打開文件路徑錯誤、權限不足、磁碟滿
ER_NOENT10文件不存在addFile 路徑錯誤、相對路徑基準目錄錯誤
ER_MEMORY14記憶體不足大文件分塊壓縮、增加 memory_limit
ER_INCONS13壓縮包不一致並發寫入衝突、文件損壞

總結:open() 判斷必須分離 === TRUE,**不要**將常數比較寫在參數裡;路徑用正斜槓;改用 $zip->close();檢查錯誤碼定位具體原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved