imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 30.07.2004, 10:09     # 1
SergeyFastEye
Guest
 
Сообщения: n/a

Question Поможите!

<?
$db_mysql = "blablabla";

function connect ($host_mysql = "localhost:3306",$user_mysql = "qwe", $pswd_mysql = "wer") {
return mysql_connect($host_mysql,$user_mysql,$pswd_mysql); }

function konkurs ($db_mysql,$id) {
return mysql_db_query($db_mysql,"select * from CHEGOTO where ID=".$id);
}


$conn =connect();
$result = konkurs ($db_mysql,1);
while ($info = mysql_fetch_array($result)) { print $info[PHOTO]; }
mysql_free_result($result);
?>

Есть такой вот скриптик. выбираю из таблицы все записи с условием $id.
Таких записей у меня 2. Ваваливаю одно из полей (в поле лежат фотки, тип: longblob). Проблема, если вываливаю поле с фотками, то на странице отображается, только первая из них, если любое другое поле (строковые поля), то вываливает данные подряд всех записей.
Мне надо чтобы он выкладывал все фотки какие найдет под таким $id.
В чем косяк?
 
Старый 30.07.2004, 10:48     # 2
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
SergeyFastEye,
$info[PHOTO] -- это нехорошо.. это константа, PHP ругнется и сделает из нее строку 'PHOTO'. если такое поле есть, то все ок.
а вообще, по тому, что ты привел.. вроде все нормально. если не трудно, то посмотреть бы нормальные запросы, и результаты их работы
__________________
Nunc est bibendum
is_absent вне форума  
Старый 30.07.2004, 11:04     # 3
SergeyFastEye
Guest
 
Сообщения: n/a

ладно постараюсь выложить куда-нить, чтобы с Нета бало доступно.
А результаты никакие, все работает, если поле указываю строкового типа. Если картинка, то только одну фотку выкладывает и только первую
 
Старый 30.07.2004, 12:54     # 4
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
то есть если "select title, name ..." то все записи выводятся, а если "select photo ..." то только одна фотография?
ты хочешь чтобы они все выводились на одной странице?
__________________
Nunc est bibendum
is_absent вне форума  
Старый 30.07.2004, 14:46     # 5
SergeyFastEye
Guest
 
Сообщения: n/a

Цитата:
Сообщение от is_absent
то есть если "select title, name ..." то все записи выводятся, а если "select photo ..." то только одна фотография?
ты хочешь чтобы они все выводились на одной странице?
Так точно: 2 фотки на одной страничке.

не совсем. вывод меняем тут.
while ($info = mysql_fetch_array($result)) { print $info[PHOTO]; }
выводится всего одна фотка

while ($info = mysql_fetch_array($result)) { print $info[name]; }
выводится 2 name'а
 
Старый 30.07.2004, 15:04     # 6
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
SergeyFastEye
Понятно. фотки тоже две выводятся.. только показывается одна. посмотри исходник странички.
как бороться с этим не знаю. можно попробовать выводить в отдельный iframe каждую картинку.. можно сохранять на диск, и выводить в теге <img>...

можно попробовать imagecreatefromstring()
__________________
Nunc est bibendum
is_absent вне форума  
Старый 30.07.2004, 15:39     # 7
ivahaev
::VIP::
шайтан-башка
 
Аватар для ivahaev
 
Регистрация: 31.03.2003
Адрес: imho.ws Тюменское отделение
Сообщения: 1 902

ivahaev СуперБогivahaev СуперБог
ivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБогivahaev СуперБог
Скажу одно - в html картинки выводятся тэгом IMG, и ни чем другим. следовательно, надо делать не print в php, а по-другому...
содзается пустой php файл (скажем, img.php), в котором пишешь только один оператор на вывод этой картинки (через параметр), а в главном файле делаешь его вызов.

