# زبان های اسکریپتی > PHP >  ذخیره خود عکس در پایگاه داده mysql

## usernam

چجوری میشه خود عکس (نه آدرس) رو توی database ذخیره کرد؟

----------


## امیـرحسین

فکر کنم، با توابع file مثل readfile محتویات فایل رو می خونن و بصورت متن توی دیتابیس می ریزن.
برای نمایشش هم اون محتویات رو با header از نوع عکس نمایش میدن.
من تا حالا همچین چیزی رو تست نکردم ولی شاید روش همین باشه.

----------


## s_salavati2002

همین طوریه که امیرحسین گفت،
هم میشه با آپلود درست کرد و هم با فایل تو سرور
فقط فیلد دیتابیست باید یکی از انواع blob باشه

----------


## funpatogh

نوع فیلد رو Blob کن و تا  4 گیگ اگه یادم باشه توی خودش ذخیره میکنه

----------


## mostafa_shaeri_tj

سلام. بالاخره کدوم روش بهتره ؟ گذاشتن عکس در دیتا بیس یا آدرسش؟ شنیدم که لود کردن از دیتا بیس رو  دچار مشکل میکنه. یعنی کمی سرعت پایین میاره و طوری هستش که حتی هاست هم دادش در میاد  :متفکر: 

یه سوال دیگه هم داشتم : با header از نوع عکس بخونیم یعنی چی و چطوری باید این کارو بکنیم؟

ممنون

----------


## trade_mark

به نظر من اگه آدرس عکس رو در بانک ذخیره کنیم بهتر و سرعت برنامه بیشتر می شه 
در ضمن محدودیتی هم از لحاظ اندازه فایل نداریم

----------


## pashaie

> یه سوال دیگه هم داشتم : با header از نوع عکس بخونیم یعنی چی و چطوری باید  این کارو بکنیم؟


یعنی اینکه قبل از اینکه بخوای محتویات فایل رو واسه کلایت بفرستی، یه جوری به کلاینت حالی کنی که فایلی که داری مفرستی چه فرمتیه، چون پیش فرض همه رو html در نظر می گیره
مثلا اگه فایلی که ذخیره کردی png هست، قبل از ارسال خروجی باید کد زیر رو قرار بدی 

header('Content-type: image/png'); 

در کل، ذخیره کردن خود تصویر تو دایرکتوری و آدرسش تو دیتا بیس بهتره تا اینکه کل فایل رو تو دیتا بیس ذخیره کنی

----------


## yaqubian

دوست عزیز
ذخیره عکس در DB کلی هزینه واسه شما ایجاد می کنه!!! پس بهتره این کار رو انجام ندین.
مهمترین این هزینه ها، سرعت لود شدن تصاویر هنگام فراخونی صفحه است!
موفق باشید

----------


## omid_p30

همونطور که بچه ها گفتن ذخیره عکس تو DB کار درستی نیست. کلا بهتره که عکس ها تو یه دایرکتوری رو سرور ذخیره بشن و فقط آدرس عکس ها داخل DB نگهداری بشه. قبلا سر این موضوع من یادمه تو یه جا خیلی بحث کردیم. 
اما من خودم تو پروژه ام عکس هار رو تو DB ذخیره کردم و نشون دادم.
اما روش من این بود که داخل اون صفحه که می خاستم عکس هام رو نشون بدم داخل تگ img آدرس یه صفحه PHP رو دادم که عکس رو از DB می گرفت و نشون میداد. 
مثلا صفحه اول که عکس رو میخاد نشون بده این کد رو داره
<img  src="showpic.php?u_id='.$u_id.'">و صفحه دوم با نام showpic.php کد زیر رو داره.
<?php
include("mysql_connect.php");
if (isset($_GET['u_id']))
{
$u_id = $_GET['u_id'];
$query = "SELECT img FROM users where user_id = $u_id";
$result = mysql_query($query) or die('Error, query failed');
Header( "Content-type: image/jpeg"); 
while ($row = mysql_fetch_array($result))
{
    echo $row['img'];
}
}
exit;
?>البته یادم رفت بگم که برای insert عکس داخل DB چیکار باید کنی.
پروژه من یه تالار گفتگو بود(البته خیلی ابتدایی). کلا من یه صفحه register داشتم که کاربر علاوه بر اطلاعات خودش می تونست عکس هم برای خودش بزاره. مثل همه فروم ها.
تو این صفحه من یه فرم داشتم که ورودی ها رو میگرفت و action فرم هم آدرس خود register.php بود. برای فرم HTML باید این کدها رو بزاری در واقع یه فیلد آپلود فایل لازم داری.

