upload, store and select image (MySQL etc.)

Ex_Soft

Новичок
upload, store and select image (MySQL etc.)

На'google'лив кучу примеров наваял
PHP:
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Test Upload File</title>
	</head>
	<body>
<?php

foreach($_REQUEST as $key => $val)
{
	if(isset($$key))
		unset($$key);
};

if(get_magic_quotes_gpc())
{
	$_GET=array_map("stripslashes",$_GET);
	$_POST=array_map("stripslashes",$_POST);
	$_COOKIE=array_map("stripslashes",$_COOKIE);
};

ini_set("magic_quotes_gpc","0");
ini_set("magic_quotes_runtime","0");
ini_set("display_errors","1");

if(version_compare(phpversion(),"5.0.0",">")==1)
{
	ini_set("error_reporting",E_ALL|E_STRICT);
}
else
{
	ini_set("error_reporting",E_ALL);
};

if(isset($_REQUEST["btnSubmit"]))
{
	if($_FILES["HtmlInputFile"]["size"]>0)
	{
		$imgData=addslashes(file_get_contents($_FILES["HtmlInputFile"]["tmp_name"]));

		$link=mysql_pconnect("localhost","root","") or die ("Could not connect: ".mysql_error());
		mysql_select_db("test") or die ("Unable to select db: ".mysql_error());

		$sql="insert into testblob (image) values ('{$imgData}')";
		mysql_query($sql) or die ("Unable to upload file: ".mysql_error());

		$sql="select image from testblob where id=1";
		$result=mysql_query($sql) or die ("Invalid query: ".mysql_error());

		mysql_close($link);

		header("Content-type: image/jpeg");
		echo(mysql_result($result,0));
	}
	else
		echo("Size: ".$_FILES["HtmlInputFile"]["size"]."<br/>");
}
else
	echo("!IsPostBack<br/>");
?>
	<form action="testuploadfile.php" method="post" enctype="multipart/form-data">
		<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
		<input type="file" id="HtmlInputFile" name="HtmlInputFile" />
		<input type="submit" id="btnSubmit" name="btnSubmit" value="Upload" />
	</form>
    </body>
</html>
1. Файл upload'ится, и в БД записывается. Но, вот, с выводом - засада. Возвращается страница вместо рисунка. Что еще нужно покрутить/подкрутить/пнуть чтобы забегало?

2. Опять же за'google'л на предмет параметризированных запросов - получил ссылки на mysqli. Я так понимаю - это как "...Карл Маркс и Фридрих Энгельс - не муж и жена, а совершенно разных четыре человека..." Т.е. если я все делал на mysql_, то теперь мне нужно подключить mysqli_ и все переделать под mysqli? А у mysql_ что- своего механизма работы с параметрами - нЭт?

3. Вообще-то это моя первая страничка на php - если что-то бросается в глаза (так не делают вообще, так не делают нормальные, так не делают пацаны): не стесняйтесь - высказывайтесь...
 

Ex_Soft

Новичок

[off]
cDLEON
зачем хранить картинки в БД ?
"...Силу пытаю - пенек разбиваю..." ;) И, пожалуйста, давайте не будем холиварить на эту тему. Особ страждущим могу дать пару-тройку линков - пусть там упражняются.
[/off]
 

x-yuri

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

2. в mysql есть http://ua.php.net/manual/en/function.mysql-real-escape-string.php

-~{}~ 13.02.09 22:47:

кроме того, чтобы использовать persisten connections нужны серьезные причины (Persistent Database Connections)
и я бы воcпользовался is_uploaded_file
 

Фанат

oncle terrible
Команда форума
0. Нафига хранить картинки в БД?
1. Ну, подкрути часы, на час вперед. Какого ответа ты ждешь? "Исправь слово селект на 5 строчке"?
2. нэт
3. хотеть хранить картинку в базе может только тот, кто в состоянии ее показать.

-~{}~ 13.02.09 23:57:

ini_set("magic_quotes_gpc","0");
здесь, видимо, опечатка.

-~{}~ 13.02.09 23:58:

код местами такой правильный, что аж тошнит от показательности =)
 

Духовность™

