Insert عکس در MySQL و خواندن آن با PHP

smohsen

کاربر تازه وارد
تاریخ عضویت
26 ژوئن 2003
نوشته‌ها
4
لایک‌ها
0
سلام
يکي از مشکلاتي که من با صفحات دايناميک (چه ASP و چه PHP) دارم مساله Insert يک عکس در DB و بعد Retrieve آن با يکي از اين زبانهاست.
در Access ما ديتاتايپ OLEDB را داريم. در SQLServer ديتاتايپ Image را داريم و در MySQL ديتاتايپ BLOB را داريم.
ولي دقيقا نميدونم چطور ميشه عکس را Insert کرد. مخصوصا در MySQL-Front

تازه بر فرض insert کرديم چطور retrieve کنيم.

ممنون از همه
 

knowhow

مدیران قدیمی
تاریخ عضویت
25 دسامبر 2002
نوشته‌ها
3,479
لایک‌ها
21
دوست عزيز هموطور كه مي دوني هر عكس ، حاوي يكسري اطلاعات متني است كه در خيلي از موارد اون رو ميشه با يك اديتور notepad دید.

شما می تونید متن مربوط به عکس مورد نظر رو بریزید توی دیتابیس.
ولی توجه کنید موقعی که خروجی می گیرید اگر همون متن رو توی صفحه بریزید IE نمی فهمه که این عکس است و همون متن رو نمایش می ده. در Browser ها شما باید از کد html ی مثل img src="filename" استفاده کنید تا بتونید عکس نمایش بدید.
پس کاری که میشه کرد اینه که شما اطلاعات متنی خود را از دیتابیس بگیرید و به صورت یک فایل temprory ذخیره کنید و بعد در صفحه از اون استفاده کنید.
به دلیل اینکه حجم عکسها معمولا زیاده و این رد و بدل شدن اطلاعات با mysql server هم ترافیک ایجاد می کنه و هم حجم دیتابیس رو زیاد می کنه معمولا کسی این کار رو نمی کنه و فایلها رو به صورت فایل در سرور ذخیره می کنند و فقط اسم و آدرس فایل رو در دیتابیس می ریزند.
به هر حال می تونی روشی که گفتم رو امتحان کنی حتما جواب می ده.
 

smohsen

کاربر تازه وارد
تاریخ عضویت
26 ژوئن 2003
نوشته‌ها
4
لایک‌ها
0
اولا که خيلي ممنون از جوابت

