在DB列中保存图像URL路径

时间:2022-09-03 23:27:26

i am updating name , email in DB of registered user through php form. its working fine.

我正在通过php表格更新名称,在注册用户的DB中发送电子邮件。它的工作正常。

class.usr.php

public function update($uname,$email, $tax)
    {
    try {
    $stmt = $this->conn->prepare('UPDATE tbl_users SET userName = ?, userEmail = ? , tax = ?  WHERE userID = ? ');
    $stmt->execute(array($uname,$email, $tax , $_SESSION['userSession']));
    return $stmt->fetch();
    } catch(PDOException $e) {
        echo '<p class="bg-danger">'.$e->getMessage().'</p>';
    }

form

<form action="profile.php" method="POST" enctype="multipart/form-data">

Name : 
<input type="text" name="txtuname" value="<?php echo $row['userName'] ?>" /><br/>
Email :
<input type="text" name="txtemail" value="<?php echo $row['userEmail'] ?>" /><br>
Image
<input type="file" name="photo" id="fileSelect"><br> 

<input type="submit" name="submit" value="Save" />

</form>

form related code to save in db

表单相关代码保存在db中

<?php

$user_home = new USER();

if(!$user_home->is_logged_in())
{
    header("Location: index.php");
die();
}

if (isset($_POST['submit'])) {
// new data
$uname = $_POST['txtuname'];
$email = $_POST['txtemail'];
$tax = trim($_POST['tax']); // image url path

$uid = (isset($_SESSION['userSession']) ? intval($_SESSION['userSession']) : 0);

if ($uid > 0 && $user_home->update($uname,$email, $tax, $uid))
{
    header("Location: profile1.php");
   die(); 
}
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_users WHERE userID=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

?>

after this, now i am uploading an image to folder through same php form successfully with below code.

在此之后,现在我通过下面的代码成功地通过相同的PHP表单将图像上传到文件夹。

    <?php 
if(isset($_FILES["photo"]["error"])){ 
if($_FILES["photo"]["error"] > 0){ 
echo "Error: " . $_FILES["photo"]["error"] . "<br>"; 

} else{ 
$allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png"); 
$filename = $_FILES["photo"]["name"]; 
$filetype = $_FILES["photo"]["type"]; 
$filesize = $_FILES["photo"]["size"]; 

// Verify file extension 
$ext = pathinfo($filename, PATHINFO_EXTENSION); 
if(!array_key_exists($ext, $allowed)) die("Error: Please select a valid file format."); 

// Verify file size - 5MB maximum 
$maxsize = 5 * 1024 * 1024; 
if($filesize > $maxsize) die("Error: File size is larger than the allowed limit."); 

// Verify MYME type of the file 
if(in_array($filetype, $allowed)){ 
// Check whether file exists before uploading it 
if(file_exists("upload/" . $_FILES["photo"]["name"])){ 
echo $_FILES["photo"]["name"] . " is already exists."; 

} else{ 
move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $_FILES["photo"]["name"]); 

echo "Your file was uploaded successfully."; 
} 
} else{ 

echo "Error: There was a problem uploading your file - please try again."; 
} 

} 

} else{ 
echo ""; 
} 

?>

now images are just saving in folders, what i need is i want that image path to save in database and assign that image path to uploaded user in database. so that one registered user can update the existing image, but not upload one more image.

现在图像只是保存在文件夹中,我需要的是我希望该图像路径保存在数据库中并将该图像路径分配给数据库中的上传用户。这样一个注册用户就可以更新现有图像,但不能再上传一个图像。

i tried below code , but not working:

我尝试下面的代码,但没有工作:

<?php
$folder = "upload/"; 
    $file = basename( $_FILES['image']['name']); 
    $full_path = $folder.$file; 
    $tax= $full_path;

    if(in_array($filetype, $allowed)){ 
// Check whether file exists before uploading it 
if(file_exists("upload/" . $_FILES["photo"]["name"])){ 
echo $_FILES["photo"]["name"] . " is already exists."; 

} else{ 
move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $_FILES["photo"]["name"]); 

echo "Your file was uploaded successfully."; 
} 
} else{ 

echo "Error: There was a problem uploading your file - please try again."; 
} 

} 

} else{ 
echo ""; 
} 
?>

db columns : userName, userEmail, tax , photo

db列:userName,userEmail,tax,photo

with help of google i done all above, i am new to php, so please kindly help me.

谷歌的帮助我完成了以上所有,我是新来的PHP,所以请帮助我。

2 个解决方案

#1


0  

Add new function for saving files and use global php var $_FILES

添加新函数以保存文件并使用全局php var $ _FILES

1 Add new column to your DB to store file path, let's name it photo

1在数据库中添加新列以存储文件路径,我们将其命名为照片

2 Add new functions for your user class:

2为您的用户类添加新功能:

<?php
class User {
...
  const PATH_PHOTOS = '/path/to/photo/folder/';
  const BASE_URL = 'http://YOUR_DOMAIN_NAME:YOUR_PORT/YOUR_PATH/';

  public function add_photo($file)
  {
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    $file['new_name'] = uniqid(rand(), true) . ".$ext";
    if (!$this->_upload_file($file))
      return false;
    return $this->_remove_previous_photo()->_add_file_to_db(self::PATH_PHOTOS .     basename($file['new_name']));
  }

  protected function _remove_previous_photo()
  {
    $photo = $this->get_photo();
    if ($photo)
      unlink($photo);
    return $this;
  }

  public function get_photo()
  {
    global $_SESSION;
    $stmt = $this->conn->prepare('SELECT photo FROM tbl_users WHERE userID = ?     ');
    $stmt->execute(array($_SESSION['userSession']));
    $result = $stmt->fetch();
    return reset($result);
  }

  public function get_photo_url()
  {
    $pathInfo = pathinfo($this->get_photo());
    $last_dir = end(explode(DIRECTORY_SEPARATOR, $pathInfo['dirname']));
    return self::BASE_URL . "$last_dir/" . basename($this->get_photo());
  }

  protected function _upload_file($file)
  {
    $uploadfile = self::PATH_PHOTOS . $file['new_name'];
    return move_uploaded_file($file['tmp_name'], $uploadfile);
  }

  protected function _add_file_to_db($file_path)
  {
    try {
      $stmt = $this->conn->prepare('UPDATE tbl_users SET photo = ? WHERE userID = ? ');
      return $stmt->execute(array($file_path, $_SESSION['userSession']));
    } catch (PDOException $e) {
      echo '<p class="bg-danger">' . $e->getMessage() . '</p>';
    }
  }
...
}
?>

3 The main file should look like this:

3主文件应如下所示:

<?php

$user_home = new USER();

if(!$user_home->is_logged_in())
{
    header("Location: index.php");
die();
}

if (isset($_POST['submit'])) {
// new data
$uname = $_POST['txtuname'];
$email = $_POST['txtemail'];
$tax = trim($_POST['tax']); // image url path

$uid = (isset($_SESSION['userSession']) ? intval($_SESSION['userSession']) : 0);

if ($uid > 0 && $user_home->update($uname,$email, $tax, $uid) && $user_home->add_photo($_FILES['photo']))
{
    header("Location: profile1.php");
   die(); 
}
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_users WHERE userID=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

?>

Hope this helps

希望这可以帮助

#2


1  

Here is another solution:

这是另一个解决方案:

First of all execute this query manually to add the new column:

首先手动执行此查询以添加新列:

ALTER TABLE `tbl_users` ADD `photo` VARCHAR(255) NOT NULL ;

Then this is the php code:

那么这是php代码:

<?php
$dbConn = new Database();
$dbConn->dbConnection();

$user_home = new USER();

function uploadUserPhoto($uid) {
    global $dbConn;
    if(isset($_FILES["photo"]["error"])) {
        if($_FILES["photo"]["error"] > 0) {
            echo "Error: " . $_FILES["photo"]["error"] . "<br>";

        } else {
            $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
            $filename = $_FILES["photo"]["name"];
            $filetype = $_FILES["photo"]["type"];
            $filesize = $_FILES["photo"]["size"];

            $userDir = $uid;

            // Verify file extension
            $ext = pathinfo($filename, PATHINFO_EXTENSION);
            if(!array_key_exists($ext, $allowed)) die("Error: Please select a valid file format.");

            // Verify file size - 5MB maximum
            $maxsize = 5 * 1024 * 1024;
            if($filesize > $maxsize) die("Error: File size is larger than the allowed limit.");

            // Verify MYME type of the file
            if(in_array($filetype, $allowed)) {
                if(!is_dir('upload/'.$uid)) {
                    mkdir('upload/'.$uid);
                }

                $photoname = time().$uid.'_photo'.'.'.$ext;

                // delete all the files in this directory
                $files = glob('upload/'.$uid.'/*'); // get all file names
                foreach($files as $file){ // iterate files
                    if(is_file($file))
                        unlink($file); // delete file
                }

                // Upload the photo
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $uid . '/'. $photoname);

                $updateData = array(':userID' => $uid, ':photo' => $photoname);
                $stmt = $dbConn->conn->prepare("UPDATE tbl_users SET photo=:photo WHERE userID=:uid");
                $stmt->execute($updateData);

                echo "Your file was uploaded successfully.";
            } else {
                echo "Error: There was a problem uploading your file - please try again.";
            }
        }
    } else {
        echo "";
    }
}

if(!$user_home->is_logged_in())
{
    header("Location: index.php");
    die();
}

if (isset($_POST['submit'])) {
    // new data
    $uname = $_POST['txtuname'];
    $email = $_POST['txtemail'];
    $tax = trim($_POST['tax']); // image url path

    $uid = (isset($_SESSION['userSession']) ? intval($_SESSION['userSession']) : 0);

    if ($uid > 0 && $user_home->update($uname,$email, $tax, $uid))
    {
        uploadUserPhoto($uid);
        header("Location: profile1.php");
        die();
    }
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_users WHERE userID=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
?>

There is $dbConnection variable which is the connection to the DB but because I don't know the rest of your code you should replace it with your proper db connection variable.

有$ dbConnection变量,它是与DB的连接,但因为我不知道你的其余代码,你应该用适当的db连接变量替换它。

The photo of the user is saved in photo column in tbl_users and for every user is created sub dir in uploads dir. The subdir is the userID. So for example for user with userID = 1 its upload path will be uploads/1/<filename>.

用户的照片保存在tbl_users的照片栏中,并且每个用户都在上传目录dir中创建了子目录。 subdir是userID。因此,例如对于userID = 1的用户,其上传路径将是uploads / 1 /

File name is generated dynamically - this avoids caching of uploaded photo with the same name for example ... and it is better approach.

文件名是动态生成的 - 这可以避免缓存上传的照片,例如相同的名称......这是更好的方法。

You have to make a change in code for displaying the photo because now its filename is in the DB and there is subdir in uploads (which is the userID of the user)

您必须更改显示照片的代码,因为现在它的文件名在数据库中,并且上传中有子目录(这是用户的用户ID)

#1


0  

Add new function for saving files and use global php var $_FILES

添加新函数以保存文件并使用全局php var $ _FILES

1 Add new column to your DB to store file path, let's name it photo

1在数据库中添加新列以存储文件路径,我们将其命名为照片

2 Add new functions for your user class:

2为您的用户类添加新功能:

<?php
class User {
...
  const PATH_PHOTOS = '/path/to/photo/folder/';
  const BASE_URL = 'http://YOUR_DOMAIN_NAME:YOUR_PORT/YOUR_PATH/';

  public function add_photo($file)
  {
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    $file['new_name'] = uniqid(rand(), true) . ".$ext";
    if (!$this->_upload_file($file))
      return false;
    return $this->_remove_previous_photo()->_add_file_to_db(self::PATH_PHOTOS .     basename($file['new_name']));
  }

  protected function _remove_previous_photo()
  {
    $photo = $this->get_photo();
    if ($photo)
      unlink($photo);
    return $this;
  }

  public function get_photo()
  {
    global $_SESSION;
    $stmt = $this->conn->prepare('SELECT photo FROM tbl_users WHERE userID = ?     ');
    $stmt->execute(array($_SESSION['userSession']));
    $result = $stmt->fetch();
    return reset($result);
  }

  public function get_photo_url()
  {
    $pathInfo = pathinfo($this->get_photo());
    $last_dir = end(explode(DIRECTORY_SEPARATOR, $pathInfo['dirname']));
    return self::BASE_URL . "$last_dir/" . basename($this->get_photo());
  }

  protected function _upload_file($file)
  {
    $uploadfile = self::PATH_PHOTOS . $file['new_name'];
    return move_uploaded_file($file['tmp_name'], $uploadfile);
  }

  protected function _add_file_to_db($file_path)
  {
    try {
      $stmt = $this->conn->prepare('UPDATE tbl_users SET photo = ? WHERE userID = ? ');
      return $stmt->execute(array($file_path, $_SESSION['userSession']));
    } catch (PDOException $e) {
      echo '<p class="bg-danger">' . $e->getMessage() . '</p>';
    }
  }
...
}
?>

3 The main file should look like this:

3主文件应如下所示:

<?php

$user_home = new USER();

if(!$user_home->is_logged_in())
{
    header("Location: index.php");
die();
}

if (isset($_POST['submit'])) {
// new data
$uname = $_POST['txtuname'];
$email = $_POST['txtemail'];
$tax = trim($_POST['tax']); // image url path

$uid = (isset($_SESSION['userSession']) ? intval($_SESSION['userSession']) : 0);

if ($uid > 0 && $user_home->update($uname,$email, $tax, $uid) && $user_home->add_photo($_FILES['photo']))
{
    header("Location: profile1.php");
   die(); 
}
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_users WHERE userID=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

?>

Hope this helps

希望这可以帮助

#2


1  

Here is another solution:

这是另一个解决方案:

First of all execute this query manually to add the new column:

首先手动执行此查询以添加新列:

ALTER TABLE `tbl_users` ADD `photo` VARCHAR(255) NOT NULL ;

Then this is the php code:

那么这是php代码:

<?php
$dbConn = new Database();
$dbConn->dbConnection();

$user_home = new USER();

function uploadUserPhoto($uid) {
    global $dbConn;
    if(isset($_FILES["photo"]["error"])) {
        if($_FILES["photo"]["error"] > 0) {
            echo "Error: " . $_FILES["photo"]["error"] . "<br>";

        } else {
            $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
            $filename = $_FILES["photo"]["name"];
            $filetype = $_FILES["photo"]["type"];
            $filesize = $_FILES["photo"]["size"];

            $userDir = $uid;

            // Verify file extension
            $ext = pathinfo($filename, PATHINFO_EXTENSION);
            if(!array_key_exists($ext, $allowed)) die("Error: Please select a valid file format.");

            // Verify file size - 5MB maximum
            $maxsize = 5 * 1024 * 1024;
            if($filesize > $maxsize) die("Error: File size is larger than the allowed limit.");

            // Verify MYME type of the file
            if(in_array($filetype, $allowed)) {
                if(!is_dir('upload/'.$uid)) {
                    mkdir('upload/'.$uid);
                }

                $photoname = time().$uid.'_photo'.'.'.$ext;

                // delete all the files in this directory
                $files = glob('upload/'.$uid.'/*'); // get all file names
                foreach($files as $file){ // iterate files
                    if(is_file($file))
                        unlink($file); // delete file
                }

                // Upload the photo
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $uid . '/'. $photoname);

                $updateData = array(':userID' => $uid, ':photo' => $photoname);
                $stmt = $dbConn->conn->prepare("UPDATE tbl_users SET photo=:photo WHERE userID=:uid");
                $stmt->execute($updateData);

                echo "Your file was uploaded successfully.";
            } else {
                echo "Error: There was a problem uploading your file - please try again.";
            }
        }
    } else {
        echo "";
    }
}

if(!$user_home->is_logged_in())
{
    header("Location: index.php");
    die();
}

if (isset($_POST['submit'])) {
    // new data
    $uname = $_POST['txtuname'];
    $email = $_POST['txtemail'];
    $tax = trim($_POST['tax']); // image url path

    $uid = (isset($_SESSION['userSession']) ? intval($_SESSION['userSession']) : 0);

    if ($uid > 0 && $user_home->update($uname,$email, $tax, $uid))
    {
        uploadUserPhoto($uid);
        header("Location: profile1.php");
        die();
    }
}

$stmt = $user_home->runQuery("SELECT * FROM tbl_users WHERE userID=:uid");
$stmt->execute(array(":uid"=>$_SESSION['userSession']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
?>

There is $dbConnection variable which is the connection to the DB but because I don't know the rest of your code you should replace it with your proper db connection variable.

有$ dbConnection变量,它是与DB的连接,但因为我不知道你的其余代码,你应该用适当的db连接变量替换它。

The photo of the user is saved in photo column in tbl_users and for every user is created sub dir in uploads dir. The subdir is the userID. So for example for user with userID = 1 its upload path will be uploads/1/<filename>.

用户的照片保存在tbl_users的照片栏中,并且每个用户都在上传目录dir中创建了子目录。 subdir是userID。因此,例如对于userID = 1的用户,其上传路径将是uploads / 1 /

File name is generated dynamically - this avoids caching of uploaded photo with the same name for example ... and it is better approach.

文件名是动态生成的 - 这可以避免缓存上传的照片,例如相同的名称......这是更好的方法。

You have to make a change in code for displaying the photo because now its filename is in the DB and there is subdir in uploads (which is the userID of the user)

您必须更改显示照片的代码,因为现在它的文件名在数据库中,并且上传中有子目录(这是用户的用户ID)