Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: изменение размера фото - выдает Resourse id#7
 
 автор: padalka   (16.06.2011 в 12:52)   письмо автору
 
 

Привет! У меня такая задача - вытащить из базы данных названия файлов фотографий (сами ж фотографии сохраняются в папке) и уменьшить их для удобства просмотра. Без применения imagecreatefromjpeg вытаскивает из базы нормально, только пытаюсь оптимизировать функцию на уменьшения размера фотографий - в качестве результата плучаю Resourse id#7. Как правильно использовать imagecreatefromjpeg, чтоб получить необходимый результат.
Код без imagecreatefromjpeg
function img_watch_process()
{
mysql_connect("localhost", "root", "");
mysql_select_db('rod');
$sql="select `mother_name`, `mother_surname`, `father_name`, `father_surname`, `file_name1`, `file_name2`, `file_name3` from `contact_info` where `surname`='".$_POST['surname']."'";
$result = mysql_query($sql);
while ($data=mysql_fetch_array($result))
{
$mother_name=$data['mother_name'];
$mother_surname=$data['mother_surname'];
$father_name=$data['father_name'];
$father_surname=$data['father_surname'];
$file_name1=$data['file_name1'];
$file_name2=$data['file_name2'];
$file_name3=$data['file_name3'];
}


$current_dir = 'uploads/';
$dir = opendir($current_dir);
$photo1 = '\/'.$file_name1;
$photo2 = '\/'.$file_name2;
$photo3 = '\/'.$file_name3;
while ($file = readdir($dir))
{
$table.= "<img src=\"$current_dir$file$photo1\" alt=\"photo1\"></br></br>";
$table.= "<img src=\"$current_dir$file$photo2\" alt=\"photo2\"></br></br>";
$table.= "<img src=\"$current_dir$file$photo3\" alt=\"photo3\">";
}
$table.= '</ul>';
closedir($dir);
return $table;
}
Спасибо заранее

  Ответить  
 
 автор: cheops   (16.06.2011 в 13:06)   письмо автору
 
   для: padalka   (16.06.2011 в 12:52)
 

Функция imagecreatefromjpeg() возвращает дескриптор, чтобы сохранить его нужно воспользоваться функцией imagejpeg(). Если второй параметр этой функции не указан, изображение выводится в поток, если передать имя файла, оно будет сохранено в файл с этим именем.

  Ответить  
 
 автор: padalka   (16.06.2011 в 13:16)   письмо автору
 
   для: cheops   (16.06.2011 в 13:06)
 

вот такая запись есть
header('Content-Type: image/jpeg');
$img = img_watch_process($file_name1);
imagejpeg($img);
imagedestroy($img);

Куда ее вставить: 1 - в функцию, 2 - в обработчик (index.php)?
О каком втором параметре вы говорите?

  Ответить  
 
 автор: padalka   (16.06.2011 в 13:21)   письмо автору
 
   для: padalka   (16.06.2011 в 13:16)
 