ثانيا ادامه سوالم
من الان دقيقا گيرم همون صفحه موقتيه. توي ASP ما در شيء Response (اگر اشتباه نکنم) متدي داريم که Mime Type خروجي رو تعيين ميکنه. البته هنوز من با ASP خيلي سعي نکردم اين صفحه موقتي رو بسازم ولي از جهت تئوري کار، خيلي ايرادي وجود نداره (يعني هم عکس رو در DB مثلا Access ذخيره کردم و هم روش تعيين خروجي رو ميدونم و هم اينکه با Response.BinaryWrite دوباره اگر اشتباه نکرده باشم ميشه اطلاعات باينري عکس رو کشيد بيرون و تو صفحه نوشت. حالا اين صفحه موقتي همون src تگ img صفحه ASP ماست)
اما در مورد PHP و MySQL من ضعف معلومات دارم :( يعني هم درست يک BLOB رو نتونستم ذخيره کنم و هم اين صفحه موقتي رو نميدونم چطور درست کنم.
بذار اصلا اينجوري بگم فرض کن من الان عکسم رو تو MySQL ذخيره کردم. يک query هم زدم و اون رو خوندم. جواب اين query طبيعتا اون چيزي نيست که من بتونم تو تگ img استفاده کنم و نياز به همون فايل موقتي هست.
در مورد code اين فايل يه مددي برسونيد! :D

بازم ممنون
 

knowhow

مدیران قدیمی
تاریخ عضویت
25 دسامبر 2002
نوشته‌ها
3,479
لایک‌ها
21
سلام

ببين توي php شما وقتی که QUERY گرفتی می تونی اون اطلاعات رو بریزی توی یک فایل ، دیک دستوری در PHP هست که یک فایل جدید روی سرور می سازه و هز چی شما بگید توش میریزه.
خوب شما اطلاعات رو که QUERY کردید از دیتابیس می ریزید توی یک فایل و بعد اون رو توی IMG SRC می گذارید.
توجه داشته باشید که PHP مثل ASP دستورهای RESPONSE.BINARYWRITE و ... رو نداره. یک دستوری داره مثل OPEN FILE و SAVE FILE اگه اشتباه نکنم. باید از اونها استفاده کنید.
 

siavash79

کاربر تازه وارد
تاریخ عضویت
16 آپریل 2003
نوشته‌ها
47
لایک‌ها
0
خب....... عرض شود كه توابع كار با فايل روي Php همون توابع C تشريف دارن:
fopen
fclose
كه به اين شكل استفاده ميشن:
[code:1]

file1 = fopen ("PATH", "SWITCH)

[/code:1]

كه توي اين دستور PATH آدرس و اسم فايل مورد نظره و SWITCH اينه:
r : فايل رو فقط براي خوندن باز ميكنه
r+ : فايل رو براي خوندن و نوشتن باز ميكنه
اين دو مورد اگه فايل وجود نداشته باشه null پس ميده!
w : فايل رو فقط براي نوشتن باز ميسازه
w+ : فايل رو براي خوندن و نوشتن ميسازه
اين دو مورد اگه فايل وجود داشته باشه پاك ميكنه و از اول ميسازه
a و a+ هم هست كه الان يادم نيست چطور كار ميكنه
[code:1]

fclose(file1)[/code:1]
اين دستور فايل رو save ميكنه
 

smohsen

کاربر تازه وارد
تاریخ عضویت
26 ژوئن 2003
نوشته‌ها
4
لایک‌ها
0
خيلي ممنون از جواب شما دو دوست عزيز

حالا در مورد Insert عکس تو ديتابيس MySQL برام لطفا توضيح بديد.
من چطور ميتونم بصورت BLOB يک عکس رو تو ديتابيس ذخيره کنم. در ضمن من از MySQL-Front هم استفاده ميکنم.
MySQL-Front يک اديتور BLOB داره ولي وقتي عکس رو براش آدرس ميدم عملا اون رو تو ديتابيسش ذخيره نميکنه. بلکه يه جورايي همون روش شما را پياده ميکنه يعني ادرسش رو نگه ميداره نه باينري ديتاش رو. در صورتيکه ادعاي خود MySQL و MySQL-Front همون روش مورد نظر منه. يعني ذخيره باينريش مثل ديتاتايپ OLE در ACCESS.
 

pooyak

کاربر تازه وارد
تاریخ عضویت
19 ژوئن 2003
نوشته‌ها
14
لایک‌ها
0
سلام

راه استفاده از فايل temp اصلا راه خوبي نيست. چون فرض كنيد كه دو نفر با هم مشغول ديدن سايت شما باشند. و مثلا فرض كنيد شما به آنها اجازه داديد كه روي يك database جستجو كنن. اون وقت وقتي اولي سرچ مي كنه همون موقعه نفر دوم هم سرچ مي كنه اون وقت موقعه نمايش صفحه هر دو نفر اون چيزي رو كه نفر دوم سرچ كرده بوده پيدا ميكنن.

يك راه حل براي اين موضع اين است كه اسم فايلهاي temp را متفاوت انتخاب كنيد (مثلا random) ولي اين باز يك مشكلي داره. اگر يك نفر بخواهد اذيت كنه مي تونه يك دفعه 1000 تا request به شما بفرسته و همه فضاي وبتون را با فايلهاي temp پر كنه.

به نظر من بهترين راه اينه كه ديتاهاي عكس را مستقيم از توي Mysql بگيريد و همون جا (بدون ريختن توي يك فايل) نمايش بدين. مي دونيد كه لازم نيست خروجي يك php يا cgi حتما text باشه، بلكه مي شه با مشخص كردن Content-type‌ (همون Mime-type ها) يك كاري كرد كه خروجي هر چيزه ديگري باشه.

گشتم يك نمونه برنامه php براتون پيدا كردم كه دقيقا اين كاري كه شما مي خواهيد رو انجام داده، هر جاش رو نفهميديد بگين توضيح بدم :

<a href='http://www.weberdev.com/get_example.php3?count=3688' target='_blank'>http://www.weberdev.com/get_example.php3?count=3688</a>
 

smohsen

کاربر تازه وارد
تاریخ عضویت
26 ژوئن 2003
نوشته‌ها
4
لایک‌ها
0
سلام دوست عزيز

مدتي از پاسخ شما ميگذره و من هنوز فرصت نکرده بودم که لينکي که فرستاده بودي رو با دقت ببينم.
الان اون رو تست کردم و بخوبي جواب داد. خيلي حال کردم. دستت درد نکنه.
اين دقيقا همون چيزي بود که من ميخواستم.

ممنونم از لطف همه رفقا :p
 

mitch

کاربر تازه وارد
تاریخ عضویت
1 ژانویه 2004
نوشته‌ها
83
لایک‌ها
0
به نقل از smohsen :
سلام
يکي از مشکلاتي که من با صفحات دايناميک (چه ASP و چه PHP) دارم مساله Insert يک عکس در DB و بعد Retrieve آن با يکي از اين زبانهاست.
در Access ما ديتاتايپ OLEDB را داريم. در SQLServer ديتاتايپ Image را داريم و در MySQL ديتاتايپ BLOB را داريم.
ولي دقيقا نميدونم چطور ميشه عکس را Insert کرد. مخصوصا در MySQL-Front

تازه بر فرض insert کرديم چطور retrieve کنيم.

ممنون از همه
راه نوشتن يك فايل مثلا عكس توي MySQL:

MySQL يك تابع به نام LOAD_FILE داره كه كارش خوندن محتواي يك فايل و نوشتن اون توي يك فيلد BLOB است.
شكل تابع:

.
LOAD_FILE(file_name);
.​



روش استفاده:


mysql> UPDATE tbl_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;


اين تابع از نسخه‌ي 3.23 به بعد در MySQL موجود است. فايل file_name بايد حتما روي كامپيوتري كه MySQL در حال اجراست قرار داشته باشه. مثلا پوشه‌ي upload ها.
راه خواندن اطلاعات از database رو هم قبلا تو يكي از پست هام گفتم. زحمت پيدا كردنش با خودت

----------------------------------------------------------------------------
پي‌نوشت:
نوشتن فارسي و انگليسي با هم توي persiantools حقيقتا آدم رو "ا*‍هالي" مي‌كنه!
 
بالا