Т.е.:
Код:
$conn =connect();
$result = konkurs ($db_mysql,1);
while ($info = mysql_fetch_array($result)) { print "<img src=img.php?$img=$info[PHOTO]>"; }
И в img.php:
Код:
<? print $img ?>
Что-то типа того. В теории так. проверить не имею пока возможности.

Последний раз редактировалось ivahaev; 30.07.2004 в 15:45.
ivahaev вне форума  
Старый 30.07.2004, 15:58     # 8
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
ivahaev
не пройдет.. гетом можно совсем немножко передавать...

Цитата:
print "<img src=img.php?$img=$info[PHOTO]>";
бакса перед между ? и img не надо. и значение массива выводить как ${info[PHOTO]} либо "<img src=\"img.php?img=" . $info[PHOTO] ."\">";
__________________
Nunc est bibendum
is_absent вне форума  
Старый 30.07.2004, 17:30     # 9
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Ребята, ivahaev, is_absent вы оба правы но не совсем доконца.
Действительно, методом ГЕТ большие бинарные строки лучше не пердавать в общем случае. И действительно нужно выводить фотографию через отдельный скриптик, при этом необходимо еще выводить заголовки в браузер, вроде "header('Content-type: image/jpeg');". При этом из файла img.php можно выводить только по одной фотографии!!!. Тоесть подводя итог, д.б. нечто наподобие следующего:

Основной код:
Код:
<?
$db_mysql = "blablabla";

function connect ($host_mysql = "localhost:3306",$user_mysql = "qwe", $pswd_mysql = "wer") {
return mysql_connect($host_mysql,$user_mysql,$pswd_mysql) ; }

function konkurs ($db_mysql,$id) {
list($count) = mysql_fetch_row(mysql_db_query($db_mysql,"select count(*)
 from CHEGOTO where ID=".$id));//Посчитаем сколько будет фоток
    for ($i=0; $i<=$count; $i++){
    print "<img src=id=$id&i=$i>";
    }
}
?>
img.php:
Код:
<?
function connect ($host_mysql = "localhost:3306",$user_mysql = "qwe", $pswd_mysql = "wer")
return mysql_connect($host_mysql,$user_mysql,$pswd_mysql);
}

$conn =connect();

list($foto) = mysql_fetch_row(mysql_db_query($db_mysql,"select PHOTO from CHEGOTO where ID='$id' limit $i, $i"));//Получаем фотографию из базы
header('Content-type: image/jpeg');
print $foto;
?>
P.S. Прошу прощения за синтаксические ошибки (если будут) - я писал чтобы показать принцип решения поставленной задачи. Надеюсь все понятно.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 30.07.2004, 22:31     # 10
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Hubbitus
два раза в базу коннектиться... нехорошо.. а в остальном -- скорее всего самоем простое решение
Цитата:
при этом необходимо еще выводить заголовки в браузер, вроде "header('Content-type: image/jpeg');".
Тут неправда твоя. совершенно необязательно. если заголовка не будет, тип документа будет определен по контенту.
__________________
Nunc est bibendum
is_absent вне форума  
Старый 31.07.2004, 00:14     # 11
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
is_absent:
два раза в базу коннектиться... нехорошо.. а в остальном -- скорее всего самоем простое решение
Чтобы два раза не коннектится можно использовать постоянные соединения, но запрос всеравно будет не один. Причем запросов 2 только в конкретном примере вопроса, у меня же написан общий алгоритм, и запросов буден N в общем случае - по количеству выводимых фотографий. Естественно это достаточно большой минус, но он, помоему, не слишком существенен. Как альтернатива - можно передавать фотографии для отображения в сессии или методом ПОСТ, в каждом конкретном случае нужно выбирать оптимальный способ для конкретной задачи, но мне кажется приведенное мною выше решение в большинстве случаев будет более оптимальным.
Цитата:
is_absent:
Тут неправда твоя. совершенно необязательно. если заголовка не будет, тип документа будет определен по контенту.
Скажем так, будет предпринята попытка определить тип документа. Поэтому выводить заголовок очень рекомендуется.

Ну раз уж меня начали поправлять и критиковать, то тогда тоже замечу мимоходом :
Цитата:
is_absent:
Цитата:
ivahaev
print "<img src=img.php?$img=$info[PHOTO]>";
бакса перед между ? и img не надо. и значение массива выводить как ${info[PHOTO]} либо "<img src=\"img.php?img=" . $info[PHOTO] ."\">";
Про знак вопроса - согласен (скорее всего ivahaev просто описался), а вот со вторым замечанием не согласен, оно верно для более сложных случаев (примеры в МАНуале), а вот в простейшем, как здесь, PHP нормально все поймет, попробуйте следующий код:
Код:
<?
$ttt[qw]=12345;
print "Переменная ttt равна$ttt[qw]вот так";
?>
Совсем другое дело что выше предполагалось подставить бинарную строку в адрес, не попытавшись никак ее енкодить и экранировать, вот этого никто не заметил
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.

Последний раз редактировалось Hubbitus; 31.07.2004 в 00:17.
Hubbitus вне форума  
Старый 31.07.2004, 00:39     # 12
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
кстати, если connection string тот же самый, то снова реального коннекта не будет(в mysql по крайней мере), функция просто вернет новый идентификатор, но ресурсы загружаться по новой не будут.

главное не делать mysql_close().
__________________
убрано по просьбе администратора
Sheryld вне форума  
Старый 31.07.2004, 00:57     # 13
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Sheryld
что значит не будет? скрипт отработал -- php сам отрубил коннект. даже если ты его не закрыл.

Цитата:
Hubbitus:
Совсем другое дело что выше предполагалось подставить бинарную строку в адрес, не попытавшись никак ее енкодить и экранировать, вот этого никто не заметил
я ее подставлять не говорил.. а как раз наоборот

ну и вообще к вопросу о хранении изображения в базе.. может все-таки на файлики перейти? ) все сразу и отпадет... делать, как предлагал Hubbitus только вместа $id, передавать имя файлика в скрипт. и с коннектом проблем не будет, и с количеством запросов.

