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

У меня есть следующие проблемы.

ПРОБЛЕМА НОМЕР 1: Используя PHP и MySQL, я могу успешно загрузить изображение на сервер, но не с именем файла изображения, хотя другие параметры в моей форме были успешно вставлены в базу данных. Я прочитал несколько сообщений на эту тему, в том числе здесь, на этом сайте, но пока не могу обойти проблему.

ПРОБЛЕМА НОМЕР 2: Мне в равной степени нужна помощь по ограничению ТИПА файла, разрешенного для загрузки (ТОЛЬКО gif, jpeg, png), а также РАЗМЕРА файла (не более 100 КБ).

ПРОБЛЕМА НОМЕР 3: Принудительно изменить размер всех загруженных изображений в меньший размер эскиза 20 КБ и сохранить его в отдельной папке на сервере с отдельным именем файла в базе данных.

Ниже мой текущий код PHP;

<?php 
if (!isset($_POST['upload'])) 
{ 
include ("submit_interview_test.php"); //shows form if it's not been posted 
}

else 
{ 
if($_FILES['pic']['tmp_name'] == "none") 
{ 
echo "<b>File not successfully uploaded. Maybe check the filesize limit.</b>"; 
include ("submit_interview_test.php"); 
exit(); 
}

if(!ereg("image",$_FILES['pic']['type'])) 
{ 
echo "<b>File is not an image - try another file.</b>"; 
include ("submit_interview_test.php"); 
exit(); 
}

else 
{ 
$uploadDir = 'intervimages/'; 
$destination = $uploadDir.basename($_FILES['pic']['name']); 
$temp_file = $_FILES['pic']['tmp_name'];
include ("processinterview.php");
if ( move_uploaded_file ($temp_file,$destination) ) 
{ echo '<p>Your file has been successfully uploaded!</p>'; 
} 

else 
{ echo "Problem with picture upload!"; 
} 
} // end of else

} // end of else 
?> 

Это мой код processinterview.php;

<?php
include_once 'includes/db.php';
$sql="INSERT INTO interview (interviewer, media_house, category, interview_title, title_rider, personality, interview_body, source, published, temp_file, interview_date, location, interview_intro, date) VALUES ('$_POST[interviewer]','$_POST[media_house]','$_POST[category]','$_POST  [interview_title]','$_POST[title_rider]','$_POST[personality]','$_POST [interview_body]','$_POST[source]','$_POST[published]','$_FILES[temp_file]','$_POST[interview_date]','$_POST[location]','$_POST[interview_intro]',now())";

if (!mysql_query($sql))
{
die('Error: ' . mysql_error());
}
echo "1 interview record has been successfully added to the database.";
?>

А это моя форма (submit_interview_test.php);

<form enctype="multipart/form-data" action="processinterview3.php" method="post">
<table bgcolor="#ececec" border="0" cellspacing="5">
<tbody>
<tr><td>Interview conducted by (Interviewer's Name):</td><td><input size="30"  name="interviewer" type="text" /></td></tr>
<tr><td>Media house (e.g., Punch):</td><td><input size="30" name="media_house" type="text" /></td></tr>
<tr><td>Location (e.g., Ibadan or USA):</td><td><input type="text" size="30" name ="location" /></td></tr>
<tr><td>Interview Category (e.g., Local):</td><td><input type="text" size="30" name   ="category" /></td></tr>
<tr><td>Interview Personality:</td><td><input type="text"  size="30" name ="personality" /></td></tr>
<tr><td>Interview Title:</td><td><input type="text"  size="130" name ="interview_title" /></td></tr>
<tr><td>Title Rider:</td><td><input type="text"  size="130" name ="title_rider" /></td></tr>
<tr><td>Source (e.g., http://...):</td><td><input size="130" name="source" type="text" /></td></tr>
<tr>  <td valign="top">Interview Introduction:</td>
<td><textarea name="interview_intro" rows="3" cols="100"></textarea></td></tr>
<tr><td>Date of Interview (e.g., 26/09/2009):</td><td><input size="30" name="interview_date" type="text" /></td></tr>
<tr>  <td valign="top">Interview Main Content:</td>
<td><textarea name="interview_body" rows="12" cols="100"></textarea></td></tr>
<tr><td>Add Photo (Jpeg or gif not more than 80KB):</td><td><input type="file" name="pic"/></td></tr>
<tr><td valign="top">Publish rightaway?</td>
<td><input type="checkbox" name="published" value="1"> Yes (Leave this if this   Interview is not to be published yet)<br>
<tr><td>&nbsp;</td><td><input value="Submit Interview" type="submit" name="upload"/><font face="arial" size="1">&nbsp;&nbsp;Please check for any error before you submit</font></td></tr>
</tbody></table>

person user249399    schedule 13.01.2010    source источник
comment
Вы открыты для sql-инъекций, и это должно быть решено довольно скоро :)   -  person treyBake    schedule 15.06.2018


Ответы (1)


1) Ваш запрос вставляет $_FILES[temp_name] в качестве значения для хранения, когда вы должны использовать только $temp_name.

2) Используйте следующий массив mime-типов для проверки (взято из кода проверки загруженного изображения среды Symfony):

<?php
  $valid_mimes = array(
    'image/jpeg',
    'image/pjpeg',
    'image/png',
    'image/x-png',
    'image/gif',
  );

  if(!in_array($_FILES['pic']['type'], $valid_mimes)) {
    // invalid mime
  }

Размер вашего файла можно проверить с помощью значения $_FILES['pic']['size'].

3) Существует ряд библиотек, доступных для создания изображений и эскизов, ваш конкретный выбор будет зависеть от того, какие поддерживающие графические библиотеки, если таковые имеются, установлены на вашем сервере (GD или ImageMagick). Вам может подойти любой из следующих результатов: http://www.google.com/search?q=php+image+thumbnail

person nortron    schedule 13.01.2010
comment
Спасибо Крио за оперативный ответ. Я не вижу $_FILE[temp_name] в своем коде, поэтому я предположил, что вы ссылаетесь на $_FILE[temp_file] в моем коде обработки (т. е. processinterview.php). Я изменил это на $temp_file (чтобы заменить $_FILE[temp_file]. На самом деле, на этот раз я получил значение в базе данных, но это непонятные вещи, такие как /tmp/php4hY4er, /tmp/phppUzQbA и т. д., а не фактические имена файлов. - person user249399; 13.01.2010
comment
/tmp/php4hY4er — это временный файл на сервере — вам нужно скопировать его в постоянное место и сохранить это имя файла. - person James; 13.01.2010
comment
Извините, используйте $_FILES['pic']['name'] в качестве имени исходного загруженного файла. - person nortron; 13.01.2010
comment
ОБНОВЛЕНИЕ: Спасибо, Крио. Наконец, я изменил tmp_name в $_FILES['pic']['tmp_name'] на просто 'name', таким образом став $_FILES['pic']['name'] в моем основном коде, и изменил $temp_file на $_FILES['pic ']['tmp_name'] в переходе на серверную часть кода. И это сделало это. Итак, теперь я могу загрузить изображение и вставить имя в базу данных. Спасибо за помощь. Я буду работать над остальными частями, как вы предложили. - person user249399; 13.01.2010