Продвинутый новичок
"...Силу пытаю - пенек разбиваю..." И, пожалуйста, давайте не будем холиварить на эту тему. Особ страждущим могу дать пару-тройку линков - пусть там упражняются.
умничать только не надо, ага?
 

Ex_Soft

Новичок
Пон... Только, вот, по большому случаю, насколько я понял, что mysql_real_escape_string(), что addslashes(), в моем случае - одинаково. Впрочем, я привык к параметрам. Прийдется на DBI переписать.
x-yuri
чтобы использовать persisten connections нужны серьезные причины
Ну... Я, вообще-то, из ASP.NET пришел. Там ЭстЪ такое понятие как connection pooling, которое, как раз и придумано для WWW'шных приложений. (правда, справедливости ради, все тоже - неоднозначно: тынць, тынць) Прочитав mysql_pconnect и mysql_connect решил, что mysql_pconnect, как раз и реализует этот пул. Поэтому и ссамодеятельничал ;). В оригинале было mysql_pconnect
x-yuri
я бы воcпользовался is_uploaded_file
Видать examples или слишком старые или слишком уж из букварика попались - не увидел. Сп... Бум знать...

*****
Какого ответа ты ждешь?
Хотя бы вот такого
Уже понял. Для общего развития - чего так? Так исторически сложилось? Или не посчитали нужным?
*****
здесь, видимо, опечатка.
Так было в оригинале. Вы насчет magic_quotes_gpc boolean?

[off]
x-yuri
это ты про какие линки?
4 examples

*****
3. хотеть хранить картинку в базе может только тот, кто в состоянии ее показать.
Все мы когда-то с чего-то начинали. Повторюсь - это мое первое, претендующее на называться страничкой, ваяние на PHP.

*****
код местами такой правильный, что аж тошнит от показательности =)
Вообще-то я - Cишник... Не приучен к разгильдяйству ;)

triumvirat
умничать только не надо
Я - не умничаю. Правда, справедливости ради, и - понимаю. Сам, тоже, стараюсь направить еретиков ;) на путь истинный. Хотя... В этом случае однозначного мнения до сих пор - нЭт. Просто бывают в жизни такие случаи, даже сам в них побывал, когда пациент "...желает странного...", но оно - именно и нужно. И тогда все попытки вернуть в лоно праведности только раздражают и, ессесно засоряют, топик, снижая тем самым его КПД.
[/off]
 

x-yuri

Новичок
Пон... Только, вот, по большому случаю, насколько я понял, что mysql_real_escape_string(), что addslashes(), в моем случае - одинаково.
в твоем случае не одинаково. Почитай описания

Ну... Я, вообще-то, из ASP.NET пришел
ты спалился еще на IsPostBack ;-)

Там ЭстЪ такое понятие как connection pooling, которое, как раз и придумано для WWW'шных приложений. (правда, справедливости ради, все тоже - неоднозначно: тынць, тынць) Прочитав mysql_pconnect и mysql_connect решил, что mysql_pconnect, как раз и реализует этот пул. Поэтому и ссамодеятельничал . В оригинале было mysql_pconnect
persisten connections - это не пул соединений. Тебя устраивают недостатки использования persistent connections?
А для хранения изображений в БД может persistent connections и опправданы, не знаю. Вопрос в том, оправдано ли хранение изображений в БД

Так было в оригинале. Вы насчет magic_quotes_gpc boolean?
проблема в том, что экранирование происходит до выполнения скрипта
 

Ex_Soft

Новичок
Victory!!!
Всего-то надо было вынести <?php ... ?> в самый верх. BTW, а после
PHP:
header("Content-type: image/jpeg");
echo(mysql_result($result,0));
exit() нужен? А то у одних его - нЭт, у других - ЭстЪ. Я, конечно, попробовал так и так - одинаково. А как правильней?
 

x-yuri

Новичок
exit() нужен? А то у одних его - нЭт, у других - ЭстЪ. Я, конечно, попробовал так и так - одинаково. А как правильней?
правильней, чтобы кроме твоей картинки у тебя ничего не вывелось
 

Фанат

