【问题标题】:Updating Images in MySQL with PHP使用 PHP 更新 MySQL 中的图像
【发布时间】:2012-02-25 23:54:27
【问题描述】:

我正在为用户创建将他们的个人资料照片上传到数据库的功能。我设法以二进制形式 (BLOB) 将我的照片上传到数据库,但在尝试显示时遇到问题。

上传表单代码:

<?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; 
?>

我可以看到包含一些位的图像列的数据库表,但我似乎无法显示它。请指教。

【问题讨论】:

  • 不要将实际图像存储在数据库中...将其存储在文件系统中,并将该文件的路径保存在数据库中

标签: php


【解决方案1】:

您检索和显示图像的代码看起来是正确的,但是我猜您由于这条过滤线而永远不会进入查询:

$id = $_REQUEST['student_id']; 

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

is_int() 测试值的类型是否为整数,来自$_GET, $_POST, $_REQUEST 的值始终是字符串。 ,所以你的条件是总是错误的。您可以改用ctype_digit()is_numeric()intval($id) == $id 对其进行测试。此外,empty() 隐式调用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!"); 
}

【讨论】:

  • 那么,我怎样才能让图像可见?如果我删除这行 "if(!isset($id) || empty($id) || !is_int($id)){ die("请选择您的图像!"); }" 会发生什么?这会有帮助吗?
  • @Steve87 只需用我的两个建议之一替换该行。不要删除它,因为您需要它来正确验证您的 $id 以防止 SQL 注入。保持其后面的 else {} 不变。
【解决方案2】:

没有任何错误,很难说,但如果不是 Michael 建议的 ID 问题,则可能 [也] 是您的图像数据在上传时损坏。您是否尝试过直接下载(例如wget 该网址)并在本地打开它? JPEG 标头在吗?

一些通用的cmets:

  1. 您确定要将图像存储在数据库中吗?它是 通常首选存储文件名/ URL 片段,并保留 磁盘上的二进制数据,特别是如果它们是较大的图像。看 php:Store image into Mysql blob, Good or bad? 讨论。

  2. 无论哪种方式,上传代码都是在自找麻烦。 addslashes() 是 不足以解决转义问题,请使用特定的 mysqli::real escape-string 防范SQL Injection 攻击 - this post 探讨了一些差异。

  3. 如果您的 MySQL 数据库与您的网络服务器托管在同一个机器上,您 甚至可以通过使用MySQL LOAD_FILE 函数来节省精力(并提高速度),但从长远来看,这不是很可扩展。

  4. 考虑将所有登录详细信息移到单独的文件中,从 webroot 中移出以确保安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2012-10-09
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多