1. 程式人生 > >【PHP常見面試題 程式功能設計】先寫一個線上留言本,實現使用者的線上留言功能,留言資訊儲存到資料庫,要求書籍資料表內容以及使用PHP編碼完成。

【PHP常見面試題 程式功能設計】先寫一個線上留言本,實現使用者的線上留言功能,留言資訊儲存到資料庫,要求書籍資料表內容以及使用PHP編碼完成。

一、考點

1、資料表設計

分析資料表結構

留言板有哪些資訊需要儲存?
  • 留言資訊:ID,留言標題,留言內容,留言時間,留言人

2、資料表建立語句

// 留言本表 message
create table message(
    id int unsigned not null auto_increment primary key,
    title varchar(120) not null default '',
    content varchar(255) not null default '',
    created_at int unsigned not null default '0',
    user_name varchar(32) not null default '',
    key message_user_name(user_name)
)engine=innodb default charset=utf8;

在這裡插入圖片描述

3、選擇PHP連線資料庫的方式

1)PDO【推薦使用】

  • 可擴充套件性更好、支援預處理、面向物件
  • 推薦使用PDO,因為擴充套件性非常好,將來換其他庫也是沒有問題的,而且它裡面的方法都是比較完善的。

2)MySQLi

  • 只支援MySQL操作(不支援其他庫)、支援預處理、面向物件和過程,效率較高(效率比PDO稍微高點)

3)MySQL庫

  • 只支援MySQL資料庫、沒有預處理的支援、面向過程

4、編碼能力

1)PDO的基本操作

try {
    // 操作資料庫程式碼
    // ...
} catch(PDOException $e) {
    echo $e->getMessage
(); }

2)操作資料庫程式碼

// 操作資料庫程式碼
$pdo = new PDO($dsn, $username, $password, $attr);
$sql = 'SELECT `id`, `title`, `content` FROM `message` WHERE `user_name` = :user_name';
$stmt = $pdo->prepare($sql);
$stmt->execute([':user_name'=>$user_name]);
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);

3)程式碼實現

① 準備一個表單 form.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>留言本</title>
</head>
<body>
    <form action="./store.php" method="post">
        標題:<input type="text" name="title"><br>
        內容:<textarea name="content" cols="30" rows="10"></textarea><br>
        留言人:<input type="text" name="user_name"><br>
        <input type="submit" value="新增">
    </form>
</body>
</html>

效果如下:

在這裡插入圖片描述

② 接收資料 store.php
// 接收表單提交過來的資料
$title = $_POST['title'];
$content = $_POST['content'];
$user_name = $_POST['user_name'];

if (empty($title) || empty($content) || empty($user_name)) {
    exit('標題或者內容或者使用者名稱不能為空');
}

// PDO操作資料庫
try {
    $dsn = 'mysql:dbname=test; host=localhost';
    $username = 'root';
    $password = '123456';
    $attr = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ];

    $pdo = new PDO($dsn, $username, $password, $attr);
    $sql = 'insert into message(title, content, created_at, user_name) values(:title, :content, :created_at, :user_name)';
    $stmt = $pdo->prepare($sql);
    $data = [
        ':title' => $title,
        ':content' => $content,
        ':created_at' => time(),
        ':user_name' => $user_name
    ];
    $stmt->execute($data);
    $rows = $stmt->rowCount();

    if ($rows) {
        exit('新增成功');
    } else {
        exit('新增失敗');
    }
} catch(PDOException $e) {
    // 異常
    echo $e->getMessage();
}

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

二、解題方法

根據考題所出功能,先分析應該儲存哪些資訊,設計好資料表,這一步很關鍵,如果編碼時才發現設計有問題,會浪費大量的時間,基本沒有時間改,所以要先設計好,然後根據設計好的資料表建立資料表,通常建議大家使用PDO來連線MySQL,最終完成編碼,所以一定要熟悉PDO的基本操作。

三、真題

設計一個無限分類表

1)方法一:存 id,title,在表中加一個 pid,再配合遞迴實現。【推薦使用】
id title pid
1 服裝 0
2 上衣 1
3 長袖 2
2)方法二:存 id,title,加 pidpath (path是為了顯示順序,如果不加 path的話,需要用遞迴才能把級別顯示出來)
id title pid path(pid + id
1 服裝 0 0- 1
2 上衣 1 0-1- 2
3 長袖 2 0-1-2- 3

在這裡插入圖片描述

綜上所述,此題推薦使用 pid + 遞迴的方法實現,pid 關聯的是 主鍵ID