使用PHP将图像上载到文件夹,同时将描述保存到数据库

使用PHP将图像上载到文件夹,同时将描述保存到数据库,php,mysql,upload,Php,Mysql,Upload,用户决定上载多个图像以用于分类列表。我需要做的是: 上传带有每个图像描述的图像-已解决 将图像保存到指定的文件夹中 使用说明将图像位置保存到my MySQL数据库-已解决 能够调用分类列表中的图像和描述,类似于库设置 我的表架构设置如下(简化): 有人能带我走过这个过程吗?谢谢 step3.php 文件名: 说明: 文件名: 说明: upload.php 我知道我的upload.php还没有针对多个图像文件进行配置,但这只是一个开始 我使用$\u SESSION['f

用户决定上载多个图像以用于分类列表。我需要做的是:

  • 上传带有每个图像描述的图像-已解决
  • 将图像保存到指定的文件夹中
  • 使用说明将图像位置保存到my MySQL数据库-已解决
  • 能够调用分类列表中的图像和描述,类似于库设置
  • 我的表架构设置如下(简化):

    有人能带我走过这个过程吗?谢谢

    step3.php
    
    
    文件名:
    

    说明:

    文件名:

    说明:

    upload.php
    
    
    我知道我的upload.php还没有针对多个图像文件进行配置,但这只是一个开始

    我使用
    $\u SESSION['file\n\u desc']
    将描述保存到数据库中。我只需要弄清楚如何上传该死的图片到文件夹,然后保存到数据库的位置


    我还需要将图像重命名为随机字符串(以防止图像被覆盖)。我知道我可以用
    rand()
    函数来实现这一点。

    不确定您有哪些错误,因为您的头脑中似乎已经非常清楚这个过程。第一次这样做时,我使用本教程作为指导,一切都很顺利:


    我可以建议将文件存储在数据库中吗??这样可以减少安全问题

    不确定你犯了什么错误,因为你的头脑中似乎很清楚这个过程。第一次这样做时,我使用本教程作为指导,一切都很顺利:


    我可以建议将文件存储在数据库中吗??这样可以减少安全问题

    p.S:我感觉你是个初学者,我想我在这个时候列了一个不错的清单

    2) 将图像保存到指定的文件夹中

    应该有用。我想到的是,您没有设置正确的写入权限来移动文件。您使用的是哪种服务器(Linux/Windows/MacOSX)?函数返回的布尔值(结果)是什么

    还有一件事:我需要将图像重命名为随机字符串 (以防止图像被覆盖)。我知道我可以用这个 rand()函数,但我在原来的帖子中忘了提到它

    rand()
    不是真正随机的,可能会给出重复的文件名。将是独一无二的

    编辑:我想出了用 $\会话['file\n\u desc']。我只需要弄清楚如何上传 修改内容,然后将位置保存到数据库中

    当使用session时,当您没有覆盖session时,您不是在使用MySQL数据库,而是在使用MySQL数据库。您可以阅读本教程以了解更多信息。标准此会话(仅适用于该会话)。请尝试以下代码:

    <?php
    
    session_start();
    
    echo "<p>";
    if (isset($_SESSION['count'])) {
        echo $_SESSION['count']++;
    } else {
        $_SESSION['count'] = 0;
        echo $_SESSION['count']++;
    }
    echo "</p>";
    
    echo "<p>" . session_id() . "</p>";
    

    能够调用其分类中的图像和描述 以图库设置的形式列出

    我用(好的阅读)来做(我的)SQL。我使用。为了访问数据库,我在内存模式下使用了SQLite(做SQL测试非常好)=>
    newPDO('SQLite::memory:')。我试着跟着(好书)

    通常您会将其拆分为多个文件。每个类都在一个单独的文件中。每个类都应该在单独的文件中单独测试(松耦合)

    我曾经将“列表映射到图像”。我认为这个例子已经过了非常彻底的测试,但现在确实是我睡觉的时候了,所以我不确定;)


    p.S:我感觉你是个初学者,我想我在

    2) 将图像保存到指定的文件夹中

    应该有用。我想到的是,您没有设置正确的写入权限来移动文件。您使用的是哪种服务器(Linux/Windows/MacOSX)?函数返回的布尔值(结果)是什么

    还有一件事:我需要将图像重命名为随机字符串 (以防止图像被覆盖)。我知道我可以用这个 rand()函数,但我在原来的帖子中忘了提到它

    rand()
    不是真正随机的,可能会给出重复的文件名。将是独一无二的

    编辑:我想出了用 $\会话['file\n\u desc']。我只需要弄清楚如何上传 修改内容,然后将位置保存到数据库中

    当使用session时,当您没有覆盖session时,您不是在使用MySQL数据库,而是在使用MySQL数据库。您可以阅读本教程以了解更多信息。标准此会话(仅适用于该会话)。请尝试以下代码:

    <?php
    
    session_start();
    
    echo "<p>";
    if (isset($_SESSION['count'])) {
        echo $_SESSION['count']++;
    } else {
        $_SESSION['count'] = 0;
        echo $_SESSION['count']++;
    }
    echo "</p>";
    
    echo "<p>" . session_id() . "</p>";
    

    能够调用其分类中的图像和描述 以图库设置的形式列出

    我用(好的阅读)来做(我的)SQL。我使用。为了访问数据库,我在内存模式下使用了SQLite(做SQL测试非常好)=>
    newPDO('SQLite::memory:')。我试着跟着(好书)

    通常您会将其拆分为多个文件。每个类都在一个单独的文件中。每个类都应该在单独的文件中单独测试(松耦合)

    我曾经将“列表映射到图像”。我认为这个例子已经过了非常彻底的测试,但现在确实是我睡觉的时候了,所以我不确定;)

    1)上传文件
    对文件输入使用数组语法时,文件索引是最后一个键<代码>$\u文件[“文件”][“名称”]
    是一个文件名数组。要获取第i个文件的信息,您需要访问
    $\u文件[“文件”][“名称”][$i]
    $\u文件[“文件”][“大小”][$i]
    &c

    2) 将图像保存到文件夹
    $\u文件中的某些数据(如名称)来自客户端,因此不可信(即先验证)。在的情况下,可以使用来验证目标文件路径名是否安全,或者使用或来提取la
    
    <?php
    
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 1048600)) // less than 1MB
      {
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
      else
        {
        header("Location: step4.php");
    /*
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    
    */
        if (file_exists("upload/" . $_FILES["file"]["name"]))
          {
          echo $_FILES["file"]["name"] . " already exists. ";
          }
        else
          {
          move_uploaded_file($_FILES["file"]["tmp_name"],
          "upload/" . $_FILES["file"]["name"]);
          echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
          }
        }
      }
    else
      {
      echo "Invalid file";
      }
    ?>
    
    <?php
    
    session_start();
    
    echo "<p>";
    if (isset($_SESSION['count'])) {
        echo $_SESSION['count']++;
    } else {
        $_SESSION['count'] = 0;
        echo $_SESSION['count']++;
    }
    echo "</p>";
    
    echo "<p>" . session_id() . "</p>";
    
    0
    
    fiakdijmmk38i40f39fm8u5mi4
    
    1
    
    fiakdijmmk38i40f39fm8u5mi4
    
    <?php
    
    function createDatabase() {
        $db = new PDO('sqlite::memory:');
        $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $db;
    }
    
    function createTables($db) {
    
    // Listing table containing all listings.
        $db->exec(
    <<<EOT
    CREATE TABLE IF NOT EXISTS listing(
    id INTEGER PRIMARY KEY, 
    description TEXT NOT NULL UNIQUE)
    EOT
        );
    
    // Image table containg all images.
        $db->exec(
    <<<EOT
    CREATE TABLE IF NOT EXISTS image(
    id INTEGER PRIMARY KEY, 
    listing_id INTEGER,
    URL TEXT NOT NULL UNIQUE,
    description TEXT NOT NULL UNIQUE,
    FOREIGN KEY (listing_id) REFERENCES listing(id))
    EOT
        );
    }
    
    class Listing {
        private $db;
        private $id;
        public $description;
    
        /*private function __construct() {
    
        }*/
    
        private function __construct(PDO $db, $id, $description) {
            $this->db = $db;
            $this->id = $id;
            $this->description = $description;
        }
    
        public static function create(PDO $db, $description) {
            $stmt = $db->prepare(<<<EOT
    INSERT OR IGNORE INTO listing(description)
    VALUES (:description)
    EOT
            );
            $stmt->execute(array(
                ":description" => $description
            ));
    
            if ($stmt->rowCount() !== 1) {
                return NULL;
            }
    
            return new Listing($db, $db->lastInsertId(), $description);
        }
    
        public static function get(PDO $db, $id) {
            $stmt       = $db->prepare("SELECT description FROM listing WHERE id = :id");
            $stmt->execute(array(
                ":id" => $id
            ));
            $row = $stmt->fetch();
    
            if ($row == null) {
                return null;
            }
            return new Listing($db, $id, $row['description']);
        }
    
        public function getImages() {
            return Image::getImages($this->db, $this);
        }
    
        public function save() {
                $stmt = $this->db->prepare(
    <<<EOT
    UPDATE listing SET description = :description WHERE id = :id
    EOT
                );
                $stmt->execute(array(
                    ":description"  => $this->description,
                    ":id"           => $this->id
                ));
        }
    
        public function id() {
            return $this->id;
        }
    }
    
    class Image {
        private $pdo;
        public $URL;
        private $id;
        public $description;
    
        private function __construct(PDO $pdo, $URL, $description, Listing $listing, $id) {
            $this->pdo          = $pdo;
            $this->URL          = $URL;
            $this->description  = $description;
            $this->id           = $id;
        }
    
        public static function create(PDO $pdo, $URL, $description, Listing $listing) {
            $stmt = $pdo->prepare(
    <<<EOT
    INSERT OR IGNORE INTO image(URL, listing_id, description)
    VALUES (:URL, :listing_id, :description)
    EOT
            );
    
            $stmt->execute(array(
                ":URL"          => $URL,
                ":listing_id"   => $listing->id(),
                ":description"  => $description
            ));
    
            if ($stmt->rowCount() !== 1) {
                return NULL;
            }
    
            return new Image($pdo, $URL, $description, $listing, $pdo->lastInsertId());
        }
    
        public function id() {
            return $this->id;
        }
    
        public static function getImages(PDO $pdo, Listing $listing) {
            $result = array();
    
            $stmt = $pdo->prepare(
    <<<EOT
    SELECT * FROM image where listing_id = :listing_id
    EOT
            );
    
            $stmt->execute(array(
                ":listing_id"   => $listing->id(),
            ));
    
            while($row = $stmt->fetch()) {
                //$result[] = array($row['URL'], $row['description']);
                $result[] = new Image($pdo, $row['URL'], $row['description'], $listing, $row['id']);
            }  
    
            return $result;
        }
    }
    
    class Test extends PHPUnit_Framework_TestCase {
        protected $db;
    
        protected function setUp() {
            $this->db = createDatabase();
            createTables($this->db);
        }
    
        public function testCreatingSingleListing() {
            $listing1 = Listing::create($this->db, "Listing 1");   
            $this->assertEquals(1, $listing1->id());
        }
    
    
        public function testCreatingMultipleListings() {
            $listing1 = Listing::create($this->db, "Listing 1");
            $listing1 = Listing::create($this->db, "Listing 2");   
            $this->assertEquals(2, $listing1->id());
        }
    
        public function testReturningListingReturnsNullWhenNonexistence() {
            $this->assertNull(Listing::get($this->db, 1));
        }
    
        public function testReturningCreatedListing() {
            $Listing1 = Listing::create($this->db, "Listing 1");   
            $this->assertEquals("Listing 1", Listing::get($this->db, 1)->description);
        }
    
        public function testSavingListing() {
            $listing1 = Listing::create($this->db, "Listing 1");
            $listing1->description = "new";
            $listing1->save();
            $this->assertEquals("new", Listing::get($this->db, 1)->description);
        }
    
        public function testListingHasNoImagesWhenJustCreated() {
            $listing1 = Listing::create($this->db, "Listing 1");
            $this->assertEquals(array(), $listing1->getImages());
        }
    
        public function testAddingImageToListing() {
            $listing1 = Listing::create($this->db, "Listing 1");
            $image1 = Image::create($this->db, "http://localhost:12343/dfdfx/45.png", "first image", $listing1); 
            $this->assertEquals(array($image1), $listing1->getImages());
        }
    
        public function testAddingImagesToListing() {
            $listing1 = Listing::create($this->db, "Listing 1");
            $image1 = Image::create($this->db, "http://localhost:12343/dfdfx/45.png", "first image", $listing1);
            $image2 = Image::create($this->db, "http://localhost:12343/df/46.png", "second image", $listing1);
            $this->assertEquals(array($image1, $image2), $listing1->getImages());
        }
    
    }
    
    CREATE TABLE images (
        id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        `path` VARCHAR(256) NOT NULL,
        `description` TEXT,
        `member` INT UNSIGNED NOT NULL,
        FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
    ) Engine=InnoDB;
    
    -- Note: this is a many-to-many relationship
    CREATE TABLE ad_images (
        `ad` INT UNSIGNED NOT NULL,
        `image` INT UNSIGNED NOT NULL,
        FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
        FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
        UNIQUE KEY (`ad`, `image`)
    ) Engine=InnoDB;
    
    function isImage($type) {
        static $imageTypes = array(
                'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
            );
        return isset($imageTypes[$type]);
        /* OR */
        return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
        /* OR allow all images */
        return preg_match('%^image/%', $type);
    }
    
    if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {
    
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    
    if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {