2016-01-22 3 views
1

Я создал сценарий для создания эскизов с использованием библиотеки GD для PHP. Дело в том, что исходные изображения находятся в соответствующих каталогах, которые назначены 'gallery/'.$section; и пальцы будут идти в каталоге 'gallery/thumbs/'.$sectionНевозможно использовать переменную внешнюю функцию даже после ее установки global

Теперь, каждый раз, когда выполняется скрипт я хочу, чтобы проверить, если эскиз уже существует, и если не только потом создавать его, но всякий раз, когда я вызываю функцию и перезагружаю страницу, она каждый раз создает новый эскиз.

Я знаю, что речь идет о сфере видимости переменной внутри и снаружи функции, но что я не могу понять. Я попытался установить переменную как глобальную, но все же она не работает.

Это предварительная декларация. idir предназначен для каталога изображений, а tdir предназначен для каталога больших пальцев.

<?php 
$idir = "gallery/".$section.'/'; 
$tdir="gallery/thumbs/".$section.'/'; 
if(!file_exists($tdir)){ 
mkdir($tdir); 
} 

Это функция, которую я использую.

function createThumbs($idir, $tdir, $tw, $th){ 
    $dir=opendir($idir); 
    while(($fname = readdir($dir)) != false){ 
     if($fname!='.' && $fname != '..'){ 
     $img = imagecreatefromjpeg($idir.$fname); 

     $width = imagesx($img); 
     $height = imagesy($img); 

     if($width>$height){ 
      $new_width=$tw; 
      $new_height=$height*($tw/$width); 
     } 
     if ($width < $height) 
     { 
      $new_width=$width*($th/$height); 
      $new_height=$th; 
     } 
     if ($width == $height) 
     { 
      $new_width=$tw; 
      $new_height=$th; 
     } 


     $tmp_img = imagecreatetruecolor($new_width, $new_height); 
     imagecopyresampled($tmp_img, $img, 0,0,0,0, $new_width, $new_height, $width, $height); 

     imagejpeg($tmp_img, $tdir.$fname, 100); 

     imagedestroy($tmp_img); 
     imagedestroy($img); 
    } 
} 
closedir($dir); 
} 

И после этого я вызываю функцию подобным образом.

if (!file_exists($tdir.$fname)) { 
    createThumbs($idir,$tdir,250, 200); 
} 

Также при вызове функции он дает ошибку - undefined variable .$fname.

+0

, что означает '$ fname' не был определен ... и на основе отображаемого кода он не был. – cmorrissey

+0

$ fname = readdir ($ dir) –

+0

Хорошо, у вас есть '$ fname' в функции, но что такое' $ fname' в разделе 'file_exists'? –

ответ

1

Вы вводите значение для $fname внутри функции, тогда при первом попытке получить значение $fname оно никогда не было инициализировано, таким образом, вы получите ошибку.

Это может помочь вам двигаться, если заявление внутри время цикла:

function createThumbs($idir, $tdir, $tw, $th){ 

    $dir=opendir($idir); 
    while(($fname = readdir($dir)) != false){ 
     if($fname!='.' && $fname != '..' && !file_exists($tdir.$fname)){ 
     $img = imagecreatefromjpeg($idir.$fname); 

     $width = imagesx($img); 
     $height = imagesy($img); 

     if($width>$height){ 
      $new_width=$tw; 
      $new_height=$height*($tw/$width); 
     } 
     if ($width < $height) 
     { 
      $new_width=$width*($th/$height); 
      $new_height=$th; 
     } 
     if ($width == $height) 
     { 
      $new_width=$tw; 
      $new_height=$th; 
     } 


     $tmp_img = imagecreatetruecolor($new_width, $new_height); 
     imagecopyresampled($tmp_img, $img, 0,0,0,0, $new_width, $new_height, $width, $height); 

     imagejpeg($tmp_img, $tdir.$fname, 100); 

     imagedestroy($tmp_img); 
     imagedestroy($img); 
     } 
    } 
    closedir($dir); 
} 

А потом всегда называют создание миниатюр:

//if (!file_exists($tdir.$fname)) { 
    createThumbs($idir,$tdir,250, 200); 
//} 
+0

Да. Что помогает. Спасибо чувак. Но вы уверены, что это самый эффективный способ сделать это. –

+0

Не уверен в эффективности этого решения, он просто исправит код, который вы предложили. Я предлагаю вам использовать для этого профилировщик. –

Смежные вопросы