Функция с imagecreatefromjpeg
function img_watch_process($file_name1)
{
mysql_connect("localhost", "root", "");
mysql_select_db('rod');
$sql="select `mother_name`, `mother_surname`, `father_name`, `father_surname`, `file_name1`, `file_name2`, `file_name3` from `contact_info` where `surname`='".$_POST['surname']."'";
$result = mysql_query($sql);
$table="<h3>Фотографии {$_POST['surname']}</h3></br>";
while ($data=mysql_fetch_array($result))
{
$mother_name=$data['mother_name'];
$mother_surname=$data['mother_surname'];
$father_name=$data['father_name'];
$father_surname=$data['father_surname'];
$file_name1=$data['file_name1'];
}

$table.= @imagecreatefromjpeg("uploads/$file_name1");

return $table;

и вывод (в index.php)
header('Content-Type: image/jpeg');
$img = img_watch_process($file_name1);
imagejpeg($img);
imagedestroy($img);

  Ответить  
 
 автор: cheops   (16.06.2011 в 13:39)   письмо автору
 
   для: padalka   (16.06.2011 в 13:21)
 

Нет, так не получится. Одно изображение - один файл, на который из HTML-кода можно сослаться при помощи тэга <img>. Поэтому если вы хотите динамически формировать изображение, этот скрипт нужно создать отдельно от вывода HTML-кода и ссылаться на него из атрибута src img-тэга.

  Ответить  
 
 автор: padalka   (16.06.2011 в 13:43)   письмо автору
 
   для: cheops   (16.06.2011 в 13:39)
 

как вы заметили во втором виде функции тега img вообще нет, так как запись imagecreatefromjpeg("uploads/$file_name1") спокойно открывает папку и достает изображение.

  Ответить  
 
 автор: padalka   (16.06.2011 в 13:56)   письмо автору
 
   для: padalka   (16.06.2011 в 13:43)
 

imagecreatefromjpeg("uploads/$file_name1") спокойно открывает папку и достает изображение при условии, что нет sql запроса, тоесть в отдельном файле проверяла - работает, с базой данных не хочет взаимодействовать.

  Ответить  
 
 автор: cheops   (16.06.2011 в 14:59)   письмо автору
 
   для: padalka   (16.06.2011 в 13:43)
 

>как вы заметили во втором виде функции тега img вообще нет, так как запись
>imagecreatefromjpeg("uploads/$file_name1") спокойно открывает папку и достает изображение.
Его там и не должно быть, этот тэг должен быть там, где вам необходимо вывести изображение, путь к скрипту следует подставить src.

>спокойно открывает папку и достает изображение.
И кроме изображения этот скрипт ничего вывести не сможет. Как ничего кроме изображения не сможет вывести файл image.jpg, чтобы комбинировать изображения и текст необходимо использовать тэг <img>

  Ответить  
 
 автор: padalka   (16.06.2011 в 15:28)   письмо автору
 
   для: cheops   (16.06.2011 в 14:59)
 

Так что-то вроде такого надо записать <img src="imagecreatefromjpeg("uploads/$file_name")" /> ?

  Ответить  
 
 автор: cheops   (16.06.2011 в 15:36)   письмо автору
 
   для: padalka   (16.06.2011 в 15:28)
 

Нет, нужно написать, что-то вроде такого
<img src="image.php?id=345" /> 
где image.php - скрипт, который выводит вам нужное изображение с header(), imagecreatefromjpeg() и пр. Т.е. скрипта как минимум должно быть два: один формирует изображение нужного вам размера, другой выводит его при помощи <img>.

  Ответить  
 
 автор: padalka   (16.06.2011 в 15:49)   письмо автору
 
   для: cheops   (16.06.2011 в 15:36)
 

Правильно я поняла:
src указала на resize.php,
в resize.php не хочет взаимодействовать с mysql. Посмотрите такая запись правильная?
function resize($file_name)
{
mysql_connect("localhost", "root", "");
mysql_select_db('rod');
$sql="select `mother_name`, `mother_surname`, `father_name`, `father_surname`, `file_name1`, `file_name2`, `file_name3` from `contact_info` where `surname`='".$_POST['surname']."'";
$result = mysql_query($sql);
$table="<h3>Фотографии {$_POST['surname']}</h3></br>";
while ($data=mysql_fetch_array($result))
{
$mother_name=$data['mother_name'];
$mother_surname=$data['mother_surname'];
$father_name=$data['father_name'];
$father_surname=$data['father_surname'];
$file_name1=$data['file_name1'];
$file_name2=$data['file_name2'];
$file_name3=$data['file_name3'];
}


$table= @imagecreatefromjpeg("uploads/$file_name1");
$table.= @imagecreatefromjpeg("uploads/$file_name2");
$table.= @imagecreatefromjpeg("uploads/$file_name3");
return $table;
}

header('Content-Type: image/jpeg');
$img = resize($file_name1);
$img. = resize($file_name2);
$img. = resize($file_name3);
imagejpeg($img);
imagedestroy($img);

  Ответить  
 
 автор: cheops   (16.06.2011 в 15:59)   письмо автору
 
   для: padalka   (16.06.2011 в 15:49)
 

>Правильно я поняла:
>src указала на resize.php,
>в resize.php не хочет взаимодействовать с mysql.
Совершенно верно.

>$table= @imagecreatefromjpeg("uploads/$file_name1");
>$table.= @imagecreatefromjpeg("uploads/$file_name2");
>$table.= @imagecreatefromjpeg("uploads/$file_name3");
Один скрипт - один файл. У вас их тут три штуки. Все очень просто файл resize.php представляет собой один image.jpg. По сути вам нужно что-то вроде этого
<img src='resize.php?name=file_name1'>
<img src='resize.php?name=file_name2'>
<img src='resize.php?name=file_name3'>
а resize.php изменить так
function resize($file_name)
{
 $file_name = mysql_escape_string($file_name);
 mysql_connect("localhost", "root", "");
 mysql_select_db('rod');
 $sql="select `mother_name`, `mother_surname`, 
`father_name`, `father_surname`, `file_name1`, 
`file_name2`, `file_name3` from `contact_info`
 where `surname`='".$_POST['surname']."'";
 $result = mysql_query($sql);
 $table="<h3>Фотографии {$_POST['surname']}</h3></br>";
 $data=mysql_fetch_array($result);
 return @imagecreatefromjpeg("uploads/".$data[$file_name]);
 }
 header('Content-Type: image/jpeg');
 $img = resize($_GET['name']);
 imagejpeg($img);
 imagedestroy($img);

  Ответить  
 
 автор: padalka   (16.06.2011 в 16:13)   письмо автору
 
   для: cheops   (16.06.2011 в 15:59)
 

сделала, не получилось.
Может в function.php, где у меня все функци записано вот так.

function img_watch_process()
{
    
    mysql_connect("localhost", "root", "");
    mysql_select_db('rod');
    $sql="select `mother_name`, `mother_surname`, 
`father_name`, `father_surname`, `file_name1`, 
`file_name2`, `file_name3` from `contact_info`
 where `surname`='".$_POST['surname']."'";
    $result = mysql_query($sql);
    
    $table="<h3>Фотографии {$_POST['surname']}</h3></br>";
    
    while ($data=mysql_fetch_array($result))
    {
        $mother_name=$data['mother_name'];
        $mother_surname=$data['mother_surname'];
        $father_name=$data['father_name'];
        $father_surname=$data['father_surname'];
        //$file_name1=$data['file_name1'];
        //$file_name2=$data['file_name2'];
        //$file_name3=$data['file_name3'];
    }

        $table.= "<img src='resize.php?name=file_name1' alt='photo1'></br></br>";
        $table.= "<img src='resize.php?name=file_name2' alt='photo2'></br></br>";
        $table.= "<img src='resize.php?name=file_name3' alt='photo3'>";

    
    return $table;
}

  Ответить  
 
 автор: cheops   (16.06.2011 в 16:28)   письмо автору
 
   для: padalka   (16.06.2011 в 16:13)
 

Вызовите сначала resize.php?name=file_name1 в окне браузера, чтобы убедиться, что он работает и выводит изображение.

  Ответить  
 
 автор: padalka   (16.06.2011 в 16:30)   письмо автору
 
   для: cheops   (16.06.2011 в 16:28)
 

не работает

  Ответить  
 
 автор: cheops   (16.06.2011 в 16:32)   письмо автору
 
   для: padalka   (16.06.2011 в 16:30)
 

Как у вас сейчас выглядит содержимое resize.php?

  Ответить  
 
 автор: padalka   (16.06.2011 в 16:41)   письмо автору
 
   для: cheops   (16.06.2011 в 16:32)
 

resize.php

function resize($file_name)
{
 $file_name = mysql_escape_string($file_name); 
 mysql_connect("localhost", "root", ""); 
 mysql_select_db('rod'); 
 $sql="select `mother_name`, `mother_surname`, 
`father_name`, `father_surname`, `file_name1`, 
`file_name2`, `file_name3` from `contact_info` 
where `surname`='".$_POST['surname']."'"; 
 
 $result = mysql_query($sql); 
 
 $data=mysql_fetch_array($result); 
 return @imagecreatefromjpeg("uploads/".$data[$file_name]); 
 } 
 header('Content-Type: image/jpeg'); 
 $img = resize($_GET['file_name']); 
 imagejpeg($img); 
 imagedestroy($img);

function.php

function img_watch_process()
{
    mysql_connect("localhost", "root", "");
    mysql_select_db('rod');
    $sql="select `mother_name`, `mother_surname`, 
`father_name`, `father_surname`, `file_name1`, 
`file_name2`, `file_name3` from `contact_info` 
where `surname`='".$_POST['surname']."'";
    $result = mysql_query($sql);
    
    while ($data=mysql_fetch_array($result))
    {
        $mother_name=$data['mother_name'];
        $mother_surname=$data['mother_surname'];
        $father_name=$data['father_name'];
        $father_surname=$data['father_surname'];
        $file_name1=$data['file_name1'];
        $file_name2=$data['file_name2'];
        $file_name3=$data['file_name3'];
    }

        $table.= "<img src='resize.php?name=file_name1' alt='photo1'></br></br>";
        $table.= "<img src='resize.php?name=file_name2' alt='photo2'></br></br>";
        $table.= "<img src='resize.php?name=file_name3' alt='photo3'>";

    return $table;
}

index.php - обработчик всех функций

if ($_GET['action']=='surname_img')
    {
        //Просмотр фотографии
        echo img_watch_process();
            
    }

  Ответить  
 
 автор: cheops   (16.06.2011 в 16:44)   письмо автору
 
   для: padalka   (16.06.2011 в 16:41)
 

У вас функция $_POST['surname'] - зависит от POST-данных, скрипт resize.php их не получает (браузер к resize.php обращается независимо от index.php в отдельном потоке), эти данные нужно передать в resize.php через GET-параметры, по аналогии с параметром name и задействовать в SQL-запросе.

  Ответить  
 
 автор: padalka   (16.06.2011 в 16:49)   письмо автору
 
   для: cheops   (16.06.2011 в 16:44)
 

буду пробовать уже вечером. Как вас зовут?

  Ответить  
 
 автор: cheops   (16.06.2011 в 16:53)   письмо автору
 
   для: padalka   (16.06.2011 в 16:49)
 

Зовут меня Игорь, более подробную информацию можно найти в профиле.

  Ответить  
 
 автор: padalka   (16.06.2011 в 16:58)   письмо автору
 
   для: cheops   (16.06.2011 в 16:53)
 

А я то думаю, чего вы на меня времени столько потратили))). Спасибо огромное Игорь, я совсем еще зелененький программист, но быстро учусь. Если вы сможете мне еще писать, буду благодарна за советы. Сейчас мне надо уйти, но вечером вернусь и проверю глобальные массивы. Меня зовут Александра кстати. Хорошего дня.

  Ответить  
 
 автор: padalka   (16.06.2011 в 23:20)   письмо автору
 
   для: cheops   (16.06.2011 в 16:53)
 

