Перейти к содержимому

Фото
- - - - -

PHP


  • Вы не можете создать новую тему
  • Please log in to reply
7 ответов в этой теме

#1 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 13 августа 2007 - 16:01

короче говоря, загрузил файл в mysql, написал скрипт, чтобы получить оттуда файл (изображение). почему-то нефига не работает, появляется красный крестик. в чем моя ошибка? заранее благодарен
if (isset ($_GET['id']) AND ctype_digit ($_GET['id'])) {



	$id = security ($_GET['id']);

	$query = mysql_query("SELECT * FROM image WHERE id=$id") or die(mysql_error());

	

	if (mysql_num_rows($query)>0) {

	

		$file = mysql_result($query, 0, 'ifile');

		$size = mysql_result($query, 0, 'size');

		$type = mysql_result($query, 0, 'type');

	

		header("Content-length: $size");

		header("Content-type: $type");

		echo $file;

		}

	}

  • 0

#2 kerf

kerf
  • Пользователь
  • 157 сообщений
  • Откуда:Таллинн

Отправлено 13 августа 2007 - 19:15

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

в остальном тебе помогут знающие люди.
  • 0
0001 , 0010 , 0011 , 0100 , 0101 вышел зайчик погулять!
и где же смысл?
IAPB48

#3 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 13 августа 2007 - 20:18

1. действительно ли ссылка на файл существует в базе?

действительно файл существует, столбик типа LONGBLOB, там показан размер в байтах загруженного файла.

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

я просто этот кусок не включил и так понятно, что я бы получил в таком случае ошибку связи с БД
  • 0

#4 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 14 августа 2007 - 00:03

header("Content-length: $size");
header("Content-type: $type");
echo $file;

Если тут всё окей (всё выводится правильно), то наверное картинка в БД у тебя битая... Может пробел стоит вначале скрипта или в конце между <?php и ?>

$file = mysql_result($query, 0, 'ifile');
$size = mysql_result($query, 0, 'size');
$type = mysql_result($query, 0, 'type');

А за такое обычно руки обламывают :) Надо использовать mysql_fetch_* и далее работать с массивом.
  • 0

#5 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 14 августа 2007 - 08:46

simonsays, echo $file, echo $size, echo $type трудно сделать, чтобы проверить не пусты ли они ?
  • 0

#6 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 14 августа 2007 - 22:58

Если тут всё окей (всё выводится правильно), то наверное картинка в БД у тебя битая... Может пробел стоит вначале скрипта или в конце между <?php и ?>

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

А за такое обычно руки обламывают Надо использовать mysql_fetch_* и далее работать с массивом.

а какая разница? с массивом по-моему есть смысл иметь дело когда тебе возвращается более чем одна строчка из БД, так на самом деле удобнее. а когда дело имеем с единственной, то так тоже никто не запрещал делать :)
  • 0

#7 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 14 августа 2007 - 23:07

какая разница? с массивом по-моему есть смысл иметь дело когда тебе возвращается более чем одна строчка из БД, так на самом деле удобнее. а когда дело имеем с единственной, то так тоже никто не запрещал делать

Ты похоже, не понимаешь как работает функция mysql_fetch_assoc она возвращают массив только одного ряда, так бы вернуло массив array( 'file', 'size', 'type' ) с данными. Просто в документации сказано

Работая с большими результатами запросов, следует использовать одну из функций, обрабатывающих сразу целый ряд результата. Так как эти функции возвращают значение нескольких ячеек сразу, они НАМНОГО быстрее mysql_result(). Кроме того учтите, что указание численного смещения работает намного быстрее, чем указание колонки, или колонки и таблицы через точку.

Просто такой стиль может "прижиться" и потом будет сложно отучиваться, так что лучше делать сразу и правильно ;) Я например, использую mysql_result только когда у меня возвращается одно значение, например с запросом, select count(*)... В остальных случаях или объекты или массивы.
  • 0

#8 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 15 августа 2007 - 00:53

Просто такой стиль может "прижиться" и потом будет сложно отучиваться, так что лучше делать сразу и правильно Я например, использую mysql_result только когда у меня возвращается одно значение, например с запросом, select count(*)... В остальных случаях или объекты или массивы.

разумно, буду знать :)
  • 0