<?

if ($handle = @opendir("small")){

    while (false !== ($file = readdir($handle))){
        if ($file != "." && $file != "..") $filesarr[] = trim($file);
    }

    $fotos_per_page = 20;
    $total_pages = ceil(count($filesarr)/$fotos_per_page);

    /* Если страницы с запрашиваемым номером нет, считаем, что номер страницы = 1
       Думаю, дополнительно нужно убедиться, что переданное значение $_GET['from']
        является числом, изменил код

    */
    if (($_GET['from']<1) || ($_GET['from']>$total_pages) || !is_numeric($_GET['from'])){
        $_GET['from']=1;
    }

    for ($i=0; $i<$fotos_per_page; $i++){
        /* Выводим элемент массива с индексом, соответствующим переменной i (которая
              может принимать значения от 0 до 19)

	    Вы выводили одни и те же элементы,
	    НЕЗАВИСИМО от номера запрашиваемой страницы и я изменил код

	*/
	 echo "<img src='small/".$filesarr[$i+(($_GET['from']-1)*$fotos_per_page)]."' border=0><br><br>\n";


    }

    for ($i=0; $i<$total_pages; $i++){

        /* если номер запрашиваемой страницы совпадает со значением переменной i...
	   Мы начали перебор от нуля, значит, при сравнении надо это учесть,
	   ведь нулевой страницы не существует, изменил код */
	if ($i==$_GET['from']-1){
	    /* выводим значение переменной i
	    если это номер страницы, то он должен быть на 1 больше, чем i */
            echo " " . $i+1 . " ";

	} else {
	    echo " <a href='?from=".($i+1)."'>".($i+1)."</a> ";
        }
    }

    closedir($handle);
}

?>