Не получилось с $_GET, меняла в функции, которая передает значение фамилии на img_watch_process() и в этой меняла и в resize.php - результат - возвращает на главную старницу.

  Ответить  
 
 автор: cheops   (16.06.2011 в 23:24)   письмо автору
 
   для: padalka   (16.06.2011 в 23:20)
 

Как resize.php сейчас выглядит?

  Ответить  
 
 автор: padalka   (16.06.2011 в 23:40)   письмо автору
 
   для: cheops   (16.06.2011 в 23:24)
 


function resize($file_name)
{
 $file_name = mysql_escape_string($file_name); 
 mysql_connect("localhost", "root", ""); 
 mysql_select_db('rod'); 
 $sql="select `mother_name`, `mother_surname`, 
`father_name`, `father_surname`, `file_name1`, 
`file_name2`, `file_name3` from `contact_info` 
where `surname`='".$_GET['surname']."'"; 
 
 $result = mysql_query($sql); 
 
 $data=mysql_fetch_array($result); 
 return @imagecreatefromjpeg("uploads/".$data[$file_name]); 
 } 
 header('Content-Type: image/jpeg'); 
 $img = resize($_GET['file_name']); 
 imagejpeg($img); 
 imagedestroy($img);

  Ответить  
 
 автор: cheops   (16.06.2011 в 23:43)   письмо автору
 
   для: padalka   (16.06.2011 в 23:40)
 

