持續更新:【經驗不定時更新】,一起學習。[所有內容都是經過測試才放上來的]
//判斷上傳文件的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 實體 '<'(小於)和 '>'(大於)轉換爲字符
//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.....
~