oncle terrible
Команда форума
Все мы когда-то с чего-то начинали. Повторюсь - это мое первое, претендующее на называться страничкой, ваяние на PHP.
ну так и делай, как начинающий. удаляй гланды через рот.
а то туда же - HTML не выучил, а понтов выше крыши.
клади картинку в файл, и отдает ее пусть веб-сервер, а не твое криворукое поделие.

первый foreach из своего тошнотворного кода убери. и ini_set("magic_quotes_gpc","0"), ботаник

-~{}~ 14.02.09 11:37:

и не учи пхп по туториалам в интернете. их пишут дебилы.
 

Ex_Soft

Новичок
Второй вариант (без выноса наверх <?php ... ?>):
PHP:
ob_clean();
header("Content-type: image/jpeg");
echo(mysql_result($result,0));
exit();
x-yuri
Почитай описания
mysql_real_escape_string()
Escapes special characters in the unescaped_string , taking into account the current character set of the connection so that it is safe to place it in a mysql_query(). If binary data is to be inserted, this function must be used.
согласен...
x-yuri
проблема в том, что экранирование происходит до выполнения скрипта
щаз наваяю дрозофилку и разберусь
x-yuri
правильней, чтобы кроме твоей картинки у тебя ничего не вывелось
Коротко: exit() - нужен
*****
первый foreach из своего тошнотворного кода убери. и ini_set("magic_quotes_gpc","0")
аргументы?
*****
и не учи пхп по туториалам в интернете. их пишут дебилы.
Ваши рекомендации?
 

x-yuri

Новичок
ob_clean();
header("Content-type: image/jpeg");
echo(mysql_result($result,0));
exit();
во-первых в самом начале все равно ob_start в общем случае должно быть, во-вторых "так не делают пацаны", ибо output buffering не для того предназначено