и еще...
"limit $i, $i" -- получить $i(вторая) строк начиная со строки с номером $i(первая)... не это надо однако... limit $i, 1 имхо должно быть..
__________________
Nunc est bibendum
is_absent вне форума  
Старый 31.07.2004, 01:17     # 14
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
is_absent:
я ее подставлять не говорил.. а как раз наоборот
is_absent, я и не говорил что ты предлагаешь подставлять, я лишь заметил что не на те ошибки было внимание акцентировано...
Цитата:
is_absent:
что значит не будет? скрипт отработал -- php сам отрубил коннект. даже если ты его не закрыл.
Не могу утверждать (нужно попробовать) но возможно действительно и не закроется соединение, ведь для фотографии вызовется скрипт ДО того как полностью отработает основной...
Цитата:
is_absent:
ну и вообще к вопросу о хранении изображения в базе.. может все-таки на файлики перейти? ) все сразу и отпадет... делать, как предлагал Hubbitus только вместа $id, передавать имя файлика в скрипт. и с коннектом проблем не будет, и с количеством запросов.
Изображения действительно лучше хранить в файлах - как минимум это намного быстрее (хотя есть доводы в пользу того и другого подходов). Но если так хранить, тогда совсем не нужно городить как я предлагал выше, можно прямо из основного скрипта писать тег <img> и никуда не нужно передавать имя файлика!!!
Цитата:
is_absent:
и еще...
"limit $i, $i" -- получить $i(вторая) строк начиная со строки с номером $i(первая)... не это надо однако... limit $i, 1 имхо должно быть..
Безусловно!!! Здесь ты абсолютно прав... я уже извинялся заранее за ляпы...
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 31.07.2004, 01:58     # 15
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Цитата:
Hubbitus:
Не могу утверждать (нужно попробовать) но возможно действительно и не закроется соединение, ведь для фотографии вызовется скрипт ДО того как полностью отработает основной
ты же не включаешь код скрипта. а пишешь в поток. браузер загрузит страницу (если не используется буферизация, это произойдет после выполнения скрипта) найдет там рисунки и опять начнет спрашивать у сервера.. кажется так...
Цитата:
Hubbitus:
Но если так хранить, тогда совсем не нужно городить как я предлагал выше, можно прямо из основного скрипта писать тег <img> и никуда не нужно передавать имя файлика!!!
логично. виноват. собственно это и хотел сказать...
__________________
Nunc est bibendum
is_absent вне форума  
Старый 31.07.2004, 03:45     # 16
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

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

