Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка при занесении картинки в базу
 
 автор: juliya   (21.03.2006 в 12:10)   письмо автору
 
 

Добрый день!
У меня в базе должны храниться сами картинки, а не пути к ним. Делаю я это так:

include "connect_db.php";
ini_set("max_execution_time", 999999); 
  $photo = $HTTP_POST_FILES["photo"]["tmp_name"];  
  $file = fopen($photo, "r");    
  $buffer = fread($file, filesize($photo)); 
  $buffer = addslashes($buffer); 
  fclose($file);
    if (empty($error))
  {
  $query = "INSERT INTO vsm_notebook (f_id, f_surname, f_date_time, f_photo) VALUES
  ('', '$HTTP_POST_VARS[surname]', NOW(), '".mysql_escape_string($buffer)."')";

Пишет мне следующие ошибки:

Warning: fread(): supplied argument is not a valid stream resource in ...
Warning: fclose(): supplied argument is not a valid stream resource in ...

Это в строке,где $buffer = fread($file, filesize($photo)); и fclose($file);
Все данные в базу заносятся кроме картинок. Что может быть не так?

   
 
 автор: Trianon   (21.03.2006 в 12:29)   письмо автору
 
   для: juliya   (21.03.2006 в 12:10)
 

Файл с картинкой почему-то не открылся.
Попробуйте вывести

<?  echo '<pre>';
 
print_r($HTTP_POST_FILES); 
?>
чтобы выяснить, почему такое происходит.
С экранированием кавычек у Вас тоже не всё в порядке, но сперва добейтесь того , чтоб файл открывался.

PS.
Вместо $HTTP_POST_FILES[] лучше использовать $_FILES[]

   
 
 автор: Loki   (21.03.2006 в 12:32)   письмо автору
 
   для: juliya   (21.03.2006 в 12:10)
 

Похоже что у вас не находится файл.
Попробуйте вместо
<?
$photo 
$HTTP_POST_FILES["photo"]["tmp_name"];

использовать
<?
$photo 
$_FILES["photo"]["tmp_name"];

   
 
 автор: juliya   (21.03.2006 в 12:37)   письмо автору
 
   для: Loki   (21.03.2006 в 12:32)
 

Попробовала по-всякому. После внесения

echo '<pre>'; 
print_r($_FILES[]); 

Пишет:

Fatal error: Cannot use [] for reading in ...

   
 
 автор: Trianon   (21.03.2006 в 12:47)   письмо автору
 
   для: juliya   (21.03.2006 в 12:37)
 

Извините, пожалуйста, сами скобки лишние. print_r($_FILES);

   
 
 автор: juliya   (21.03.2006 в 12:51)   письмо автору
 
   для: Trianon   (21.03.2006 в 12:47)
 

Выводится тоже самое и
Array
(
)
Что это означает?

   
 
 автор: Trianon   (21.03.2006 в 13:00)   письмо автору
 
   для: juliya   (21.03.2006 в 12:51)
 

Значит, что в форме не встретилось ни одного файла.
Или что к моменту вывода этот массив уже кто-то почистил :)
Код, который форму создает, можно глянуть?

   
 
 автор: juliya   (21.03.2006 в 13:06)   письмо автору
 
   для: Trianon   (21.03.2006 в 13:00)
 

Вот форма:

<form method="post">
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <TR>
            <TD>Your Surname<font color="red" size="2"><strong>*</strong></font><br>
            <input type="text" name="surname" value="<?echo $HTTP_POST_VARS["surname"]?>" size="25"></TD>
        </TR>
     </TABLE>     
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <TR>
            <TD><INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="50000"></TD>
            <TD>Choice Foto
            <br><input type="file" name="photo" value="" size="90"></TD>
        </TR>
     </TABLE>
</form>

   
 
 автор: Loki   (21.03.2006 в 13:10)   письмо автору
 
   для: juliya   (21.03.2006 в 13:06)
 


<form enctype=multipart/form-data method=post>

   
 
 автор: juliya   (21.03.2006 в 13:19)   письмо автору
 
   для: Loki   (21.03.2006 в 13:10)
 

Спасибо огромное!!!!!!!!!!!!
Теперь хоть ошибок не выдает. Правда в базу в ложится текст:

яШяа\0JFIF\0\0\0d\0d\0\0ям\0Ducky\0\0\0\0\0<\0\0яо\0Adobe\0dА\0\0\0яЫ\0„\0         

И это же выводится. Может кто-нибудь знает, что ЭТО?

   
 
 автор: CrazyAngel   (21.03.2006 в 13:22)   письмо автору
 
   для: juliya   (21.03.2006 в 13:19)
 

Это и есть ваш рисунок

Поправте если не так

   
 
 автор: Loki   (21.03.2006 в 13:25)   письмо автору
 
   для: juliya   (21.03.2006 в 13:19)
 

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

   
 
 автор: Trianon   (21.03.2006 в 13:26)   письмо автору
 
   для: juliya   (21.03.2006 в 13:19)
 