<form action="register.php" method= "post" enctype="multipart/form-data">    
your picture:<input type="file" name="picup" id="picup"></br>
<input type="submit" name="submit" value="Register" />
<input type="hidden" name= "submitted" value="TRUE" />
</form>برای درج در DB هم باید فیلدی که میخای عکس رو داخلش دخیره کنی از نوع blob تعریف شده باشه.
و کد درج در DB هم اینه :

if($_FILES['picup']['size'] > 0)
{
$fileName = $_FILES['picup']['name'];
$tmpName  = $_FILES['picup']['tmp_name'];
$fileSize = $_FILES['picup']['size'];
$fileType = $_FILES['picup']['type'];
$sizes = getimagesize($tmpName);
if($fileType != 'image/jpeg')
{
    $content= false;
    echo '<p class="error">The type of your picture is not jpeg. Please select a jpeg picture!</p>';
}elseif (($sizes[0] > 150) || ($sizes[1] > 150)){
    $content= false;
    echo '<p class="error">The size of your picture is not valid. selected picture should be 150*150px!</p>';
}else {
$fp      = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
}

if(!get_magic_quotes_gpc())
{
    $fileName = addslashes($fileName);
}

}else
{
    echo '<p class="error">please select a picture for avatar!</p>';
}و این هم برای درج 

$q = "INSERT INTO users (img) VALUES ('$content')";
$r = mysql_query ($q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysql_error() );


هر جا احتیاج به توضیح داشتی بگو.
موفق باشی.

----------


## sara_1234

> به نظر من اگه آدرس عکس رو در بانک ذخیره کنیم بهتر و سرعت برنامه بیشتر می شه 
> در ضمن محدودیتی هم از لحاظ اندازه فایل نداریم


با سلام 
میشه بگید ادرس عکس رو چه طوری تو mysqlذخیره می کنید ؟ با اپلود هست؟ میشه کدشو بهم بگید.ممنون

----------


## rapidpich

برای ذخیره عکس تو دیتابیس از نوع BLOB باید استفاده کنی.
برای اینکه دقیقا ببینی چطور اینکارو بکنی یه جستجو بکن با همین کلمات blob image mysql php
اگه عکسا کوچیک هست میتونی قبلش محتویات فایل رو Base64 کنی و اون رو ذخیره کنی.

----------


## idocsidocs

> همونطور که بچه ها گفتن ذخیره عکس تو DB کار درستی نیست. کلا بهتره که عکس ها تو یه دایرکتوری رو سرور ذخیره بشن و فقط آدرس عکس ها داخل DB نگهداری بشه. قبلا سر این موضوع من یادمه تو یه جا خیلی بحث کردیم. 
> اما من خودم تو پروژه ام عکس هار رو تو DB ذخیره کردم و نشون دادم.
> اما روش من این بود که داخل اون صفحه که می خاستم عکس هام رو نشون بدم داخل تگ img آدرس یه صفحه PHP رو دادم که عکس رو از DB می گرفت و نشون میداد. 
> مثلا صفحه اول که عکس رو میخاد نشون بده این کد رو داره
> <img  src="showpic.php?u_id='.$u_id.'">و صفحه دوم با نام showpic.php کد زیر رو داره.
> <?php
> include("mysql_connect.php");
> if (isset($_GET['u_id']))
> {
> ...



این اسکریپت که برای آپلود عکس نوشتید بخوبی کار می کنه، اما فقط وقتی که بخوایم یک عکس رو آپلود کنیم.

ولی اگه بخوایم چند عکس رو آپلود کنیم با مشکل مواجه می شیم، چون کد زیر فقط می تونه تصویر آپلود شده از فیلد picup رو بخونه. می شه بگید از چه راهی می شه چندین تصویر رو بطور همزمان به سرور آپلود کنیم؟

if($_FILES['picup']['size'] > 0)
{
$fileName = $_FILES['picup']['name'];
$tmpName  = $_FILES['picup']['tmp_name'];
$fileSize = $_FILES['picup']['size'];
$fileType = $_FILES['picup']['type'];

----------


## funpatogh

اگر برنامه رو کامل درک کرده باشید میتونید از الگوی زیر برای حل مشکل تک فایل  استفاده کنید

<?php
  foreach($_FILES['picup']['error'] as $key=>$error){
      if($error==0){
          $tmp_name=$_FILES['picup']['tmp_name'][$key];
          $name=$_FILES['picup']['name'][$key];
      }
  }
?>

----------

