開發經驗小記: tp5 exp查詢,sql分析,jq,小程序,git、右鍵菜單等

持續更新:【經驗不定時更新】,一起學習。[所有內容都是經過測試才放上來的]

//判斷上傳文件的mine類型

//上傳文件信息
$img = $_FILES['img'];
if ($img)
{
    //文件存放目錄,和本php文件同級
    $dir = dirname(__file__);
    $filename = $img['name'];
    $tempname = $img['tmp_name'];
    $savepath = "$dir\\$filename";//這裏改成你需要的存放目錄
    $state = move_uploaded_file($tempname, $savepath);
    //如果上傳成功,預覽
    if($state)
    {
        echo "<img src='$filename' alt='$filename' /> ";
    }
    //此處獲取文件類型 start  php>5.3
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $savepath);
    //此處獲取文件類型 end
    
    echo $mime;
}

//驗證銀行卡號是否正確和判斷是哪個銀行
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=2227003766470038387&cardBinCheck=true

//MySQL命令行導出數據:

導出web_auto_code數據庫 web_test表 >(到) test.txt文件,文件可以指定路徑 eg: D:\sql\data\test.txt //經測試可以用

mysqldump -u root -p web_auto_code web_test > test.txt

//Ubuntu的Linux下定時任務

用crontab -e命令打開任務編輯,如下:

*/5 * * * * curl 'http://sss.yasndudi.com/OA/OaNotice/index'   //每5分鐘定時發起一個請求

*/1 * * * * cd /www/web/www.ss.com;git pull // 每分鐘更新一次代碼

*/1 * * * * chown -R www-data:www-data /www/web/ //每分鐘刪除一次

*/1 * * * * /www/web/abc.playone.cn/task/order_warn_stask.php//每分鐘執行PHP文件

然後保存重啓。
提示:
啓動:sudo /etc/init.d/cron start 關閉:sudo /etc/init.d/cron stop
重啓:sudo /etc/init.d/cron restart 重新載入配置:sudo /etc/init.d/cron reload
可以用ps aux | grep cron命令查看cron是否已啓動

//like查詢慢的問題解決

//當數據量過大的時候,like效率會很低,因爲它是全表掃描,用不到索引

//解決方法如下

//利用函數:instr('字段名', 'abcdefg')>0 或者 locate('abcdefg', '字段名')>0

//例子: select * from web_test where instr(title, 'abcd')>0

//例子: select * from web_test where locate('abcd', title)>0

 

//使msyql null行排在前面或後面

order by if(isnull(num),1,0), money desc; //這裏的1在0前面,則表示null行始終排在前面,如果交換位置則排在後面

測試服務器:apache 設置項目別名


# setting for adminer
Alias /adminer "D:/projecs/xampp/adminer/"
<Directory "D:/projecs/xampp/adminer">
  AllowOverride AuthConfig
  Require all granted
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1

  <Files "index.php">
    SetHandler application/x-httpd-php
  </Files>

</Directory>

 

//什麼時候建立索引?

答:維護索引是需要成本的,權衡查詢與修改時使用索引的得失。

1、數據量少不必建;

2、一般在where,group by,join,order by後列上加;

3、在重複度低的字段上加;

//什麼時候建立聯合索引?

//答:A列有重複數據,B列也有重複數據,如果AB列加起來一起查詢,重複度大大降低的時候可以用,否則單列索引即可。

//HttpOnly Cookie。

這是預防XSS攻擊竊取用戶cookie最有效的防禦手段。Web應用程序在設置cookie時,將其屬性設爲HttpOnly,就可以避免該網頁的cookie被客戶端惡意JavaScript竊取,保護用戶cookie信息。

//apache 開啓文件壓縮並排除指定文件

//*注: 暫未測試,有需要的自行測試。此方案僅作備忘
//步驟1 
//打開 apache 的 "httpd.conf" 文件
//步驟2  
LoadModule deflate_module modules/mod_deflate.so//去掉前面的#號
//步驟3
<IfModule mod_deflate.c>
# 告訴 apache 對傳輸到瀏覽器的內容進行壓縮
SetOutputFilter DEFLATE
# 壓縮等級 9
DeflateCompressionLevel 9
#設置不對後綴gif,jpg,jpeg,png的圖片文件進行壓縮
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>

//步驟4(與步驟3 二選一)
<IfModule mod_deflate.c>
# 壓縮等級 9
DeflateCompressionLevel 9
# 壓縮類型 html、xml、php、css、js
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
AddOutputFilter DEFLATE js css
</IfModule>

 

//js阻止事件執行

//1 阻止冒泡
event.stopPropagation(); 

//2 阻止默認事件
event.preventDefault(); 

