【千紙詩書】—— PHP/MySQL二手書網站後臺開發之知識點記錄

前言:使用PHP和MySQL開發後臺管理系統的過程當中,發現有一些通用的【套路小Tip】,這裏集中記錄一下。結合工做中ing的後臺業務,我逐漸體會到:除了技術知識外、能使用戶體驗好的「使用流程設計」積累也十分重要╭( ・ㅂ・)و ̑̑    javascript

項目github地址:https://github.com/66Web/php_book_store,歡迎Star。  php


 1、知識點記錄html

一、數據庫的表名和列名java

  • 絕對不要和數據庫的關鍵字相同  order  order by   
  • 訂單表-indent   分類表-class(數據庫中沒有class關鍵詞)
  • 數據庫中   凡是數字  INT FLOAT   必定要UNSIGNED   有負數的不能加UNSIGNED
  • 數據庫插入時間   使用時間戳   UNIX_TIMESTAMP

二、後臺用戶模塊mysql

  • 修改頁面change.php:必需要id  隱藏域,帶過去id
    <input  type="hidden"  name="id"  value='<?php echo $row['id'] ?>' />  
  • 由於update.php中的update語句中where id= ?才能夠造成完整語句
  • 圖書模塊change.php  id  img 兩個隱藏域 方便update.php中圖片縮放處理和刪除原圖

三、_top 是指向:上一級目錄git

<p><a href="logout.php" target='_top'>|-退出系統</a></p>

四、disabled 禁用username提交,不能修改github

<p>管理員名:</p>
<p><input type="text" name='username' value='<?php echo $row['username']?>' disabled></p>

五、後臺修改、刪除  算法

  • 能經過帶參數id等實現,就不要查數據庫,不靈活,能不查就不查。 

六、Select選項‘修改’時顯示原選項sql

<p>類別:</p>
<p>
    <select name="class_id">
    <?php
        $sqlClass="select * from class";      //建立sql語句
        $rstClass=mysql_query($sqlClass);     //發送sql語句
        while($rowClass=mysql_fetch_assoc($rstClass)){      //讀取並判斷mysql服務器返回結果  
            if($rowClass['id'] == $rowBook['class_id']){    //rowClass的id 與傳過來的rowCook的class_id相同時,選中 加selected
                echo "<option value='{$rowClass['id']}' selected>{$rowClass['name']}</option>";
            }else{
                echo "<option value='{$rowClass['id']}'>{$rowClass['name']}</option>";
            }
        }
     ?>
    </select>
</p>  

七、後臺書的模塊,delete.php數據庫

$file="../../public/uploads/{$img}";  //定義圖片文件路徑
$file2="../../public/uploads/thumb_{$img}" //定義縮略圖文件路徑

//刪除圖片 刪除文件用unlink()
unlink($file);
unlink($file2);

八、傳文件函數

  • move_uploaded_file($src,$dst) 上傳成功返回true 不然false
  1. 第一個參數:$src 上傳文件的臨時文件名
  2. 第二個參數:$dst 上傳後保存的新的路徑和名稱
    $ext = array_pop(explode('.',$name));
    $dst = '../../public/uploads/'.time().mt_rand().'.'.$ext;//指定地址,並隨機生成新文件名
    
    // array_pop() 函數刪除數組中的最後一個元素 
    // explode('.',$name) 字符串分割函數得到文件擴展名.jpg等
    
    $src = $_FILES['img']['tmp_name']; //文件上傳時在臨時目錄中被保存成一個臨時文件的文件名
    $name = $_FILES['img']['name']; //上傳文件的文件名
  • 爲了讓前臺效率不降低,進行圖片縮放
  1. 等比例計算真實目標資源的寬和高 (算法難度)
    //判斷 原圖x/目標x   >  原圖y/目標y   以大的比例結果爲準
    
    1000/500    500/500
    2            1
  2. 等比例計算真實目標資源的寬和高 若是結果爲小數,縮放能小不能大,用floor
    $img = basename($dst);   //得到目錄下的文件名a.jpg

九、PHP中exit; 能夠阻止腳本,不用通篇註釋。

十、圖書模塊update.php

$imgerror=$_FILES['img']['error'];    //文件上傳錯誤信息