Вызов скрипта из строки запроса что-нибудь дает?
resize.php?name=file_name1&surname=ЗдесьФамилиюИзcontact_info

  Ответить  
 
 автор: padalka   (16.06.2011 в 23:48)   письмо автору
 
   для: cheops   (16.06.2011 в 23:43)
 

вызов resize.php дает по центру пустой прямоугольник с надписью Изображение

  Ответить  
 
 автор: cheops   (16.06.2011 в 23:51)   письмо автору
 
   для: padalka   (16.06.2011 в 23:48)
 

Значение в GET-параметре surname точно существует в базе данных?

  Ответить  
 
 автор: padalka   (16.06.2011 в 23:46)   письмо автору
 
   для: cheops   (16.06.2011 в 23:24)
 

а functions.php

function img_watch_process() 

    mysql_connect("localhost", "root", ""); 
    mysql_select_db('rod'); 
    $sql="select `mother_name`, `mother_surname`,  
`father_name`, `father_surname`, `file_name1`,  
`file_name2`, `file_name3` from `contact_info`  
where `surname`='".$_POST['surname']."'"; 
    $result = mysql_query($sql); 
     
    while ($data=mysql_fetch_array($result)) 
    { 
        $mother_name=$data['mother_name']; 
        $mother_surname=$data['mother_surname']; 
        $father_name=$data['father_name']; 
        $father_surname=$data['father_surname']; 
        $file_name1=$data['file_name1']; 
        $file_name2=$data['file_name2']; 
        $file_name3=$data['file_name3']; 
    } 

       $table.= "<img src='resize.php?name=$file_name1&"."name=".$_POST['surname']."' alt='photo1'></br></br>";
        $table.= "<img src='resize.php?name=$file_name2&"."name=".$_POST['surname']."' alt='photo2'></br></br>";
        $table.= "<img src='resize.php?name=$file_name3&"."name=".$_POST['surname']."' alt='photo3'>";

    return $table; 
}