открывается соединение(но connection string не меняется),
делается запрос,
идет обработка результата(скажем в ассоциативный массив).

а теперь запихни эту функцию в цикл(скажем 100.000 итераций) и смотри что будет с конекшинами(любым монитором для mysql).

в моих "опытах", mysql не открывал каждый раз новый connection.

http://imho.ws/showthread.php?t=64225 - вот тут я писал об этом.

я имею ввиду следущую вещь:

можно коннектиться сколько угодно много раз к базе, это не скажеться на производительности, если соединение не закрыто, и connection string не меняется. мое имхо, там присутсвует внутренний connection pool, который как раз и занимается непосредственно реальными коннектами к базе, а mysql_connect - это всего лишь обращение к pool.

я когда проектирую функции бизнес-логики, то делаю примерно так:

Код:
function GetItenById($itemId)
{
   $db = new myDbClass();  // это мой класс работы с mysql(там ничего особенного нету)
   $db->Connect();
   
   $db->Select("query");

   //тут обработка и сохранение данных(в полях класса например)
   .... 
   //в конце не закрываю connection
}
далее использую скажем вот так:

Код:
for($i=0;$i<1000;$i++)
{
   GetItenById($i);
}
и никаких напрягов вобщем-то нету. и даже не нужно юзать этот пресловутый pconnect.

может, я конечно не прав.
__________________
убрано по просьбе администратора
Sheryld вне форума  
Старый 31.07.2004, 04:01     # 17
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Sheryld:
далее использую скажем вот так:
Код:
for($i=0;$i<1000;$i++) { GetItenById($i); }

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

может, я конечно не прав.
А почему бы сразу не запросить 1000 строк, а по одной - это же в любом случае гораздо медленне?!

Ну и это какраз другой случай - здесь куча обращений к базе в одном скрипте - естественно никто и не говорит что в одном скрипте нужно для каждого запроса коннектится к базе.

P.S. А вообще, Вам всем, не кажется, что мы очень далеко отклонились от темы вопроса? Можно создать новый топик, если это интересно... Да и автор сам молчит...
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 31.07.2004, 13:45     # 18
SergeyFastEye
Guest
 
Сообщения: n/a

Я не молчу, просто только сейчас до компа добрался, а до всвоего домашнего так и до сих пор добраться не могу. Потому нет возможности выложить результаты и принять направленное участие в обсуждении.
Идея с отдельным файликом неплохая, жаль сам не сообразил.
 
Старый 01.08.2004, 22:00     # 19
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Sheryld
в твоем случае, все действия выполняются в одном скрипте и одном запросе к серверу. В этом случае, ты конечно прав. но если вызывается другой скрипт (не включается, а вызывается), то он начнет выполнятся только после того, как ответ от текущего скрипта придет к браузеру. а придет этот ответ (в общем случае) после того, как отработает весь скрипт.
это означает, что даже если ты сам не закрыл соединение с базой данных (или любой другой ресурс), то PHP сам оборвет это соединение.

в данном случае, если SergeyFastEye будет хранить изображения в файловой системе, то никаких дополнительных скриптов не понадобится (см пост 13 и 14). В противном случае - об этом уже говорилось выше - будет созаваться еще одно соединение с базой данных.
__________________
Nunc est bibendum
is_absent вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 01:58.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.