Это что-то очень напоминающее jpg-файл. :) А что Вы там ожидали обнаружить?
Теперь осталось разобраться с экранированием спец-символов и с формированием правильного заголовка контента при выводе картинки. И всё заработает :)

   
 
 автор: juliya   (21.03.2006 в 13:34)   письмо автору
 
   для: Trianon   (21.03.2006 в 13:26)
 

Когда передаю заголовок:

header("Content-Type: image/jpeg"); 
print "<img src='".$photo."'></td>";

то пишет ошибку:

Cannot modify header information - headers already sent by (output started at ...) in ...

   
 
 автор: Trianon   (21.03.2006 в 13:38)   письмо автору
 
   для: juliya   (21.03.2006 в 13:34)
 

так дело не пойдет - нужен ВЕСЬ код. :) Скорее всего, Вы просто <html> выводите до начала работы php-скрипта. Но возможно и что-то еще.
А <html> это явно не начало картинки.

   
 
 автор: Trianon   (21.03.2006 в 13:32)   письмо автору
 
   для: juliya   (21.03.2006 в 13:19)
 

По экранированию:

Строку $file = fopen($photo, "r");
имеет смысл надо заменить на $file = fopen($photo, "rb");
Если дело происходит на windows-машине - это надо сделать обязательно.


Строку $buffer = addslashes($buffer);
надо убрать вообще.

По заголовку типа контента:
Если Вы приведете код скрипта , который показыват картинку, можно будет понять, что в нем не так. :)

   
 
 автор: juliya   (21.03.2006 в 13:42)   письмо автору
 
   для: Trianon   (21.03.2006 в 13:32)
 

Исправила вывод картинки:

print "Foto:".$photo."</td>";

Теперь в базе лежит картинка, а выводится абракадабра и без квадратика с крестиком под картику.

   
 
 автор: Trianon   (21.03.2006 в 13:52)   письмо автору
 
   для: juliya   (21.03.2006 в 13:42)
 


print "Foto:".$photo."</td>"; 


это не код. это маленькая его строчка, вокруг которой имеются ошибки.

   
 
 автор: juliya   (21.03.2006 в 14:00)   письмо автору
 
   для: Trianon   (21.03.2006 в 13:52)
 


<? include "connect_db.php";
  
$id $_GET["id"];
  
$query "SELECT * FROM vsm_notebook where f_id =" .$id;
  
$result mysql_query($query);
 while (
$row mysql_fetch_array($result))
 {
    
$id $row["f_id"];
    
$surname $row["f_surname"];
    
$photo$row["f_photo"];
    
$date_time=$row["f_date_time"];
?>
<table border="0" width="100%" cellpadding="0" cellspacing="0">
    <tr bgcolor="#F8F8F8">
        <td width="70%" height="20"><b><? print $surname;?></b></td>
        <td width="30%" valign="bottom" align="right" ><nobr><p class="date">&#238;&#242;: <b>
        <? print $row["f_date_time"]; ?></b></nobr></td>
    </tr>
    <?if (!empty($photo))
        {print 
"<tr><td valign=top><nobr><p class=print>";
                
//header("Content-Type: image/jpeg"); 
                
print "&#212;&#238;&#242;&#238;:".$photo."</td>";
                print 
"<td>&nbsp;</td>
    </tr>"
;}?>    
</table><br>

Может ошибка в этой строчке $photo= $row["f_photo"]; ?

   
 
 автор: Trianon   (21.03.2006 в 14:08)   письмо автору
 
   для: juliya   (21.03.2006 в 14:00)
 

сейчас попробую исправить. А Вы поглядите пока этот. У меня с прошлого Вашего появления (2 марта) осталось :)

<?php
include "connect_db.php"
  


  
$f_id 0;
  if(isset(
$_GET['f_id']))
     
$f_id += $_GET['f_id'];
  if(
$f_id != 0)
  {
    
header ("Content-type: image/jpeg");
    
$res=mysql_query(" SELECT  f_photo  FROM  vsm_notebook WHERE f_id = $f_id "$dbcnx);
    if((
$row=@mysql_fetch_array($res)) != 0)
       echo 
$row['f_photo'];
    exit;
  }
  
?>
  <html><body>
  <?php
  
