imagecreatefromjpeg() и аргумент из базы данных

AdeL1ne

Новичок
Здравствуйте! Столкнулся со следующей проблемой:
Возникает ошибка при попытке получить в цикле пути к изображению в качестве аргумента к функции imagecreatefromjpeg() -
PHP:
$result = mysql_query("SELECT img_path FROM table1");
for ($i=0;$i<mysql_num_rows($result);$i++)
 {
     $myrow[$i] = mysql_fetch_array($result);
     $image = imagecreatefromjpeg("'".$myrow[$i]['img_path']."'");
}
Ошибка: Warning: imagecreatefromjpeg('img/1.jpg') [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in ...

Если просто прописать:
PHP:
$image = imagecreatefromjpeg('img/1.jpg');
то все, конечно, работает. В чем может быть проблема?
 

Dovg

Продвинутый новичок
Текущая директория разная, например.
Попробуй использовать абсолютные пути.
 

AdeL1ne

Новичок
Текущая директория разная, например.
Попробуй использовать абсолютные пути.
Пробовал так,
PHP:
$result = mysql_query("SELECT img_path FROM table1");
for ($i=0;$i<mysql_num_rows($result);$i++)
 {
     $myrow[$i] = mysql_fetch_array($result);
     $image = imagecreatefromjpeg($myrow[$i]['img_path']);
}
В $myrow[$i]['img_path'] лежит 'http://localhost/modalreg/img/1.jpg' именно с кавычками. Тогда выскакивает такая ошибка:
Warning: imagecreatefromjpeg('http://localhost/modalreg/img/1.jpg') [function.imagecreatefromjpeg]: failed to open stream: Invalid argument
 

AdeL1ne

Новичок
Короче если в $myrow[$i]['img_path'] положить значение img/1.jpg без кавычек и потом сделать:
PHP:
$result = mysql_query("SELECT img_path FROM table1");
for ($i=0;$i<mysql_num_rows($result);$i++)
 {
     $myrow[$i] = mysql_fetch_array($result);
     $image = imagecreatefromjpeg($myrow[$i]['img_path']);
}
то сервер apache выдает ошибку. Делаю все в denwer...
 

Gremboloid

инженера Гр...
1. в описании функции imagecreatefromjpeg прочитай что написано в рамке.
2. Не делай так. лучше пересмотри алгоритм, чтобы использовать в качестве параметра путь файловой системы а не урлы.
 

AdeL1ne

Новичок
1. в описании функции imagecreatefromjpeg прочитай что написано в рамке.
2. Не делай так. лучше пересмотри алгоритм, чтобы использовать в качестве параметра путь файловой системы а не урлы.
разве img/1.jpg это URL?

Мне нужно в цикле вытаскивать картинки из базы, делать им подписи (причем каждый раз разные) функцией imagettftext и сохранять в другое место. Как это сделать другим способом?
 

AdeL1ne

Новичок
Короче попробовал вытащить из базы одну строчку в цикле - все нормально, а если больше, то апаче срубается.
Пробовал уже добавить в конце функцию imagedestroy($image);
PHP:
for ($i=0;$i<mysql_num_rows($result);$i++)
                    {
                        $myrow[$i] = mysql_fetch_array($result);
                        $image = imagecreatefromjpeg($myrow[$i]['src']); /*$myrow[$i]['src'] = img/1.jpg*/
                        imagedestroy($image);
                    }
Не помогло :(
 

AdeL1ne

Новичок
ИСПОЛЬЗУЙ АБСОЛЮТНЫЕ ПУТИ, БЛЕА
пробовал даже вот так:
PHP:
define ('DS', DIRECTORY_SEPARATOR);
$dir = dirname(__FILE__);
$image = imagecreatefromjpeg($dir.DS.$myrow[$i]['src_folder'].DS.$myrow[$i]['src_file']);
/*$myrow[$i]['src_folder'] = img, $myrow[$i]['src_file'] = 1.jpg*/
Один фиг в цикле приложение apache рубится, БЛЕА
 

AdeL1ne

Новичок
PHP:
echo $dir.DS.$myrow[$i]['src_folder'].DS.$myrow[$i]['src_file'];
что выводит?
Z:\home\localhost\www\ModalReg\img\1.jpg

Может кто не понял, но апаче рубится на уровне приложения.
Если вместо
PHP:
imagecreatefromjpeg($dir.DS.$myrow[$i]['src_folder'].DS.$myrow[$i]['src_file']);
сделать просто
PHP:
imagecreatefromjpeg($myrow[$i]['src']);
, где $myrow[$i]['src'] = img/1.jpg, результат будет тот же - ошибка. Конечно если выводить в цикле:
PHP:
for ($i=0;$i<mysql_num_rows($result);$i++)
{
$myrow[$i] = mysql_fetch_array($result);
imagecreatefromjpeg($dir.DS.$myrow[$i]['src_folder'].DS.$myrow[$i]['src_file']);
}
 

Dovg

Продвинутый новичок
Z:\home\localhost\www\ModalReg\img\1.jpg - этот файл есть, прав на чтение апачу хватает?
 

AdeL1ne

Новичок
Наверно хватает.. Проблема то в цикле, а не в правах. Напишу вообще как можно более понятно суть проблемы:

В таблице БД есть 4 записи, содержащие путь до картинки в поле
PHP:
$myrow[i]['src']: img/1.jpg, img/2.jpg, img/3.jpg, img/4.jpg
Если сделать цикл из одного элемента:
PHP:
for ($i=0;$i</*mysql_num_rows($result)*/1;$i++)
{
    $myrow[$i] = mysql_fetch_array($result);  
    imagecreatefromjpeg($myrow[$i]['src']);
}
то все нормально, тоесть 1 элемент из базы вытаскивается функцией imagecreatefromjpeg вполне себе успешно,
но если цикл делать по всем записям:
PHP:
for ($i=0;$i<mysql_num_rows($result);$i++)
{
    $myrow[$i] = mysql_fetch_array($result);  
    imagecreatefromjpeg($myrow[$i]['src']);
}
то сервер апаче рубится как приложение. Может конечно дело в денвере или в компе моем глючном, может кто попробует у себя воссоздать мою ситуацию и посмотреть, будет ли у него это работать как надо? Главная цель - что бы пути картинок вытаскивались из бд в цикле в качестве аргументов функции imagecreatefromjpeg...
 

Dovg

Продвинутый новичок
Ты специально выдаешь информацию по частям, чтобы других ввести в заблужение?
Проблема не в цикле, а в том, что ты не хочешь заняться отладкой.
http://phpfaq.ru/debug тебе в помощь
 

AdeL1ne

Новичок
Я не спец в отладке, но в логах apache ничего не вижу (или не понимаю), а этот код:
PHP:
ini_set('display_errors',1);
error_reporting(E_ALL ^E_NOTICE);
просто не отрабатывается, потому что страница вообще не грузится. Если хочешь помочь, то создай страницу с кодом:
PHP:
<?php
    $db = mysql_connect ("localhost","ПОЛЬЗОВАТЕЛЬ", "ПАРОЛЬ");
    if (!$db) {echo "ERROR ".mysql_errno()." ".mysql_error()."\n";}
    else {mysql_select_db ("ТВОЯ_БАЗА_ДАННЫХ",$db);}
    $result = mysql_query("SELECT src FROM ТВОЯ_ТАБЛИЦА",$db);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>title1</title>
</head>
<body>
<?php
for ($i=0;$i<mysql_num_rows($result);$i++)
{
    $myrow[$i] = mysql_fetch_array($result);  
    imagecreatefromjpeg($myrow[$i]['src']);
}
?>
</body>
</html>
Создай таблицу с полем src - тип VARCHAR, занеси туда несколько значений типа img/1.jpg, img/2.jpg, img/3.jpg, img/4.jpg Положи картинки в соответствующее место и проверь, нормально у тебя все работает или нет?
Вот у меня, например, если в таблице больше двух строк, то этот код убивает веб-сервер наповал.
 

AdeL1ne

Новичок
Все оказало еще интереснее, дело в том, что у меня часть картинок, не смотря на расширение jpg, оказалась в формате png и поэтому функция imagecreatefromjpeg весила намертво сервер apache.

И вот в связи с этим вопрос, а как проверять изображения, если их расширения были изменены вручную?
$_FILES['filename']['type'] - выдает именно расширение файла...
 

KorP

Новичок
$_FILES['filename']['type'] возвращает расширение? 0_о я что то забыл видимо. миме-тайп он возвращал, аля image/jpeg
exif_imagetype() заюзай
 

AdeL1ne

Новичок
$_FILES['filename']['type'] возвращает расширение? 0_о я что то забыл видимо. миме-тайп он возвращал, аля image/jpeg
exif_imagetype() заюзай
да, он выдает image/jpeg, но согласно расширению файла. тоесть если переименовать png в jpg, он выдаст image/jpeg.
 
Сверху