первый foreach из своего тошнотворного кода убери
аргументы?
он актуален для случаев включенного register_globals, а это не считается хорошей практикой (http://www.php.net/manual/en/security.globals.php)
 

Фанат

oncle terrible
Команда форума
попробуй сам подумать.
зачем оно нужно, нужно ли тебе и какой может принести вред.
и как ПРАВИЛЬНО делать то, ради чего придуман этот тупой код. там, кстати, написано.

Ваши рекомендации?
Сложно сказать. В первую очередь думать над прочитанным. Тот церебральный инвалид, на которого ты ссылку дал, этим форичем заменил другой, чудовищный, который исполняет пользовательский код. Большего маразма придумать невозможно. Лечим пробоину торпедой. Причем заменил не по причине дырявости, а для красоты.
И твои туториалы про картинку в базе из той же серии. Пишут дауны для дебилов.
Попробуй и к этой проблеме мозг подключить. Авось сообразишь что-нибудь. Кроме "это холивар, а я умнее всех". Хочешь быть умнее всех - ради бога. только до конца. И разбивать свой пенек самостоятельно. А не так, что "вы мне тут его распилите, уложите, покрасьте, а нафига вообще его было бить - не вашего ума дело"

Без приложения мозга вообще что-то рекомендовать мало смысла. Но попробуй книжку почитать хорошую. С этим тоже проблемы, но, мне кажется, что Джон Коггзолл должен был неплохую написать.
 

Ex_Soft

Новичок
x-yuri
"так не делают пацаны", ибо output buffering не для того предназначено
Вы говорите в общем или в контексте конкретно моего случая? Я так понял, это аналог, ASP.NET'овского:
PHP:
Response.Clear();
Response.ContentType="image/jpeg";
oImage.Save(Response.OutputStream,ImageFormat.Jpeg);
Response.Flush();
Да и
http://www.php.net/ob_clean
I find this function incredibly useful when manipulating or creating images in php (with GD).
x-yuri
он актуален для случаев включенного register_globals, а это не считается хорошей практикой
Сп... Тоже попытаюсь разобраться...
*****
Лечим пробоину торпедой
xpoin.ru
Не надо высказывать мнения вроде: "Всё вокруг дерьмо, а я в белом фраке." Критикуя, предлагай!
Ну и как настоящие пацаны экономя боеприпасы с минимальными телодвижениями это делают?
*****
Джон Коггзолл должен был неплохую написать
тынць?
 

Фанат

oncle terrible
Команда форума
Я так понял, это аналог, ASP.NET'овского:
Response.Clear();
программу надо писать так, чтобы никакой Response.Clear(); не понадобился.
"Сейчас мы построим дом, потом разломаем и будем копать подвал". Очень интеллектуальный подход.
Ну и как настоящие пацаны экономя боеприпасы
Цитируя меня, ты пропустил одну фразу.
попробуй сам подумать.
Вот мне интересно, во всей твоей эпопее хоть до чего-то ты дошел сам? без гугля, копипаста овнокода и переспрашиваний на форуме?
 

x-yuri

Новичок
Вы говорите в общем или в контексте конкретно моего случая? Я так понял, это аналог, ASP.NET'овского
есть отличия, которые актуальны в твоем случае. Посмотри php.ini или настройки в документации

http://ua.php.net/manual/en/function.ob-clean.php#75694
у автора, имхо, паранойя и завышенные требования к php
 

Ex_Soft

Новичок
Запустив phpinfo() на моем поднятом по default'у Apache, пришел к следующим выводам:
1. register_globals - deprecated + по default'у: Off
Получаецо
PHP:
foreach($_REQUEST as $key => $val)
{
    if(isset($$key))
        unset($$key);
};
нафик не нужен.
2. magic_quotes_gps - deprecated + по default'у: Off
magic_quotes_runtime - deprecated + по default'у: Off
Получаецо
PHP:
if(get_magic_quotes_gpc())
{
    $_GET=array_map("stripslashes",$_GET);
    $_POST=array_map("stripslashes",$_POST);
    $_COOKIE=array_map("stripslashes",$_COOKIE);
};

ini_set("magic_quotes_gpc","0");
ini_set("magic_quotes_runtime","0");
нафик не нужен.
В общем: без этого обходиться можно и дОлжно и при размещении на любом хостинге такой дурней себе гольову и код засорять нет необходимости. Я все правильно понял?
В остальном - все тривиально и ничего космического: обычная работа с БД с учетом специфики - там уже, как говориться, ничего не выбросишЪ...
 

Фанат

oncle terrible
Команда форума
Ага. Любой хостинг просто мечтает получать от каждого нового пользователя звонки "я поставил скрипт, а он не работает!"

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

Исходя из этого, ты так и не ответил на вопрос, чем вреден код foreach($_REQUEST as $key => $val). А он именно вреден, а не бесполезен.
И не предложил, чем его заменить. Хотя в том тексте, из которого ты скопировал, это написано.

код if(get_magic_quotes_gpc()) непонятно, зачем трогать. Места он не занимает, а мусор, в случае чего, почистит.
А вот почему до сих пор там болтается ini_set("magic_quotes_gpc","0"); - говорит нам о том, что в суть этих директив ты не вникал.

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

Ex_Soft

Новичок
*****
чем вреден код foreach($_REQUEST as $key => $val). А он именно вреден, а не бесполезен.
Честно говоря, если просто посмотреть, что он делает: убивает переменные, которые автоматически создаются при установленном register_globals. То, в контексте вредности, лично мне в голову приходит только одно: под раздачу могут попасть переменные, никоим образом не причастные к передаваемым параметрам. Хотя... В этом случае они и так попадают при рождении эквивалентов $_REQUEST'а. В общем, с моим мизерным опытом работы с PHP, я, честно говоря, бОльшего придумать не могу. Было бы интересно услышать Ваше обЪяснение.
*****
А вот почему до сих пор там болтается ini_set("magic_quotes_gpc","0"); - говорит нам о том, что в суть этих директив ты не вникал.
magic_quotes_gpc
Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically.
Однако в дрозофиле:
PHP:
<?php
	ini_set("magic_quotes_gpc","1");
	phpinfo();
?>
ini_set("magic_quotes_gpc","1") - согласно: phpinfo(), ini_get("magic_quotes_gpc"), get_magic_quotes_gpc() - вообще никакого действия не возымело. (Интерсно - почему?) А если учесть, что
то эта установка, как таковая, вообще не имеет смысла - все уже украдено до нас? Я все правильно понял?
 
Сверху