{
     if(isset(
$_REQUEST['del'])&&count($_REQUEST['del']))
     {
         
$selected implode(',',$_REQUEST['del']);
         
$query "DELETE from vsm_notebook WHERE f_id IN ($selected)";
         
$result mysql_query($query);
        if (!
$result)
           echo 
"Error on delete: " .mysql_error();
     }
     if(isset(
$_FILES['photo']['tmp_name']))
     {
        
$photo $_FILES['photo']['tmp_name'];
        
$file fopen($photo"r");
        
$buffer fread($filefilesize($photo));
        
fclose($file);
        if (empty(
$error))
        {
  
$query "INSERT INTO vsm_notebook (f_surname, f_date_time, f_photo)VALUES('"
                
.mysql_escape_string($_POST['surname'])."', NOW(),'"
                
.mysql_escape_string($buffer)."')";
        
$result mysql_query($query);
        if (!
$result)
           echo 
"Error on insert: " .mysql_error();
     }
   }

   
$result=mysql_query(" SELECT  f_id,f_surname, f_date_time  FROM  vsm_notebook"$dbcnx);
   if(
$result == 0)
       echo 
"error in select:"mysql_error();
    
$total 0;
    while((
$row=mysql_fetch_array($result)) != 0)
    {
       if(!
$total++)
           echo 
"<form method=post>";
       
$f_id $row['f_id'];
       
$f_surname $row['f_surname'];
       
$f_date_time $row['f_date_time'];
       echo 
""
       
"<input type=checkbox name=del[] value=$f_id />"
       
"<a target=_blank href='?f_id=$f_id'>$f_date_time</a> "
       
"<img src='?f_id=$f_id' />"
       
htmlspecialchars($f_surname)
       . 
"<br/>\r\n";
    }
    if(
$total)
        echo 
"<input type=submit value='Delete selected rows'></form>\r\n";
    echo 
"Total: $total rows";
  }
  
?>

  <form method=post enctype=multipart/form-data >
  Photo:  <input type=file name=photo  />
  Surname: <input name=surname>
   <input type=submit value="Add to gallery" /></form>
</body></html>

   
 
 автор: Loki   (21.03.2006 в 14:11)   письмо автору
 
   для: juliya   (21.03.2006 в 14:00)
 

Так не получится: 1 скрипт = 1 картинка (почти как на выборах:)
то есть
<?
<img src=image.php?id=1>

а вот image.php и должен отвечать за показ картинки
<?
include "connect_db.php"
  
$id $_GET["id"]; 
$query "SELECT * FROM vsm_notebook where f_id =" .$id
  
$result mysql_query($query); 
 
$row mysql_fetch_array($result);
 
header("Content-Type: image/jpeg"); 
 print 
$row["f_photo"]; 

вот... кажется ничего не напутал.

   
 
 автор: juliya   (21.03.2006 в 14:55)   письмо автору
 
   для: Loki   (21.03.2006 в 14:11)
 

Я не очень понимаю, почему не получится? Ведь другие данные выводятся из базы также.
У меня сделано так: выводятся частичные данные записей из базы. Рядом ссылка подробнее. Сюда передается id и в новом окне выводятся уже все данные по этой записи. И тут выводится фото (у меня пока нет).

   
 
 автор: Trianon   (21.03.2006 в 15:05)   письмо автору
 
   для: juliya   (21.03.2006 в 14:55)
 

Потому что нельзя мешать в один вывод и текстовые данные html-кода с таблицей и двоичные данные конкретной картинки. Либо вызов скрипта формирует text/html и разрисовывает таблицу, или даже просто строку <img src=?id=1> , либо вызов скрипта формирует код image/jpeg и тогда на выходе будет тело одной картинки. Конкретной.

   
 
 автор: Trianon   (21.03.2006 в 14:58)   письмо автору
 
   для: juliya   (21.03.2006 в 14:00)
 

<? include "connect_db.php";
  
$id intval($_GET["id"]);

  
$query "SELECT * FROM vsm_notebook where f_id =" .$id;
  
$result mysql_query($query);
  if((
$row mysql_fetch_array($result)) != 0)
  {  
header("Content-Type: image/jpeg");
     echo 
$row["f_photo"];
  }else echo 
'No photo for id = '.$id;
?>

   
 
 автор: juliya   (21.03.2006 в 15:25)   письмо автору
 
   для: Trianon   (21.03.2006 в 14:58)
 

Опять ругается на заголовок header("Content-Type: image/jpeg");
и выдает ту же гадость

   
 
 автор: Trianon   (21.03.2006 в 15:43)   письмо автору
 
   для: juliya   (21.03.2006 в 15:25)
 

А как Вы его вызываете?
Крайне странно, потому что у меня этот код всё замечательно рисует.

А что написано в
output started at ...) in ... 
на месте многоточий? И зачем Вы их многоточиями заменили?

Причин может быть две. Либо в файле перед <? находятся пробельные символы, либо какой-то вывод происходит во включаемом файле connect_db.php И то и другое - недопустимо.

   
 
 автор: juliya   (22.03.2006 в 10:26)   письмо автору
 
   для: Trianon   (21.03.2006 в 15:43)
 

Спасибо большое Trianon и Loki!!!!!! У меня все выводится! Все поняла. Сделала вывод в отдельном файле. Еще раз спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования