2009-10-25 23 views
1

我有一個上傳圖片的PHP文件(它上傳圖片,創建它的縮略圖,並且還爲圖片添加了水印)。該文件正在被AJAX調用。如何調試由AJAX調用的PHP文件?

它正在使用WAMPSERVER 2.0的Windows XP上的本地主機上工作。現在我安裝了Windows Vista並突然無法正常工作(圖片上傳,但縮略圖和水印部分不起作用)。

我使用完全相同的軟件來測試本地計算機上的應用程序(WAMPSERVER 2.0),但它不起作用。

如何調試此文件?下面是它的外觀:

<?php 

define('BASE_PATH', substr(dirname(dirname(__FILE__)), 0, -22)); 

// set the include path 
set_include_path(BASE_PATH 
       . '/../../library' 
       . PATH_SEPARATOR 
       . BASE_PATH 
       . '/library' 
       . PATH_SEPARATOR 
       . get_include_path()); 

// autoload classes from the library 
function __autoload($class) { 
    include str_replace('_', '/', $class) . '.php'; 
} 

$configuration = new Zend_Config_Ini(BASE_PATH 
            . '/application' 
            . '/configs/application.ini', 
            'development'); 
$dbAdapter = Zend_Db::factory($configuration->database); 
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); 

function _getTable($table) 
{ 
    include BASE_PATH 
    . '/application/modules/default/models/' 
    . $table 
    . '.php'; 
    return new $table(); 
} 

$albums = _getTable('Albums'); 
$media = _getTable('Media'); 

if (false === empty($_FILES)) { 

    $tempFile = $_FILES['Filedata']['tmp_name']; 
    $extension = end(explode('.', $_FILES['Filedata']['name'])); 

    // insert temporary row into the database 
    $data = array(); 
    $data['type'] = 'photo'; 
    $data['type2'] = 'public'; 
    $data['status'] = 'temporary'; 
    $data['user_id'] = $_REQUEST['user_id']; 
    $paths = $media->add($data, $extension, $dbAdapter); 

    // save the photo 
    move_uploaded_file($tempFile, 
         BASE_PATH . '/public/' . $paths[0]); 

    // create a thumbnail 
    include BASE_PATH . '/library/My/PHPThumbnailer/ThumbLib.inc.php'; 
    $thumb = PhpThumbFactory::create('/' . $paths[0]); 
    $thumb->adaptiveResize(85, 85); 
    $thumb->save(BASE_PATH . '/public/' . $paths[1]); 

    // add watermark to the bottom right corner 
    $pathToFullImage = BASE_PATH . '/public/' . $paths[0]; 
    $size = getimagesize($pathToFullImage); 
    switch ($extension) { 
     case 'gif': 
      $im = imagecreatefromgif($pathToFullImage); 
      break; 
     case 'jpg': 
      $im = imagecreatefromjpeg($pathToFullImage); 
      break; 
     case 'png': 
      $im = imagecreatefrompng($pathToFullImage); 
      break; 
    } 
    if (false !== $im) { 
     $white = imagecolorallocate($im, 255, 255, 255); 
     $font = BASE_PATH . '/public/fonts/arial.ttf'; 
     imagefttext($im, 
        13, // font size 
        0, // angle 
        $size[0] - 132, // x axis (top left is [0, 0]) 
        $size[1] - 13, // y axis 
        $white, 
        $font, 
        'HunnyHive.com'); 
     switch ($extension) { 
      case 'gif': 
       imagegif($im, $pathToFullImage); 
       break; 
      case 'jpg': 
       imagejpeg($im, $pathToFullImage, 100); 
       break; 
      case 'png': 
       imagepng($im, $pathToFullImage, 0); 
       break; 
     } 
     imagedestroy($im); 
    } 

    echo "1"; 

} 
+0

「'false!== $ im'」 - 認真,*什麼* *? – 2009-10-25 15:28:10

回答

2

當調試任何有關AJAX我想提出以下建議:

  • 確保文件正確地返回沒有任何AJAX包裝的數據。用一些示例數據直接調用文件。它會返回你所需要的嗎?它有語法錯誤嗎?這是你想要檢查的第一件事,它會爲你節省很多頭痛。

  • 確保您的Javascript正確解析數據。你的JS可能期望JSON,但是你要返回XML,或者你的返回數據沒有按照你的想法格式化,或者你可能需要使用Javascript評估你返回的數據,以便它可以被實際使用。嘗試一些console.log()來測試你的數據是什麼樣的。

  • 嘗試類似Postbin這可讓您發送POST數據。確保您的POST數據是正確的,並且您將正確的數據發送到您的腳本。

2

你可以用一個文件輸入創建一個簡單的表單,然後用它來簡化測試。

這是我看到的最簡單的方式,別人可能有更好的想法。

5

對於一般的調試,您應該將步驟分解爲函數並依次測試每個部分。

關於Ajax調試,您可能會喜歡嘗試Zend_Log_Writer_FirePHP。它是Firebug的一個擴展,它讀取PHP發送的頭文件中的額外數據,這意味着響應正文中的數據不包含調試輸出,並且對於像圖像這樣的東西仍然可以呈現。

一旦你安裝FirePHP Firebug的,你可以像下面幾行:

$wFirebug = new Zend_Log_Writer_Firebug(); 

$firebug = new Zend_Log($wFirebug); 

$firebug->info($myArray); 

$firebug->info('Got to line 10'); 
1

我發現,與動作正在ZF通過AJAX稱爲工作的時候,它總是一個好主意,以確保行動工作沒有 AJAX第一。也就是說,讓你第一次開發功能結果的代碼轉到新頁面來表示你正在做的動作。

一旦你知道你的PHP代碼有效,你就可以開始擔心使AJAX的東西工作。在我看來,至少,當你查看另一個頁面時,能夠在變量上輸出Zend_Debug :: dump()對初始開發來說更容易。

AJAX按設計創建了一層不透明度,可能會導致難以執行此操作。如果你與一個jQuery插件進行交互,那麼它會變得更加困難,因爲它需要格式化的數據,因爲某些原因你不能獲取這些數據。再次,PHP首先,AJAX第二。 ZF需要大約兩秒的時間才能從PHP到AJAX呼叫,反之亦然。

0

使用回調函數進行AJAX請求,回調函數檢查PHP函數返回的數據(echo'd)。如果數據echo'd是某個預先確定的成功字符串(「成功」?),那麼一切都很好,如果不是這樣,就讓回調函數輸出由函數輸出的任何東西。

1

最簡單的解決方案是使用FirePHP;爲firefox安裝firebug + firephp addon,並在你的項目中包含這些類。

(我把FirePHP庫在/ usr /共享/ PHP /所以我可以很容易地包括在任何項目)

然後只是這樣做:

require_once('/path/to/FirePHPCore/FirePHP.class.php'); 
$fp = FirePHP::getInstance(true); 
$fp->log('you can put anything here, vars, objects, arrays, etc'); 

它將輸出響應FireBug控制檯,並且比在調試Ajax時用回聲和var_dumps污染代碼要好得多!