图像无法上传到数据库但保存到文件夹

时间:2016-09-02 02:33:43

标签: php mysql image image-uploading

我的表单是为用户上传图片。图像存储在一个文件夹中,该路径应该存储在数据库中,但事实并非如此。也就是说,图像正确上传到文件夹,但路径未保存到db。

我尝试了两个完全不同的查询,但都没有奏效。我也引用了这两个问题; How to upload images into MySQL database using PHP codephp image not uploading to database,以下是相关代码。

<?php

  // load current profile photo script

  $username='';
  $check_pic='';
  $check_pic = mysqli_query($connection,"SELECT profile_pic FROM users WHERE username='$username'");
  $get_pic_row = mysqli_fetch_assoc($check_pic);
  $profile_pic_db = $get_pic_row['profile_pic'];
  if ($profile_pic_db == "") {
  $profile_pic = "images/default_pic.jpg";
  }
  else
  {
  $profile_pic = "userdata/profile_pics/".$profile_pic_db;
  }


  //script for uploading profile photo

   if (isset($_FILES['profilepic'])) {
   if ((@$_FILES["profilepic"]["type"]=="image/jpeg")) {

   $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
   $rand_dir_name = substr(str_shuffle($chars), 0, 15);
   mkdir("C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name");

   if (file_exists("C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/".@$_FILES["profilepic"]["name"]))
   {
    echo @$_FILES["profilepic"]["name"]." Already exists";
   }
   else
   {

//moves images to folder userdata/profile_pics...

   move_uploaded_file(@$_FILES["profilepic"]["tmp_name"],"C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/".$_FILES["profilepic"]["name"]);

 //saves image url to table...

  $profile_pic_name = (@$_FILES["profilepic"]["name"]);
  $profile_pic_loc = "C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/$profile_pic_name'";

  if($profile_pic_query = mysqli_query($connection, "INSERT INTO users (profile_pic) VALUES ('$profile_pic_loc')")){

   echo "successful upload";
     }
   else {

   echo "unsuccessful upload";
     }

  header("Location: profile.php");

  }
  }
   else
  {
   echo "unsuccessful";
  }
  }


echo"

<p>UPLOAD PROFILE PHOTO:</p>
<form action='' method='POST' enctype='multipart/form-data'>
<img src='$profile_pic' width='70' />
<input type='file' name='profilepic' /><br />
<input type='submit' name='uploadpic' value='Upload Image'>
</form>
";

?>

我尝试将$profile_pic_query作为if语句的一部分,如上所示,并且没有if语句。我也尝试$profile_pic_name = file_get_contents(@$_FILES["profilepic"]["name"]);file_get_contents和没有//saves image to folder userdata/profile_pics... move_uploaded_file(@$_FILES["profilepic"]["tmp_name"],"C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/".$_FILES["profilepic"]["name"]); //saves image url to table... $profile_pic_name = @$_FILES["profilepic"]["name"]; $profile_pic_query = mysqli_query($connection, "UPDATE users SET profile_pic='C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/$profile_pic_name' WHERE username='$username'"); ,没有区别。 这是我试过的另一种格式,我尝试过没有做任何不同的事情;

<? php
session_start();
if (isset($_SESSION['user_login'])) {
$username = $_SESSION["user_login"];
}
else {
$username = "";
}
?>

这是会话内容......

//var 3 obj models, cushion, backrest and frame , and var chair01 as a group for including 3 obj
        var parts = {
        cushion:"cushion",
        backrest:"bracket",
        frame:"frame";
        }


        var chair01 = new THREE.Object3D();
        var loader = new THREE.OBJLoader( manager );

//load obj model with function
        loadObj("chair/obj/cushion.obj", parts.cushion, materialCushion);
        loadObj("chair/obj/backrest.obj", parts.backrest, materialBackrest);
        loadObj("chair/obj/frame.obj", parts.frame, materialFrame);

        function loadObj(path, name, material) {
            loader.load('model-stuff/' + path, function( object ) {
                    object.traverse( function ( child ){
                        if ( child instanceof THREE.Mesh ) {
                            var uvs = child.geometry.attributes.uv.array;
                            child.geometry.addAttribute( 'uv2', new THREE.BufferAttribute( uvs, 2 ) );
                            child.material = material;
                            child.receiveShadow = true;
                            child.castShadow = true;
                        }
                    });
                parts[name] = object;
                parts[name].position.y = -10;
                chair01.add( parts[name]);
                //parts[name] = object;
            }, onProgress, onError);
        }

//add chair01 into scene
        scene.add(chair01);

//remove frame from chair01
        manager.onLoad = function() {
            chair01.remove(parts.frame);
        }

那么会话,查询是否有问题,或者我是否因为某些原因而发出语法错误而未被警告?

****更新**

根据以下建议,我注释掉了;

  