//圖片上傳--先上傳新圖,後刪除原圖,上傳失敗不刪原圖
if($imgerror === 0){

十一、多表查詢

  • 三表查詢    後臺評論模塊index.php
    $sql="select comment.*,user.username,book.name 
          from comment,user,book 
          where comment.user_id=user.id and comment.book_id=book.id";
    $rst=mysql_query($sql);
  • 兩表查詢    後臺書模塊index.php
    $sql="select book.*,class.name cname from book,class where book.class_id=class.id";
    $rst=mysql_query($sql);

十二、後臺評論模塊index.php

  • 雙引號不能解析函數,要拿出來date(),拼接
    echo "<td>".date('Y-m-d',$row['time'])."</td>";

1三、在頁面裏面流通的get  post中的數據都變成字符串了

  • 不存在數字類型,因此不能用=== ,要用==
    if($row['id']==1){
        //編號爲1 的刪除按鈕的a連接,禁用--<a href='javascript:'></a>,改背景色爲灰色
        echo "<td><a href='javascript:' style='background:#888'>刪除</a></td>"; 
    }else{
        echo "<td><a href='delete.php?id={$row["id"]}'>刪除</a></td>";
    }  

1四、後臺廣告模塊

  • 通常廣告的位置position 按從上往下,而後從左往右 0~8
  • 爲了避免暴露admin,後臺廣告(圖書等)圖片上傳路徑 放在先後臺公共 public的文件夾 

1五、訂單模塊

  • 訂單模塊是電商網站後臺錯誤率最高的地方,必定要檢查無誤。
  • 同一時間下的訂單,訂單號和時間一致,分組聚合,合併查看
  1. 按訂單號分組聚合group  by  indent.code
  • 兩表查詢:
    $sql="select indent.price,indent.num,book.name,book.img 
             from indent,book 
             where  indent.book_id=book.id and indent.code='{$code}'";
    $rst=mysql_query($sql);
    

    訂單編號code是varchar類型,要加單引號:失誤率極高!

    indent.code='{$code}'  
  • 報錯,排錯方法
  1. 打印出$sql語句
  2. 把打印出的sql語句在mysql中執行,報出具體錯誤
    echo $sql;
    exit;
    
  • 加載出縮略圖 thumb_{}

    echo "<td><img src='../../public/uploads/thumb_{$row['img']}' width='50px'></td>";
  • 輸出合計

    echo "<td>".$row['price']*$row['num']."</td>";

1六、後臺權限把控:後臺每個頁面都要寫(或模塊化引入)

  • 不然,毫無安全可言!
    <?php
        session_start();
    
        if(!$_SESSION['userid']){
           echo "<script>location='login.php'</script>";
           exit;     //防止程序在跳轉以前,忽然的,執行下去下面的代碼了
        }
    ?>

1七、session數組:將數據存放在服務器中

  • 開啓session
    session_start();
  • 設置session
    $_SESSION['username']='user1';
    $_SESSION['user_id']='15';
  • 刪除session
  1. 開啓session
    session_start();
  2. 清空session數組
    $_SESSION=array();
  3. 刪除客戶端的cookie文件
    setcookie('PHPSESSID','',time()-1,'/');
  4. 刪除服務器上PHPSESSID所對應的session文件
    session_destroy();

1八、退出後臺登陸

<?php
   session_start();

   $_SESSION = array();     //清空session數組
   session_destroy();       //刪除服務器上PHPSESSID所對應的session文件
   setcookie('PHPSESSID','',time()-3600,'/');       //刪除客戶端的cookie文件

   echo '<script>location="login.php"</script>';
?> 

1九、前臺廣告  動態放置

  • index.php:從廣告表中查到全部數據,放入一個二維數組中;爲了與位置一一對應,將位置設置爲數組下標
    <?php
       include '../public/common/conn.php';
    
       $sqlAdvert = "select * from advert";
       $rstAdvert = mysql_query($sqlAdvert);
       while($rowAdvert=mysql_fetch_assoc($rstAdvert){
             $rowAds[$rowAdvert['pos']]=$rowAdvert;
       }
    ?>
        <div class="ads">
              <img src="../public/upadverts/<?php echo $rowAds[0]['img']?>" alt="">
        </div>

20、網站下不要用絕對路徑,這樣文件名改動會出問題

  • header.php:explode('/',$path);  //截取字符串函數
    <?php
        $path = $_SERVER['PHP_SELF'];
        $arr = explode('/',$path);
        $root = '/'.$arr[1];   //獲取根目錄
    ?>
    
    <a href="">
        <img src="<?php echo $root?>/home/public/img/logo.png" alt="">
    </a>

2一、首頁 重複加載的類似度很高的【樓層、數據塊】都要經過  php循環加載

  1. 前臺頁面中寫sql語句通常都帶一個表名,由於一個頁面要查不少不一樣的表
  2. 在select查找時,order by rand() limit 4 隨機取4個
    <?php
       $sqlClass = "select * from class order by id limit 2";
       $rstClass = mysql_query($sqlClass);
       $f = 1;
       while($rowClass=mysql_fetch_assoc($rstClass)){
    ?>
    <!--樓層開始-->
       …… …… ……
       <?php
           $sqlBook = "select book.* from book,class where book.class_id = class.id and class.id = 
                           {$rowClass['id']} and book.shelf=1 order by book.id limit 4";
           $rstBook = mysql_query($sqlBook);
           while($rowBook = mysql_fetch_assoc($rstBook)){
       ?>
       <!--樓層數據塊開始-->
             …… …… ……
       <!--樓層數據塊結束-->
    <?php
        }
       }
    ?>
    <!--樓層結束-->  

2二、前臺頁面中 動態循環添加數據

  • 第一步:先查數據表
    $id=$_GET['class_id'];
    $sqlClass="select * from class where id = {$id} ";
    $rstClass=mysql_query($sqlClass);
  • 第二步:若是抓取一行->數組[下標]
    $rowClass=mysql_fetch_assoc($rstClass);
  1. 若是抓取多行->while循環
    while($rowClass=mysql_fetch_assoc($rstClass)){
       …… ……
    }
  2. 須要數據處:
    <?php echo $rowClass['name']?>

2三、打印  查看:查到的數據結果

<?php
    …… ……
    while($rowClass=mysql_fetch_assoc($rstClass)){
         echo '<pre>';
         print_r($rowClass);
         echo '</pre>';
    }
?>

2四、前臺不一樣頁面之間 跳轉 經過a連接傳遞參數,查表,獲得想要的結果

  • book.php 中  分類>>類別名稱  須要傳一個class_id
    <span><a href='class.php?class_id=<?php echo $class_id?>'>分類</a> » <?php echo $rowClass['name']?></span>
  • 分類頁面 圖書分頁顯示部分   第一頁/上一頁/下一頁/尾頁   傳兩個值 :pageclass_id
    if($page>=1 && $totalpage>1){
        echo "<a href=?page=1&class_id={$rowClass['id']}>第一頁  </a>";
    }

2五、header.php 中控制登陸、註冊、切換用戶名

  • 用session判斷,前面須要開session_start();  只能放在第一行,前面不容許有任何輸出
  1. 可是,header.php是被包含的頁面,其它頁面前面會有輸出
  2. 因此,heder.php裏不能加session_start();   要在加的頁面里加
    <?php
       if(!$_SESSION['home_username']){
          echo "<a href='{$root}/home/login.php'>登陸</a>";
       }else{
          echo "  <a href='{$root}/home/person/index.php'>歡迎
                  {$_SESSION['home_username']}登陸</a>  <a href='{$root}/home/logout.php'>退出</a>";
       }
    ?>
  3. 從新打開瀏覽器,會有undefined:用@解決
    @$_SESSION['home_username'];   

2六、我的中心 左右結構頁面

  • 第一種:複雜式
  1. 左側 不一樣的欄目給不一樣的參數
  2. 右側 給一個switch,根據左側給的不一樣參數,發生不一樣的變化
  3. 優勢:只需寫一個頁面
  4. 缺點:共用的php裏易寫亂,易出錯
  • 第二種:簡單式(
  1. 複製頁面,寫好一個,複製給不一樣的頁面,而後用連接跳轉。
  • 易錯:echo " ";  裏本來html裏面的雙引號,都要改成單引號

2七、經過session方法開發購物車,用戶關閉瀏覽器後,自動清空購物車

  • 點擊【加入購物車】
  1. 先要跳轉到 cart/insert.php 添加進購物車
  2. 肯定後,才跳轉到 index.php 查看購物車
  • 用戶選擇  →  加入購物車 後,若是最後沒有購買,結帳  → 用戶關閉瀏覽器後,自動清空購物車
  1. 瀏覽器關閉後,session數組馬上清空,session自動過時
  2. PHPSESSID 保存在瀏覽器 cookie中
  • 購物車核心原理:數組改造,大數組裏面放小數組   insert.php
    session_start();
    
    $id = $_GET['id'];
    $sql = "select * from book where id = {$id}";
    $rst = mysql_query($sql);
    $row = mysql_fetch_assoc($rst);
    
    $_SESSION['books'][$id]=$row;   //用id限制同一圖書只能加一個,而後在購物車頁面中進行加減數量
    
    //在圖書信息的子數組中臨時加一個num 默認1, 方便index.php中使用變量 <?php echo $book['num']?>
    $_SESSION['books'][$id]['num']=1;
  • 跳轉到 index.php 查看
    echo '<script>location="index.php"</script>';
    

    有了數組,就不用while了,用foreach遍歷數組  index.php

    <?php
        foreach($_SESSION['books'] as $book){
    ?>
        …… ……
    <?php
        }
    ?>
  • 刪除購物車圖書  delete.php
    // 在session中找到 刪除 
    unset($_SESSION['books'][$id]);
  • 清空購物車圖書
     $_SESSION['books']=array(); 
    

    不能夠unset,那樣會把 $_SESSION['books']刪掉  

  • 購物車計算總額
    $tot = 0
    

    遍歷後(foreach 或 while循環)

    $tot += $row['price']*$row['num']; 
  • 購物車圖書數量加減:add.php 、cut.php
    $_SESSION['books'][$id]['num']++;
    $_SESSION['books'][$id]['num']--;
    

    限制數量 加→不能多於庫存  減→不能少於1個

    if($_SESSION['books'][$id]['num']<1){
       $_SESSION['books'][$id]['num'] = 1;
    }
    if($_SESSION['books'][$id]['num'] > $_SESSION['books'][$id]['stock']){
       $_SESSION['books'][$id]['num'] = $_SESSION['books'][$id]['stock'];
    }

2八、購物車的  聯繫方式、提交訂單

  • 我的中心的全部頁面,都要 提示 先登陸,才能夠看到
    <!--判斷用戶是否登陸 session-->
    <?php
        if($_SESSION['home_username']){
    ?> 
        ……
    <?php
       }
    ?>
  • 用戶在【不關閉瀏覽器】狀況下
  1. 退出登陸 → 保留session中購物車的數組內容
  2. 實現換個帳號結算購物車交換數組內容(購物車內容不變)
    $arr=$_SESSION['books'];
    
    $_SESSION = array(); //清空session數組
    
    $_SESSION['books']=$arr;

2九、登陸後不只要在session中放入username ,通常還要放入userid

  • 使用userid進行判斷,獲取數據
  • 方便後面在 【用戶我的信息】(等其它只有用戶本身可看到的頁面)中 獲取 userid
    $_SESSION['home_userid'] = $row['id'];
    
    $user_id = $_SESSION['home_userid'];
    $sql = "select * from touch where user_id = {$user_id}";
    $rst = mysql_query($sql);

30、在各個 後臺數據管理模塊中 修改都要有一個隱藏域 傳id

3一、購物車生成訂單

  • 須要form表單傳一個touch的id,其他的圖書信息都在購物車的session數組中存放,可直接取
  • 核心要點:借用session技術跨頁面 ↑ 
  • 注意:必定要把 form表單 放在table的外面,由於一些瀏覽器會不支持table裏面放form,只支持form裏面放table
  • 生成 訂單號 爲確保惟一性:隨機數 加 時間戳
    $code =time().mt_rand();
    $code =microtime(true).time().mt_rand();   //microtime(true)微秒
    $code =time().mt_rand().mt_rand(1,10);
    $code =time().mt_rand().range('a','z'); 

3二、購物車 提交訂單以後,要作兩件事

  • 第一:庫存減去 數量
  • 第二:購物車清空
  • book.php:加入購物車以前 要判斷一下 庫存stock至少等於1

3三、提交訂單的用戶,只有在 ‘已確認’狀態下,才能夠評論

3四、在CSS樣式表裏,用class類

  • 最好不用id 標籤
  • 由於 class 類 優勢:惟一的能用,不惟一的也能用

 

2、運行效果圖

一、註冊功能

註冊界面
 
 錯誤提示
經過提示

 

二、二手書搜索功能

 高級搜索成功界面
 
 搜索失敗提示

 

三、二手書發佈功能

 用戶發佈二手書界面
 
 用戶發佈二手書成功

 

四、二手書購買與評論功能

 加入購物車界面
 
 購物車界面
 提交訂單成功
 
 未確認時查看訂單界面
 
 未確認時查看訂單詳情界面
 
 確認時查看訂單詳情界面
 確認後撰寫評論
 
 評論成功

 


注:轉載請註明出處 

相關文章
相關標籤/搜索