//3 return false

//jq一個好用的方法:siblings(備忘)

//(siblings)老喜歡忘記,把你記下來總不會忘記了吧
$(obj).attr('checked', true).siblings().attr('checked', false);
//要點:元素必須是同級(兄弟節點)

//架構小學習

//設計架構時,在全面性上要充分考慮。
//在技術選型上對技術細節是要有很強的掌控力.
//對於一個架構師來說,知識面的廣是非常重要的,或者是在設計時對未來有一定的考慮也是非常重要的。(前瞻
性不是說一定要一開始就把未來可能會出現的問題就解掉,而是應該留下不需要整個改造就可以解掉的方法,這點
對於架構師來說也是非常重要的)
//設計時的全面性要非常的好,我現在一般更多采用的方式是推演上線後的狀況,一般來說在腦海裏過一遍會比較
容易考慮到這些問題。
//技術細節的掌控非常重要,同時決策力也是非常重要的。
//減少犯錯誤的方法:多閱讀、多實踐、多總結。
//Trace的重要性,如果在最初就考慮到,那麼在一開始就可以留好口子埋好伏筆,後面再要做完整就不會太複雜。
//要注意的是,其實不代表架構師自己要完全什麼都很懂,但架構師應該清楚在某個點上靠譜的人是誰。

 

//git清空賬號密碼

//1、【手動】控制面板\用戶帳戶和家庭安全\憑據管理: windows憑據;刪除對應的憑據即可

//2、【代碼】在PHPStorm控制檯(或git管理器中)輸入: 
git config --system --unset credential.helper 回車。
[小情景]:有一次git修改密碼之後 PHPStorm就出現access denied(權限拒絕),改了很久就是未生效,結果使用以下代碼重置一下,下次重新登錄即可:
在PHPStorm控制檯輸入; git config --system --unset credential.helper 回車。
然後再次更新代碼輸入賬號密碼,其實也就是重新登錄一遍。(親手測試可用)

//Yii2 獲取web.php配置信息

\Yii:$app->id // echo basic
\Yii:$app->bootstrap //['log, 'debug', 'gii']
//其它同理......

//獲取數據庫名稱

1、$sql = 'select database() as db;'
2、解析dsn

//查詢某張表的所有字段名

//查詢某張表的所有字段名 web_member:表; web_auto_code:數據庫;
select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns 
where table_name='web_member' and table_schema='web_auto_code';

//php自定義重定向

function redirect($url){
    if (!headers_sent()) {
        header("Location: ".$url);
    }
}

 

//高併發處理思路(這種是解決超發、進程安全)

1 設計字段默認值爲0且不爲負數

2 更新sql這麼寫:update test set num=num - 1

3 一旦報錯就通知客戶端操作失敗,這時候用戶就可以看到結果

//CSS 文本溢出顯示 小數點“...”

//一共三句
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;

//指定瀏覽器顯示icon

//HTML代碼
<link href="{:sysconf('browser_icon')}" rel="shortcut icon">//browser_icon:你的icon存放路徑

//tp5經驗小記: exp查詢

$m->where(['username'=>['exp'," = '$username' or mobile = '{$username}'"]])->find();

 //前輩經驗,直接在數據庫加減值,防止大流量出現髒數據

//經驗1
$user->save(['gems'=>['exp',' gems-'.$gems]]);
//經驗2 - 可替代經驗1
(new Carlist)->setInc('num',$num);
//經驗3  (TP5.1)
$sql = Db::name('web_remittanceorder')->where(['id'=>1])->fetchSql()->update(['amount'=>['exp',' amount+'.$num]]);

//MySQL判斷某個字段的長度:

select home_page from aaa表 where char_length(trim(home_page))<10 and char_length(trim(home_page))>1;

 //explain 分析sql語句

 explain select * from table where fieldname = 'name' order by id limit 20;

//js cookie操作, 參考另一篇文章【研究js的cookie操作

var cook = document.cookie // 它就是核心,以它爲基礎制定你的業務邏輯。

//mysql中查看安裝路徑

//Windows
show variables like "%char%";

//Linux
ps -ef|grep mysql

//事務回滾

必須有innoDB引擎的表支持【以前遇到過怎麼也無法回滾的問題,卻忘了是表引擎不支持,現在又忘,特此記錄】

        //走支付成功流程
        Db::startTrans();
        try{
            (new Pay())->paySuccess($u, $order, $trade_no);
            Db::commit();
            $this->success('強制補單結束');
        }catch(\Exception $e){
            Db::rollback();//需innoDB引擎才生效
            $this->success('強制補單失敗,'.$e->getMessage());
        }

