Проблемы с хранением изображений в базе данных MySQL - PullRequest
2 голосов
/ 31 декабря 2011

** Решено **
У меня есть небольшая проблема с моим кодом

Мне нужно хранить изображения в базе данных MySQL, используя php и HTML-форму. Я следовал за гидом, но я действительно не работаю. Он загружает файл на сервер ... а затем забрасывается ... по крайней мере, не сохраняется.

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

Структура базы данных целевой таблицы:

Fotos

fotonr        int(10)                       Index number
album         varchar(20)                   Grouping catagory(not needed)
Lid           int(4)                        Index number of the member that placed it
type          varchar(20)                   To store what kind of image it is
image         blob                          The image itself

для этого я использую следующий сегмент (ссылки на базы данных не находятся в файле, уже построены ранее)

<p>
<?php
$target_path= "images/";
echo "checking file upload!<br />";
if(isset($_FILES['file']))
{
    echo"SET!!!<br />";
    if(isset($_POST['album']))
    {
        $album=trim($_POST['album']);
        if($album!="")
        {
            $album=  stripslashes($album);
        }
        else $album="Niet Ingedeeld/";
    }
    else $album="Niet Ingedeeld/";
    $myalbum=mysql_real_escape_string($album);
    $target_path=$target_path.$album;
    foreach($_FILES['file']['tmp_name'] as $key=>$afbeelding)
    {
        echo $_FILES['file']['name'][$key]."<br />";

        if ($_FILES['file']['tmp_name'][$key]!=''){
        $size = getimagesize($_FILES['file']['tmp_name'][$key]);
        $width=$size[0];
        $height=$size[1];
        echo "groote: ".$width."x".$height."<br />";
        if($width>800&&$height>600)
        {
            echo "Uw afbeelding is te groot!(maximaal 800x600)<br />";
        }
        else
        {

            $mynr= mysql_real_escape_string($_SESSION['nummer']);
            /*$type=exif_imagetype($_FILES['file']['tmp_name'][$key]);*/
            $type=$size[mime];
            echo 'Het type was:'.$type.'<br /> ';
            if($type=="image/gif" ||$type=="image/jpeg" ||$type=="image/bmp" ||$type=="image/png" ||$type=="image/gif" ){
            $mytype =mysql_real_escape_string($type);
            $tmpName  = $_FILES['file']['tmp_name'][$key];

            /*$fp      = fopen($tmpName, 'r');
            $content = fread($fp, filesize($tmpName));
            $mycontent = mysql_real_escape_string($content);*/
            $content = file_get_contents($tmpName); 
            $data = unpack("H*hex", $content ); 
            $mycontent = '0x'.$data['hex']; 


            $sql="INSERT INTO`nacverk`.`Foto` (`album` , `lid` ,`image`,`type` )VALUES ('$myalbum' ,'$mynr','$mycontent', '$mytype')";

            $result=mysql_query($sql); 
            /*fclose($fp);*/
            if(!$result)
            {
                echo "<h1>Bestand uploaden mislukt!<br /> ".mysql_error()."<br /></h1>";
            }
            else
            {
                echo "<h1>Bestand Succesvol geupload!<br /></h1>";
            }
            }
            else{
                echo "<h1> NOD32 detected a viral intrusion!<br /></h1>";
            }

        }

    }}
}
mysql_query("OPTIMIZETABLE `Foto` ");
?>
</p><hr />
<h3> Upload hier uw Foto's!</h3>
<hr />
<p>
<form enctype="multipart/form-data" action="" method="post" name="foto-upload">
<input name="MAX_FILE_SIZE" value="10485760" type="hidden">
Uw afbeeldingen:<br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
Het album waar ze aan toegevoegd moeten worden:<br />
<input name="album" type="text" maxlength="20"
<?php if(isset($_GET['album']))echo ' value="'.$_GET['album'].'" '; ?>><br />
<input value="Submit" type="submit">
</form>
</p>
<hr />

Он падает до той части, где он должен быть загружен в базу данных ...
Тогда это вызывает ошибку SQL, говорящую: Запрос пуст.

Спасибо, что уделили время!

Ответы [ 5 ]

2 голосов
/ 31 декабря 2011

Имейте в виду, что максимальная длина для типа данных BLOB составляет 64 КБ.Обычно изображения имеют больший размер, поэтому, возможно, вам следует использовать MEDIUMBLOB.

Подробнее см. http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html.

1 голос
/ 31 декабря 2011

Вот ваша проблема:

  $fp      = fopen($tmpName, 'r');
  $content = fread($fp, filesize($tmpName));
  $content = addslashes($content);

Вы интерпретируете содержимое файла как текст, а не как двоичные данные.

Вы должны представить данные серверу mysql в двоичном формате.Не добавляет к этому черты.(достаточно избыточно?)

(редактировать) Попробуйте этот код:

  $content = file_get_contents($tmpName);
  $data = unpack("H*hex", $content );
  $content = '0x'.data['hex'];
0 голосов
/ 31 декабря 2011

Почему бы не сохранить справочную информацию в БД и файл в папке на сервере.

например

fotonr        int(10)                       Index number
album         varchar(20)                   Grouping catagory(not needed)
Lid           int(4)                        Index number of the member that placed it
type          varchar(20)                   To store what kind of image it is
image         varchar(64)                   Path to The image itself

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

0 голосов
/ 31 декабря 2011

Похоже, вам не хватает кода для подключения к базе данных.

$db = mysql_connect("localhost", "mysql_user", "mysql_password");

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

$result = mysql_query($query, $db); 

Toчтобы упростить поиск и устранение неполадок, запишите информацию об ошибках MySQL на веб-странице:

echo "<br>Error " . mysql_errno($db) . ": " . mysql_error($db) . "<br>";

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

0 голосов
/ 31 декабря 2011

Поскольку я не могу проверить это сейчас, я не уверен на 100%, но я почти уверен, что $ _POST ['file []'] и $ _FILES ['file []'] не работают.$ _POST ['file'] и $ _FILES ['file'] должны.Я предполагаю, что у вас есть вход где-то вроде

<input type="file" name="file[]" />

, который позволит вам загружать несколько файлов, которые должны храниться в $ _FILES ['file'], который сам тогда будет массивом.[] Указывает на то, что это будет многозначный ключ, что означает, что вам нужно получить доступ к нему как к массиву на сайте PHP.

Из того, что я понимаю из вашего поста, вы изучаете это, поэтомуПожалуйста, позвольте мне посоветовать вам не хранить изображения в базе данных, если у вас нет веских причин для этого.Существуют различные причины, по которым вы не должны этого делать, но я не хочу останавливаться здесь.Вы можете найти приличный учебник старой школы по загрузке файлов на tizag.com, http://www.tizag.com/phpT/fileupload.php.

Надеюсь, это поможет.Удачи и наслаждайтесь:)

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