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