标题(位置:&#39; profile.php&#39;);

我显然非常受欢迎的错误:

  

file_get_contents(.jpg):无法打开流:没有此类文件或目录

常见的建议似乎围绕着确保创建了一个合适的tmp_file,但在这里似乎并非如此?

3 个答案:

答案 0 :(得分:1)

你有几个问题。

首先,您存储位置的查询是错误的,您的&#34;插入...其中......&#34;形式是不正确的。您应该使用&#34;插入...值...&#34;如MySQL文档中所述。

其次,你不应该在诸如move或mkdir之类的函数中使用相对路径。您可以在此处了解原因:PHP - Failed to open stream : No such file or directory

第三,你不能使用&#34; header()&#34;回声之后。 Header()发送http响应的头文件。一旦开始回显,就无法完成此操作,因为标题已经发送。

答案 1 :(得分:0)

我自己已经解决了这个问题,并希望与任何有类似困境的人分享......有几个明显的问题。好吧,我收到的错误似乎是错误的。错误是关于负责将图像从客户端上传到服务器的硬盘的脚本部分。脚本正确上传并保存图像,但是当我删除路径中不必要的部分时,我得到的错误得到修复。

主要问题在于查询,将图片网址上传到桌面,根本没有发生。当我重新编写查询时,这一切都得到了纠正。看下面的所有代码。

<?php



  $check_pic = mysqli_query($connection,"SELECT profile_pic FROM users WHERE username='$username'");
  $get_pic_row = mysqli_fetch_assoc($check_pic);
  $profile_pic_db = $get_pic_row['profile_pic'];
  if ($profile_pic_db == "") {
  $profile_pic = "images/default_pic.jpg";
  }
  else
  {
  $profile_pic = "userdata/profile_pics/".$profile_pic_db;
  }

  //script for uploading profile photo to hard disk

   if (isset($_FILES['profilepic'])) {
   if ((@$_FILES["profilepic"]["type"]=="image/jpeg")) {

   $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
   $rand_dir_name = substr(str_shuffle($chars), 0, 15);
   mkdir("userdata/profile_pics/$rand_dir_name");

   if (file_exists("userdata/profile_pics/$rand_dir_name/".@$_FILES["profilepic"]["name"]))
   {
    echo @$_FILES["profilepic"]["name"]." Already exists";
   }
   else
   {
   move_uploaded_file(@$_FILES["profilepic"]["tmp_name"],"userdata/profile_pics/$rand_dir_name/".$_FILES["profilepic"]["name"]);

  //update table with url for photo

 $profile_pic_loc = "$rand_dir_name/".@$_FILES["profilepic"]["name"];


 $profile_pic_query = mysqli_query($connection, "UPDATE users SET profile_pic='$profile_pic_loc' WHERE username='$username'"); 


  if ($profile_pic_query) {

   header("Location: profile.php");
     }

   else 
   {
        die('failure');
     }
   }
  }
   }


   echo    " 

<div>
<p>UPLOAD PROFILE PHOTO:</p>
<form action='profile.php' method='POST' enctype='multipart/form-data'>
<img src='$profile_pic' width='70' />
<input type='file' name='profilepic' /><br />
<input type='submit' name='uploadpic' value='Upload Image'>
</form>
</div>
";


?>

改变;

mkdir("C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name");

   if (file_exists("C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/".@$_FILES["profilepic"]["name"]))

move_uploaded_file(@$_FILES["profilepic"]["tmp_name"],"C:/xampp/htdocs/folder/userdata/profile_pics/$rand_dir_name/".$_FILES["profilepic"]["name"]);

mkdir("userdata/profile_pics/$rand_dir_name");

   if (file_exists("userdata/profile_pics/$rand_dir_name/".@$_FILES["profilepic"]["name"]))
   {

move_uploaded_file(@$_FILES["profilepic"]["tmp_name"],"userdata/profile_pics/$rand_dir_name/".$_FILES["profilepic"]["name"]);

纠正了所有关于'提交到打开文件流'的错误错误以及什么不是......虽然我仍然不知道这意味着什么。

还将查询更正为;

$profile_pic_loc = "$rand_dir_name/".@$_FILES["profilepic"]["name"];


 $profile_pic_query = mysqli_query($connection, "UPDATE users SET profile_pic='$profile_pic_loc' WHERE username='$username'"); 


  if ($profile_pic_query) {

   header("Location: profile.php");
     }

   else 
   {
        die('failure');
     }

成功将图片网址插入表格。现在就像一个冠军。

答案 2 :(得分:-1)

更改mkdir()的代码可能对您有帮助。

 mkdir("userdata/profile_pics/$rand_dir_name");

TO

 mkdir("userdata/profile_pics/$rand_dir_name/{$_FILES['profilepic']['name']}");