//微信簽名

    /**
     * description:微信查詢訂單簽名[這個除了基礎api貌似可以通用]
     * author:wanghua
     */
    function getWxSign($param){
        ksort($param);
        $str = '';
        foreach ($param as $key=>$val){
            if(empty($val))continue;
            //驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗
            if($key == 'sign')continue;
            $str.= '&'.$key.'='.$val;
        }
        $stringSignTemp = substr($str,1).'&key='.config('api_key');
        $sign = strtoupper(md5($stringSignTemp));
        return $sign;
    }

     /**
     * description:微信常規簽名算法[這個貌似只有基礎api能用,例如:分享之前獲取options需要的簽名就是它]
     * author:wanghua
     */
    function getSignature($param){
        if(!$param || !is_array($param))return false;
        if(false !== strpos($param['url'], '#')){
            $exp = explode('#', $param['url']);
            if($param['url'])$param['url'] = $exp[0];
        }
        ksort($param);
        $string1 = '';
        foreach ($param as $k=>$v){
            $string1.= $k.'='.$v.'&';
        }
        $string1 = substr($string1, 0, strlen($string1)-1);
        $signature = sha1($string1);
        return $signature;
    }

//jQuery分別獲取json對象的key和val,使用場景較少,記錄一下

//值示例:
{
"id":33,"title":"\u4f1a\u5458\u7ba1\u7406","controller":"Member",
"dbname":"member","is_deleted":0
}
$.each(d, function (k) {

    console.log(k+':'+d[k]);
});

 // 磁盤空間檢測

    function check_disk_free_space(){
        if(function_exists('disk_free_space')) {
            return floor(disk_free_space(INSTALL_APP_PATH) / (1024*1024));
        }else{
            return false;
        }
    }
    

//js(小程序)二維數組(對象)排序(經測試:小程序裏面也可以用),這裏是降序

  //js二維數組(對象)排序(經測試:小程序裏面也可以用),這裏是降序
  arrArrToSort: function(data,t){
    var d = [];
    //降序
    if(t){
      for (var i=data.length-1; i>=0; i--){
        d.push(data[i]);
      }
    }
    return d;
  }

// str_pad PHP填充字符串長度,左、右、兩側

$str = "Hello World";
echo str_pad($str,30,".");

//vi的撤銷命令 反撤銷

'u' : 撤銷上一個編輯操作

'ctrl + r' : 恢復,即回退前一個命令

'U' : 行撤銷,撤銷所有在前一個編輯行上的操作

 

//TCP與UDP

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,
必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢
驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把
應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據
報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。
用TCP還是UDP,那要看你的程序注重哪一個方面?可靠還是快速?

//測試input="datetime-local"

        //input type = datetime-local 
        $str = '2018-10-24T00:00';//輸入
        var_dump($str);
        $time = strtotime($str);//轉爲時間戳 輸出:1540310400
        var_dump($time);
        var_dump(date('Y-m-d H:i:s', $time));//轉爲時間格式 輸出:2016-05-01 12:12:012:01

//PHP htmlspecialchars()  & htmlspecialchars_decode函數 

//htmlspecialchars:把預定義的 HTML 實體 '&lt;'(小於)和 '&gt;'(大於)轉換爲字符

//htmlspecialchars_decode:反之

//JS解除瀏覽器禁止左右鍵選擇和彈出菜單

//允許和禁止左鍵選中,方法有二(實用)

//一: css 方法
//核心屬性
user-seletct: none;
-webkit-user-seletct: none;
-moz-user-seletct: none;
-ms-user-seletct: none;

//none: 不能選中內容

//text: 能選中內容

//user-seletct之all屬性: 能選中內容(當所有內容作爲一個整體時可以被選擇。
//如果雙擊或者在上下文上點擊子元素,那麼被選擇的部分將是以該子元素向上回溯的最高祖先元素)

//測試示例-允許選中:$('body').append('<style>*{user-seletct: all;-webkit-user-seletct: text;}</style>');

//二:js 方法

document.body.onselectstart = function(){return false;}//true允許左鍵選中
document.onselectstart = new Function("event.returnValue=true;");//true允許左鍵選中

//返回 false,不能選中

//返回 true,能選中

//允許和禁止彈出右鍵菜單
document.oncontextmenu = function(){return true};//false 禁止; true 允許

//經測試發現,有可能在某一行,或者某個元素上做了樣式控制,也不能被選中,
//即使上面的方法都試過,解決方法就是,把這個元素上的class刪除或者css刪除再嘗試,
//這個需要一定的功底和耐心。^ ^`

//MySQL字符串替換

update `news` set `content`=replace(`content`,' ','');//把content字段中空格替換掉

 

 

//未完待續 TODO.....

 

 

 

 

 

~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章