1. 程式人生 > >PHP 學習筆記[2] —— 自學PHP 筆記整理

PHP 學習筆記[2] —— 自學PHP 筆記整理

    背景:自學PHP遇到的一些小問題總是很是困擾,不同時間段做一下筆記,方便以後的參考及能力的視覺化...

    1.對於資料庫操作的程式碼,可以提取出一個簡單的php檔案

//設定連線 oracle 資料庫的引數

    $host = "192.168.11.101";
    $port = "1521";
    $sid  = "orcl";
    $sname = "orcl";
    $server_name = "orcl";
    $db_username = "system";
    $db_password = "orcl";

$dbstr =
    "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =$host)(PORT = $port))
    (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = $server_name)(INSTANCE_NAME = $server_name)))";
$dbconn=oci_connect($db_username,$db_password,$dbstr);//如果去掉最後一個引數或者為“ ”,預設連線本機

    2.注意編碼問題

      有時php包含php檔案時,發現可能會有編碼的問題

    3.json編碼,發現對中文的操作不予執行,找到一個解決方法:

    

    4.使用QQ互聯進行測試時發現出現的提示資訊:

        ----------------2016/2/29 (記錄)

     The state does not match. You may be a victim of CSRF.

      分析得出,個人在QQ互聯中的網站地址寫的與預設連線不一致,保證了回撥地址的正確以後,進行測試發現正常。

  

    5.php的json_encode不相容JSON_UNESCAPED_UNICODE的解決方案

    PHP5.4才支援JSON_UNESCAPED_UNICODE這個引數,此引數是讓中文字元在json_encode的時候不用轉義,減少資料傳輸量。但在PHP5.3中,就得自己寫個函式來實現,以下就是解決方法:

/**
* 對變數進行 JSON 編碼
* @param mixed value 待編碼的 value ,除了resource 型別之外,可以為任何資料型別,該函式只能接受 UTF-8 編碼的資料
* @return string 返回 value 值的 JSON 形式
*/
function json_encode_ex($value)
{
    if (version_compare(PHP_VERSION,'5.4.0','<'))
    {
        $str = json_encode($value);
        $str = preg_replace_callback(
                                    "#\\\u([0-9a-f]{4})#i",
                                    function($matchs)
                                    {
                                         return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
                                    },
                                     $str
                                    );
        return $str;
    }
    else
    {
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}

    6.虛擬機器vmware 中不能上網的一種情況

    這兩天,在學些LAMP的一點知識,主要記錄一些問題在此,希望給遇到相同困擾的人一點參考。---2016.5.25

windows環境下的PHP學習,算是有一點基礎了,但畢竟是自學,所以自己的學些規劃不夠清晰,意識到必須學習Linux系統下的相關知識才行。前幾天安裝了VMware,並且安裝了Ubuntu,CentOS6.5,Deepin三種系統,具體的安裝也是參考網路上的圖解,其中值得注意的幾點是:

·win10環境下的VMware安轉和執行時,儘量選擇 管理員許可權

·Linux系統的選擇,各有各的優點吧,個人覺得Deepin是介面最好看的,記得設定使用者名稱和密碼

·發現升級為win10系統後,自己所裝的虛擬機器都不能上網了,後來在VMware->編輯->虛擬網路編輯器 中點選了左下角的“恢復預設設定”,測試發現問題解決

    

  ·多數問題,可以百度來的就自己解決,畢竟自己找錯誤的就是很好的學習。

    7.linux命令新發現

    今天在使用xshell軟體連線Linux系統時發現,只有CentOS可以連線,同時使用putty來測試,證實其他的虛擬機器無法連線,根據網上的一個提示 重啟ssh服務,當然網上提示的是 "sudo service sshd start",測試發現應該是沒有安裝的原因,但是使用“sudo apt-get install sshd”是不成功的,可能提示錯誤或者系統不同的原因吧,然後發現使用 語句“sudo  apt-get install ssh”進行順利安裝,同時需要更改目錄/etc/ssh/sshd_config中的資訊,將PermitRootLogin 改為 true ,最後進行啟動服務的命令“sudo service ssh start”,最後測試發現xshell和Putty都可以順利連線,當然FileZilla也是沒問題的。

   順帶一提,為了保證在使用FileZilla時滿足檔案上傳下載,需要以管理員root身份登入,如果沒有設定root密碼,需使用命令$ sudo su 或者$ sudo passwd root 建立密碼,如果要轉化管理員,使用命令 su user 即可。

    8.附帶一段進行隨機數獲取的程式碼,便於以後參考。

<?php
/**
 * 此指令碼的設計用於測試資料
 * 獲取十八組 八個位元組的隨機資料 並進行計算整理
 * 最後以字串拼接的形式輸出  注意其中的十六進位制轉化
 */
$hexadecimal = '7FFFFF';
$maxNum = base_convert($hexadecimal, 16, 10);
echo GetRandStr(18,$maxNum);

/**
 * @param $len  獲取數字的次數
 * @param $tag  數字的最大範圍
 * @return string   獲取隨機數的字串
 *
 */
function GetRandStr($len,$tag)
{
    $output='';
    $output2='';
    for ($i=0; $i<$len; $i++)
    {
        $tagNum = mt_rand(0, $tag);
        $Num1 = sprintf("%06X",$tagNum);//進行位數的補全設定
        $Num2 = GetNum2($Num1,$i);

        $output .= '00'.$Num1;
        $output2.=$Num2;
    }
    return $output.$output2;
}

/**
 * @param $num1 傳入的第一組資料值
 * @param $tag1 參考標記
 * @return string   返回計算後的字串
 */
function GetNum2($num1,$tag1){
    $output2='';
    $tagNum = base_convert($num1, 16, 10);

        if($tag1<8){
            //使用pow()內建函式進行整數的求冪運算
            $m1 = (5*$tagNum)/(pow(2,23)-1)*10000;
        }else{
            $m1 = (20*$tagNum)/(pow(2,23)-1)*1000;
        }
        //使用內建函式floor()取整運算
        $m2 = sprintf("%04X",floor($m1));
        $output2.=$m2;
    return $output2;

}

    9.ThinkPHP去掉URL中的index.php 方法

    部分解決本地無法載入的連結,和虛擬域名的實現 >>參考網址

    10. 127.0.0.1和本機ip地址都無法訪問

      (2017-01-19 更新)

      apache配置虛擬主機後,127.0.0.1和本機ip地址都無法訪問,個人認為兩種使用模式(ip訪問和虛擬主機)不會相容

    解決方法:給 Include conf/extra/httpd-vhosts.conf 前面加個# 註釋配置

不過最好配置虛擬主機。

    11.防止ajax重複提交

      (2017-01-21 更新)  

    (1).參考網址 參考一 參考二 參考三(評論)

    (2).舉個栗子.

//禁用或啟用
function disableDelAdd(order_sn,tag) {
        $("#addNum-"+order_sn).attr('disabled',tag);
$("#delNum-"+order_sn).attr('disabled',tag);
}
//檢查商品庫存 是否允許商品數目的增減
function checkGoodsNum(order_sn,tag,viewNum,buy_num,toUrl,checkUrl,goods_id) {
    var postData = {};
postData['buy_num'] = buy_num;
postData['goods_id'] = goods_id;
disableDelAdd(order_sn,true);
$.ajax({
        type:"POST",
url: checkUrl,
data :postData,
dataType : "json",
success : function(result){
            if(result.status == 1){
                //成功
viewNum.val(parseInt(buy_num));
updateOrderNum(order_sn,tag,toUrl);
}else{
                //失敗
return layer.msg(result.message);
}
            disableDelAdd(order_sn,false);
},
error: function(){
            disableDelAdd(order_sn,false);
}
    });
}

    12.參考ajax詳細寫法 (ajax在微信報錯

/**
 * Created by 百鬼夜行 on 2017/1/21.
 */
$(function () {
    $('.test_submitorder').click(function () {

        var pid = $("#goods_id").val();
var spec_str = $("#carPrefixBTN").text();
var spec_id = $("#carPrefixBTN").attr("spec_id");
var mobile = $("#userTel").val();
var type = $("#type").val();
var carnumber = $("#carNUM").val();
$.ajax({
            url: '__APP__?m=Shopping&a=ajaxSubmitorder',
cache: false,
async: false,
type: 'POST',
data: {
                'mobile': mobile,
'carnumber': carnumber,
'pid': pid,
'spec_id': spec_id,
'spec_str': spec_str,
'type': type
            },
beforeSend: function () {
                //觸發ajax請求開始時執行
$('#btnRecharge').text('提交訂單中...');
$('#btnRecharge').removeClass('test_submitorder');
},
success: function (msg) {
                if (msg.status == 1) {
                    window.location.href = ' __APP__?m=Pay&a=index' + '&oid=' + msg.data;
}
                else {
                    alert(msg.status);
alert('網路繁忙,請稍後再試...');
$('#btnRecharge').text('立刻辦理.');
$('#btnRecharge').addClass('test_submitorder');
}
            }
            ,
error: function (msg) {
                console.log(msg);
alert('網路繁忙...');
$('#btnRecharge').text('立刻辦理.');
$('#btnRecharge').addClass('test_submitorder');
},
complete: function (msg) {
                //ajax請求完成時執行
if (msg.status == 1) {
                    $('#btnRecharge').text('立刻辦理.');
$('#btnRecharge').addClass('test_submitorder');
}
            }
        });
});
});

  Ajax另一種寫法

//檢查當前使用者是否有設定預設收貨地址
function toDealWithBuyerMsg(order_sn,dealWithUrl) {
    var postData = {};
postData['order_sn'] = order_sn;
$.post(
        dealWithUrl,
postData,
function (result) {
            if(result.status == 1){
                //成功
toPayOrder(order_sn);
}else{
                //失敗
layer.msg('Sorry,預設地址未設定或不完整~');
//toAddBuyerMsg(order_sn);
}
        },"JSON");
}