P.S:我感觉你是个初学者,我想我在PHP Newbies: How to write good code 列出了一个不错的列表
2) 将图像保存到指定的文件夹
move-uploaded-file 应该可以工作。想到的是您没有设置正确的写入权限来移动文件。您使用哪种服务器(Linux/Windows/MacOSX)?函数以 boolean(result) 形式返回什么?
另一件事:我需要将图像重命名为随机字符串
(以防止图像被覆盖)。我知道我可以用
rand() 函数,但我忘了在我的原始帖子中提到它。
rand() 不是真正随机的,可能会给出重复的文件名。 uniqid 将是唯一的
编辑:我想办法将描述保存到数据库中
$_SESSION['file_n_desc']。我只需要弄清楚如何上传
该死的东西,然后将位置保存到数据库中。
在没有覆盖会话的情况下使用会话时,您使用的不是 MySQL 数据库,而是the file-system。您可以阅读本教程以获取 store session in a database。标准此会话gets purged when closing the browser(仅用于该会话)。试试这个代码:
<?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
rlu10shi6l390il130qinlt913
1
rlu10shi6l390il130qinlt913
但是当您关闭浏览器时,session_id 已更改并且您的计数器已重置,并且您会得到类似的输出。
0
fiakdijmmk38i40f39fm8u5mi4
1
fiakdijmmk38i40f39fm8u5mi4
能够调用其分类中的图像和描述
以画廊设置的形式列出
我用PDO(Good Read) 来做(My)SQL。我使用phpunit 进行了单元测试(TDD)。为了访问数据库,我在内存模式下使用了 SQLite(非常适合进行 SQL 测试)=> new PDO('sqlite::memory:');。我尝试关注Uncle Bob's three rules(Good Read)。
通常您将其拆分为多个文件。每个类都在一个单独的文件中。每个类都应该在单独的文件中进行隔离(松散耦合)测试。
我使用foreign key 来映射“Listing to Image”。我认为这个例子经过了相当彻底的测试,但现在我真的该睡觉了,所以我不确定;)。
<?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());
}
}