Я не знаю, можно ли так записать в ссылку $_POST запрос? А может нужно указать переменную $file_name1... иначе в ссылке получим только текст, а не значение из бд!?

  Ответить  
 
 автор: cheops   (16.06.2011 в 23:54)   письмо автору
 
   для: padalka   (16.06.2011 в 23:46)
 

Вы два раза передаете один и тот же GET-параметр name, первый должен быть name, второй surname
 $table.= "<img src='resize.php?name=$file_name1&".
          "surname=".urlencode($_POST['surname'])."' alt='photo1'></br></br>";

>Я не знаю, можно ли так записать в ссылку $_POST запрос?
Можно, но лучше его пропустить через urlencode(), особенно, если это русские фамилии.

  Ответить  
 
 автор: padalka   (17.06.2011 в 00:03)   письмо автору
 
   для: cheops   (16.06.2011 в 23:54)
 

исправила, по-прежнему ничего. Теперь функция img_watch_process выглядит так:

mysql_connect("localhost", "root", "");
    mysql_select_db('rod');
    $sql="select `mother_name`, `mother_surname`, `father_name`, `father_surname`, `file_name1`, `file_name2`, `file_name3` from `contact_info` where `surname`='".$_POST['surname']."'";
    $result = mysql_query($sql);
    
    while ($data=mysql_fetch_array($result))
    {
        $mother_name=$data['mother_name'];
        $mother_surname=$data['mother_surname'];
        $father_name=$data['father_name'];
        $father_surname=$data['father_surname'];
        $file_name1=$data['file_name1'];
        $file_name2=$data['file_name2'];
        $file_name3=$data['file_name3'];
    }

    
        $table.= "<img src='resize.php?name=$file_name1&"."surname=".urlencode($_POST['surname'])."' alt='photo1'></br></br>";
        $table.= "<img src='resize.php?name=$file_name2&"."surname=".urlencode($_POST['surname'])."' alt='photo2'></br></br>";
        $table.= "<img src='resize.php?name=$file_name3&"."surname=".urlencode($_POST['surname'])."' alt='photo3'>";
    }
    
    return $table;

  Ответить  
 
 автор: padalka   (17.06.2011 в 00:08)   письмо автору
 
   для: padalka   (17.06.2011 в 00:03)
 

Правильно ли я понимаю, когда у нас обработчик доходит до
$table.= "<img src='resize.php?name=$file_name1&"."surname=".urlencode($_POST['surname'])."' alt='photo1'></br></br>";
, то он переходит на resize.php и при этом в $_GET массиве передает значение файла и фамилии, которые и получает resize.php, вытаскивает из папки фото и уменьшает его?

  Ответить  
 
 автор: padalka   (17.06.2011 в 00:15)   письмо автору
 
   для: padalka   (17.06.2011 в 00:08)
 

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

  Ответить  
 
 автор: padalka   (17.06.2011 в 00:21)   письмо автору
 
   для: padalka   (17.06.2011 в 00:15)
 

Игорь, может каким-то другим способом можно уменьшить фотографию пропорционально? У меня уже сил не хватает((((

  Ответить  
 
 автор: padalka   (17.06.2011 в 00:29)   письмо автору
 
   для: padalka   (17.06.2011 в 00:21)
 

я спать, спасибо за сегодняшние попытки))))) Утро вечера мудренней))) спокойной ночи

  Ответить  
 
 автор: cheops   (17.06.2011 в 01:20)   письмо автору
 
   для: padalka   (17.06.2011 в 00:21)
 

>Игорь, может каким-то другим способом можно уменьшить фотографию пропорционально? У
>меня уже сил не хватает((((
Собственно, я пока даже не вижу где у вас происходит уменьшение изображения... пока только динамический вывод. Обычно изображения уменьшают при загрузке (так как динамическое уменьшение потребляет очень много ресурсов), сохраняют ссылку на уменьшенное изображение в базе данных и при выводе ссылаются на него.

В теме по ссылке можно найти функцию для уменьшения изображения http://softtime.ru/forum/read.php?id_forum=1&id_theme=145.

  Ответить  
 
 автор: cheops   (17.06.2011 в 01:16)   письмо автору
 
   для: padalka   (17.06.2011 в 00:15)
 

>но нам же фамилию не обязательно передавать в resize.php так как если выбрались значения
>файлов, то они выбрались из определенной фамилии. Тоесть, нам даже и не надо наверное
>подключаться к бд в resize.php, ведь если у нас есть названия файлов, то imagecreatefromjpeg
>должна их достать.
В сообщении от padalka (16.06.2011 в 23:40) у вас в resize.php имеется SELECT-запрос с WHERE-условием, где используется $_GET['surname'], если этот GET-параметр resize.php не передать, запрос не сработает. Судя по всему он с передачей не срабатывает, поэтому нужно сосредоточиться в первую голову на нем. Для этого его нужно запустить (со всеми нужными ему параметрами) и отладить отдельно от functions.php.

  Ответить  
 
 автор: cheops   (17.06.2011 в 01:12)   письмо автору
 
   для: padalka   (17.06.2011 в 00:08)
 

>Правильно ли я понимаю, когда у нас обработчик доходит до
Совершенно верно.

Первое что нужно сделать, это взять строку (в конечном варианте из HTML-кода)
resize.php?name=$file_name1&"."surname=".urlencode($_POST['surname'])."
и добиться, чтобы по этому адресу открывалось изображение. Потом уже возвращаться к functions.php.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования