Загруженное изображение не хранится должным образом в базе данных (php mysql) - PullRequest
0 голосов
/ 18 февраля 2011

Я пытаюсь сохранить загруженные изображения в базе данных.Однако изображения не будут отображаться, и когда я смотрю на таблицу с phpmyadmin в столбце изображения, я вижу такие вещи, как [BLOB - 20B] вместо фактического размера, который должен иметь.

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

Моя форма:

<form id="productForm" action="index.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="product_id" value="' . $values['product_id'] . '" />
<input type="file" name="image" />
</form>

Код обработки:

$clean['image'] = mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']));

mysqli_query($dbc, "
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('{$clean['last_product_id']}', '{$clean['mime']}', '{$clean['image']}')
");

Я опустил все, что не имеет значения, потому что другие вещи, кажется, работают хорошо.

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

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

Сохранение данных изображения в базе данных возможно, но это одна из тех вещей, которые вы МОЖЕТЕ делать, но не должны. Если ваш сценарий видит даже умеренное использование, ваша база данных может быстро стать большой и громоздкой. Особенно при плохих или отсутствующих индексах вы можете ожидать снижения производительности вашей базы данных, поскольку размер таблицы увеличивается с каждой добавленной записью.

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

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

Удачи!

EDIT

Попробуйте исправить свой текущий код, кстати:

$instr = fopen($_FILES['image']['tmp_name'],"rb");
    $image = addslashes(fread($instr,filesize($_FILES['image']['tmp_name'])));
    mysqli_query($dbc, 'INSERT INTO product_images (product_id, mime, image)
      VALUES ("'.$clean['last_product_id'].'", "'.$clean['mime'].'", "'.$image.'")';
0 голосов
/ 18 февраля 2011

Очевидно, это было как-то связано с побегом. В итоге я ничего не избежал, пока сам запрос не был сформирован с помощью sprintf ()

$clean['qText'] = sprintf("
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('%d', '%s', '%s')",

  mysqli_real_escape_string($dbc, $clean['last_product_id']),
  mysqli_real_escape_string($dbc, $clean['mime']),
  mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']))
);

mysqli_query($dbc, $clean['qText']);
...