2012-02-25 5 views
0

Я нахожусь в пути, чтобы создать функцию, позволяющую пользователям загружать свою фотографию профиля в базу данных. Я могу загрузить свою фотографию в базу данных в двоичной форме (BLOB), но у меня возникла проблема при ее отображении.Обновление изображений в MySQL с помощью PHP

загрузить код формы:

<?php //get the posted image when the submit button is clicked 
$username = "MentorMenteeData"; 
$password = "mentormenteedata"; 
$host = "localhost"; 
$database = "mentormenteesystem"; 

// Make the connect to MySQL or die 
// and display an error. 
$link = mysql_connect($host, $username, $password); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 

// Select your database 
mysql_select_db ($database);   

    if (isset($_FILES['image']) && $_FILES['image']['size'] > 0) { 

     // Temporary file name stored on the server 
     $tmpName = $_FILES['image']['tmp_name']; 

     // Read the file 
     $fp  = fopen($tmpName, 'r'); 
     $data = fread($fp, filesize($tmpName)); 
     $data = addslashes($data); 
     fclose($fp); 

     $student_id=$row_student['student_id']; 

     // Create the query and insert 
     // into our database. 
     $query = "UPDATE student SET student_img='$data' WHERE student_id ='$student_id'"; 
     $query .= "(image) VALUES ('$data')"; 
     $results = mysql_query($query, $link); 

     // Print results 
     print "Thank you, your file has been uploaded."; 

} 
else { 
    print "No image selected/uploaded"; 
} 

// Close our MySQL Link 
mysql_close($link); 
?> 

<form action="" method="post" enctype="multipart/form-data" name="changer"> 

<strong style="color: #FFD700;">Upload your image:</strong><br /> 
<input name="MAX_FILE_SIZE" value="102400" type="hidden"><br /><br /> 
<input namge="image" accept="image/jpeg" type="file"> 
<input type="submit" value="Submit"> 
</form> 

Код для отображения изображения:

<?php 

$username = "MentorMenteeData"; 
$password = "mentormenteedata"; 
$host = "localhost"; 
$database = "mentormenteesystem"; 

mysql_connect($host, $username, $password) or die("Can not connect to database: ".mysql_error()); 

mysql_select_db($database) or die("Can not select the database: ".mysql_error()); 

$id = $_REQUEST['student_id']; 

if(!isset($id) || empty($id) || !is_int($id)){ 
    die("Please select your image!"); 
}else{ 

$query = mysql_query("SELECT * FROM student WHERE student_id='".$id."'"); 
$row = mysql_fetch_array($query); 
$content = $row['image']; 
} 

header('Content-type: image/jpeg'); 
    echo $content; 
?> 

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

+0

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

ответ

2

Ваш код для извлечения и отображения изображения выглядит правильно, но я предполагаю, что вы никогда не попасть на запрос из-за этой фильтрации линии:

$id = $_REQUEST['student_id']; 

if(!isset($id) || empty($id) || !is_int($id)){ 
    die("Please select your image!"); 
} 

is_int() проверяет, является ли тип value - целое число, а значения, исходящие от $_GET, $_POST, $_REQUEST, всегда являются строками. , поэтому ваше состояние всегда ложно. Вы можете проверить его вместо ctype_digit() или is_numeric(), или intval($id) == $id. Кроме того, звонит isset() неявно, поэтому isset() не требуется.

// ctype_digit() method... 
if (empty($id) || !ctype_digit($id)) { 
    die("Please select your image!"); 
} 

// intval() method... 
if (empty($id) || (intva($id) != $id)) {  
    die("Please select your image!");  
} 
+0

Итак, как я могу получить изображение, чтобы быть видимым? что произойдет, если я удалю эту строку «if (! isset ($ id) || empty ($ id) ||! is_int ($ id)) { die (" Пожалуйста, выберите ваше изображение!"); }"? Это поможет? – Steve87

+0

@ Steve87 Просто замените эту линию одним из двух моих предложений. Не удаляйте его, так как вам это нужно, чтобы правильно проверить ваш '$ id' на SQL-инъекцию. Оставьте 'else {}', который следует за ним неповрежденным. –

1

без каких-либо ошибок, это трудно сказать, но если это не проблема ID, как предложил Майклу, он может [также] быть порча данных изображений на загрузку. Вы пытались загрузить напрямую (например, wget этот URL-адрес) и открыть его локально? Есть ли в нем заголовок JPEG?

Некоторые общие замечания:

  1. Вы уверены, что вы хотите хранить изображения в базе данных? Обычно предпочитают хранить имена файлов/URL-фрагментов и оставлять двоичные данные на диске, особенно если они больше. См. php:Store image into Mysql blob, Good or bad? для обсуждения.

  2. В любом случае, код загрузки запрашивает проблемы. addslashes() является не достаточно, чтобы исправить убегающую проблему, используйте один конкретный как mysqli::real escape-string для защиты от SQL Injection атак - this post исследует некоторые различия.

  3. Если MySQL DB размещается на том же поле, что и ваш веб-сервер, вы даже сэкономить усилия (и увеличить скорость), используя функцию MySQL LOAD_FILE, но это не очень масштабируемым в долгосрочной перспективе.

  4. Рассмотрите возможность перемещения всех ваших данных для входа в отдельный файл из веб-сайта для обеспечения безопасности.

Смежные вопросы