程式設計師找工作必備 PHP 基礎面試題 - 第十天

viphper發表於2020-03-22

“PHP學習網” 公眾號會每天分享一些面試題,正在找工作的小夥伴們可以來看看哦。

1、最佳化MYSQL資料庫的方法

(1) 選取最適用的欄位屬性,儘可能減少定義欄位長度,儘量把欄位設定NOT NULL,例如’省份,性別’,最好設定為ENUM
(2) 使用連線(JOIN)來代替子查詢:
(3) 使用聯合(UNION)來代替手動建立的臨時表
(4) 事務處理:
(5) 鎖定表,最佳化事務處理:
(6) 使用外來鍵,最佳化鎖定表
(7) 建立索引
(8) 最佳化sql語句

或者
(1).資料庫設計方面,這是DBA和Architect的責任,設計結構良好的資料庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分資料冗餘,避免JOIN操作,以提高查詢效率

(2).系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料,慢表是歷史存檔.叢集,主伺服器Read & write,從伺服器read only,或者N臺伺服器,各機器互為Master

(3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引

(4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連線啊,大量的Group By和order by,沒有limit等等.必要的時候,把資料庫邏輯封裝到DBMS端的儲存過程裡面.快取查詢結果,explain每一個sql語句

(5).所得皆必須,只從資料庫取必需的資料,比如查詢某篇文章的評論數,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果使用者只修改了標題,那就update … set title = ? where article_id = ?不要set content = ?(大文字)

(6).必要的時候用不同的儲存引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度

2、用PHP列印出前一天的時間格式是2020-3-18 22:21:21

$time=date(Y-m-d H:i:s’,strtotime(-1,days’))
echo $time;

3、寫一段JS程式碼來實現圖片的幻燈片形式展示。

<script>
    $(function(){
        //頁碼
        var page=1;
        //每頁顯示數
        var total=4;
        //點下一頁的時候執行
        $('span.next').click(function(){
            //透過它找到div.v_show
            var $v_show=$(this).parents('div.v_show');
            //透過div.v_show再找到v_content
            var $v_content=$v_show.children('.v_content');
            //v_content找到下面的所有的li
            var $list=$v_content.children('.v_content_list');
            //總條數 li.length得到總條數
            var $li=$list.find('li');
            var $count=Math.ceil($li.length/total);
            var $width=$v_content.width();
            if(page==$count){
                $list.animate({left:'0px'},500);
                page=1;
            }else{
                $list.animate({left:'-='+$width+'px'},500);
                page++;
            }
            $('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
        })

        $('span.prev').click(function(){
            //透過它找到div.v_show
            var $v_show=$(this).parents('div.v_show');
            //透過div.v_show再找到v_content
            var $v_content=$v_show.children('.v_content');
            //v_content找到下面的所有的li
            var $list=$v_content.children('.v_content_list');
            //總條數 li.length得到總條數
            var $li=$list.find('li');

            var $count=Math.ceil($li.length/total);

            var $width=$v_content.width();

            if(page==1){
                $list.animate({left:'-='+(($count-1)*$width)+'px'},500);
                page=4;
            }else{
                $list.animate({left:'+='+$width+'px'},500);
                page--;
            }

            $('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
        })
    })

</script>

4、如何讓你來實現一個SNS網站的短訊息功能,簡述一下,你該如何實現.

首先建立資料表,其中欄位uid與使用者表ID相關聯,欄位sid與被髮送資訊的使用者相關聯,當傳送資訊時,將內容儲存到資料庫中,間隔一定時間查詢資料庫是否有與使用者相關連的資訊儲存,若有與使用者相關聯的資訊就遍歷輸出出來。

5、寫一個函式,算出兩個檔案的相對路徑

如:
$a=’/a/b/c/d/e.php’
$b=’/a/b/12/34/c.php’
計算出$b相對於$a的相對路徑應該是../../c/d

$na=explode('/',$a);
$nb=explode('/',$b);
$numa=count($na);
$numb=count($nb);
$max=$numa>$numb?$numa:$numb;
for($i=0;$i<$max-1;$i++){
    if($na[$i]!=$nb[$i]){
        $up.='../';
        $path.=$na[$i]."/";
    }}
echo $relpath=$up.$path;

6、請用PHP設計一個函式,對學生英語考試得分從高到低排序,輸入是所有學生的學號和考試得分,返回排好序的考試得分和對應學生的學好。考試滿分為100,由於判卷要求,得分不會有小數

要求:
1不要使用qsort等系統內建排序函式。
2請使用你認為最快最優的方式實現該函式並使排序的複雜度最低

<?php
    function quickSort($arr)
    {
        $len    = count($arr);
        if($len <= 1) {
            return $arr;
        }
        $key = $arr[0];
        $left_arr    = array();
        $right_arr    = array();

        for($i=1; $i<$len; $i++){
        if($arr[$i] <= $key){
           $left_arr[] = $arr[$i];
        } else {
           $right_arr[] = $arr[$i];
        }
        }
        $left_arr = quickSort($left_arr);
        $right_arr = quickSort($right_arr);
        return array_merge($left_arr,array($key),$right_arr);
    }

7、現在有一個Mysql資料庫表payment記錄使用者購買訂單,表結構如下:

TABLE payment(
    id int unsigned AUTO_INCREMENT,
    user_id int unsigned comment ‘使用者id’,
    quantity smallint unsigned comment ‘本次購買產品數量’,
    pay_time timestamp comment ‘購買時間’,
    PRIMARY KEY(id)
)

使用者每訪問成功付款一筆訂單(從進入到離開),會增加一條記錄,記錄使用者的ID(user_id),以及購買的產品數量。比如:1、208,2 //208這個使用者購買2個產品

Insert into payment (user_id,quantity)values(***,***)

1)請寫出一個SQL語句挑出使用者(id=100)最近購買的10條訂單。

Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc;

2)請寫一個SQL語句挑出使用者(id=100)最近】購買的第10到第20條訂單(共10個)

Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc limit 10,10;

3)請寫出一個SQL語句挑出購買產品數最多的10個使用者(user_id)和對應購買的產品總數。

Select use_id,sum(quantity) total,pay_time form payment group by use_id order by total desc limit 10;

8、請寫一個SQL語句。輸出購買產品數分別等於1,2,3,4,5,6,7,8,9,10的使用者數量,如果某個數量對應的使用者數為0,可以不輸出。

Select count(id) from payment where quantity in (1,2,3,4,5.6,7,8,9,10) group by quantity

最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題

本作品採用《CC 協議》,轉載必須註明作者和本文連結
和PHP學習網一起努力學習

相關文章