2020年7月29日 星期三

JQuery/PHP 顯示上傳的圖片、取得php檔案路徑、隱藏圖片區塊、刪除圖片檔案

上傳圖片的功能與三種情境有關,整理作法如下:
1、 該頁面上無圖片,則隱藏圖片區塊,再上傳圖片後顯示預覽
2、該頁面已有圖片,則取得圖片路徑並顯示出來
3、刪除圖片後,隱藏圖片區塊

html:包含一個圖片區塊、一個上傳功能、一張圖片、一個刪除按鈕
<div class="img_col">
    <input id="upload" type="file" name="myfile">
    <img id="img_view" />
    <lable id="btn_del" class="btn_del" >刪除</label>           
</div>


JS:載入頁面時取得php的圖片路徑,若有則顯示圖片,若沒有則隱藏圖片區塊
<script>
    //當網頁載入時
    $(document).ready(function(){ 
        // 將php參數img_url指派給 JS 變數 img_view
        var img_view="<?php echo "$img_url" ?>";
        
        //當img_view有資料-> 圖片資料存在>顯示圖片、反之>隱藏區塊
        if (img_view){
            //以JQuery變更#img_view圖片的SRC參數為img_view
            $("#img_view").attr('src', img_view);
            //以JQuery指定刪除功能按鈕的Click事件,呼叫刪除圖片的函式(見後)
            $("#btn_del").click(function(e){
                del_img(img_view);
            });
        }else{
            //隱藏圖片區塊,及刪除功能按鈕
            $(".img_col").hide();
            $("#btn_del").hide();
        }
    });
</script>


JS:選擇圖片後,將圖片顯示為所選擇的圖 (參考來源資料)
<script>//選擇圖片後產生預覽
    //當input file的的upload變更時,呼叫readURL函式
    $("#upload").change(function() {
            readURL(this);

    function readURL(input) {
        //有可能圖片區塊這時被隱藏,因此先讓區塊顯示出來
        $(".edit_form_img").show();
        $("#btn_del").show();

        if (input.files && input.files[0]) {
            var reader = new FileReader();
                    
            reader.onload = function(e) {
                $('#img_preview').attr('src', e.target.result);
            }
               reader.readAsDataURL(input.files[0]); // convert to base64 string
            }
        }
    });
</script>


JS:刪除圖片函式
function del_img(img)//確認刪除圖片後,刪除圖片
    {
        if (confirm("確認刪除照片?"))
        //這邊將刪除寫在另一支php程式,並取得圖片路徑後將檔案刪除
        location.href="del_product_img.php?img="+img;
    }

PHP:刪除圖片php程式
- 資料庫連線部分就不寫了
- SQL將圖片的欄位update為空值
- 刪除圖片檔案


<?php 
    //取得傳入要刪除的圖片路徑
    $img_url=$_GET["img"];

    //將取得的檔案路徑 update為空值的SQL
    $img_del="UPDATE product set product_img=''  WHERE product_img='$img_url'";

    // 執行SQL (這段的$link是物件>$link = new mysqli($dbhost,$dbuser,$dbpass,$db))
    $result=$link->query($img_del);

    //將檔案自系統中刪除
    unlink($img_url);//將圖片檔案刪除
    
    //刪除後轉址到原頁面
    header("location:o_page.php");
?>



2020年7月28日 星期二

JQuery 滑動checkbox(Switch開關)寫入表單

使用JQuery做一個啟用、停用的切換switch,並將參數傳到表單中;
範例如下:

第一段JS:判斷PHP取自資料庫的參數,並呈現目前的狀態

<script>//檢查產品發佈狀態,顯示對應的publish狀態
        $(document).ready(function(){
           var publish=<?php echo"$is_publish" ?>;
           if (publish==0){
              $("#publish").prop("checked",'');
           }else{
              $("#publish").prop("checked",true);
           }
        });
</script>

HTML:表單中CheckBox的部分
- 由CSS去控制Checkbox樣式,讓他顯示成一個Switch開關
- 實際上是一個Chcekbox判斷是否有勾選
- 用onchange參數呼叫JS來寫入整個表單要傳給另一支php的參數
<!--Switch開關顯示html的部分-->
<label class="col_title">是否發布</lable>
<label class="switch">
    <input id="publish" type="checkbox" name="publish" onchange="check_publish()" >
    <span class="slider round"></span>
</label>


CSS:顯示如Switch開關的CSS
.switch {
    position: relative;
    display: inline-block;
    width: 60px;
    height: 34px;
  }
  
  /* Hide default HTML checkbox */
  .switch input {
    opacity: 0;
    width: 0;
    height: 0;
  }
  
  /* The slider */
  .slider {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: #ccc;
    -webkit-transition: .4s;
    transition: .4s;
  }
  
  .slider:before {
    position: absolute;
    content: "";
    height: 26px;
    width: 26px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    -webkit-transition: .4s;
    transition: .4s;
  }
  
  input:checked + .slider {
    background-color: #2196F3;
  }
  
  input:focus + .slider {
    box-shadow: 0 0 1px #2196F3;
  }
  
  input:checked + .slider:before {
    -webkit-transform: translateX(26px);
    -ms-transform: translateX(26px);
    transform: translateX(26px);
  }
  
  /* Rounded sliders */
  .slider.round {
    border-radius: 34px;
  }
  
  .slider.round:before {
    border-radius: 50%;
  }



第二段JS:根據checkbox狀態,寫入要傳到表單的值(非必要)
*checkbox勾選時預設value為on,否則就是空值
*因此接收表單的程式只要判斷有沒有回傳值,再寫入對應的資料即可
-以下是變更on為a,若後端要特定數值可參考

<script>
//檢查發布CheckBox是否被勾選,寫入特定值
        function check_publish(){  
            if($("#publish").is(':checked'))
                $("#publish").val('a');
        }
 </script>


2020年7月13日 星期一

mysqli::query(): Couldn't fetch mysqli 問題排除紀錄

發生了幾次mysqli::query(): Couldn't fetch mysqli 的錯誤,
紀錄解決方式如下:

原因一: SQL語法有錯
- 將查詢語法輸出,再把輸出的SQL放到mysql中執行看看結果是否正確
- 發生了where欄位條件='xxx' 沒加上'',int的時候不用''


原因二: 太早結束連線時,導致接續的查詢出錯
- 先查詢資料重複再插入新資料時,若在查詢重複資料時就結束連線,就會出現錯誤。

$sql->query(查詢)
$sql->close()  //這時就會出錯,移除這一個步驟的Close()就可以排除問題

$sql->query(插入資料)
$sql->close()

用JS語法檢查email格式


//JS 正規表示式
emailRule = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]+$/;
//取得email欄位值並檢查規則,不符規則會回傳-1
if(document.form.email.value.search(emailRule)==-1 ){
alert("信箱格式有誤");  
}else{
 form.submit();
}            



mysql, php取得特定字串

透過mysql語法取得欄位中的部分字串:

左邊取得特定[文字長度]
SELECT [欄位名], LEFT([欄位名] ,[文字長度]) FROM [資料表] WHERE [條件]
例: SELECT content, LEFT(content,50) FROM contacts 

從右取得特定[文字長度]
SELECT [欄位名], RIGHT([欄位名] ,[文字長度]) FROM [資料表] WHERE [條件]
例: SELECT content, LEFT(content,50) FROM contacts 

透過php語法取得欄位中的部分字串:
mb_substr([字串], [起始位置], [取得長度], [編碼])
例: 
$str="abcd甲乙丙0987654321";
$sub=mb_substr($str, 2, 5, "utf8");
echo "sub=$sub";

輸出結果: sub=cd甲乙丙

2020年7月9日 星期四

PHP 更新ubuntu PHP版本

更新PHP版本從7.0~ 7.4

在php7.4的環境開發,放到php 7.0的環境後發現有些程式碼有問題,
所以只好進行更新到新版本。

直接更新
指令:sudo apt upgrade php
(會安裝中間的各個版本)

若只要安裝php 7.4
指令:sudo apt-get install php7.4

接著要安裝新版模組
指令:sudo apt install php7.4-curl  php7.4-mbstring php7.4-zip php7.4-mysql
(根據需求安裝會用到的模組)

安裝後需要停用舊版本
指令:a2dismod php7.0

接著啟用新版本php
指令:a2enmod php7.4

重新啟用apache
指令:sudo service apache2 restart

確認apache 服務狀態
指令:sudo service apache2 status
如下就是啟用了


若有需要可以在網站目錄(預設/var/www/html/),
增加info.php再輸入網址來顯示php資訊。
php程式碼:
<?php
phpinfo();
?>




2020年7月1日 星期三

PHP- 編碼後html還原 "htmlspecialchars_decode",轉換為純文字

為了避免SQL 注入將寫入的資料進行編碼,但對於文字編輯器所寫入的資料還是要有辦法還原回來。

經過編碼寫入DB的資料如下:
看到&amp;nbsp;&lt;span style=&quot;color: #ff6600;&quot;&gt;&lt;strong&gt;AJA System Test&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;的讀寫效能分別為&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;strong&gt;1485/1022 MB/s&lt;/strong&gt;&lt;/span&gt;(寫入/讀取),另外在&amp;nbsp;&lt;span style=&quot;color: #ff6600;&quot;&gt;&lt;strong&gt;Blackmagicdesign&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;的讀寫效能則分別為&amp;nbsp;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;1311.7/1302.6 MB/s&lt;/span&gt;&lt;/strong&gt;(寫入/讀取),內建的硬碟則可完整支援各種檔案格式,雖然讀寫效能沒有 MacBook Pro 內建硬碟來得出色,但整體來說還是相當不錯的表現。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img class=&quot;lazy loaded&quot; src=&quot;https://attach.mobile01.com/attach/202006/mobile01-20e81a590fecb2cd05d3321bf5150e84.png&quot; data-src=&quot;//attach.mobile01.com/attach/202006/mobile01-20e81a590fecb2cd05d3321bf5150e84.png&quot; data-was-processed=&quot;true&quot; /&gt;&lt;br /&gt;MacBook Air 2020!&lt;br /&gt;&lt;br /&gt;&lt;img class=&quot;lazy loaded&quot; src=&quot;https://attach.mobile01.com/attach/202006/mobile01-b8de9b28a0927c218e3df159d72e41e7.jpg&quot; data-src=&quot;//attach.mobile01.com/attach/202006/mobile01-b8de9b28a0927c218e3df159d72e41e7.jpg&quot; data-was-processed=&quot;true&quot; /&gt;&lt;br /&gt;其實這幾年小編因為工作需要的關係,加上已經習慣大尺寸的顯示螢幕,小編就選擇犧牲行動性選擇效能更佳的 MacBook Pro 16 作為主要的行動工作筆電。這次再度重返 MacBook Air 的懷抱,最讓小編開心的就是肩膀的重量減輕了...&lt;img class=&quot;lazy loaded&quot; title=&quot;XD&quot; src=&quot;https://attach2.mobile01.com/images/emotions/dark/7.gif&quot; data-src=&quot;//attach2.mobile01.com/images/emotions/dark/7.gif&quot; data-was-processed=&quot;true&quot; /&gt;。

還原成html格式
可使用htmlspecialchars_decode($inputtext)



轉換為純文字
可能因為還原導致出現空格,因此要去除前後及中間的空格,
去掉html標籤,並取代特殊符號。

例如:
$str=trim(strip_tags($str));// 去除html標籤及前後空格
$puretext = preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", "",$str); //去除特殊符號及內文中的空白

最後得到的$pretext就是純文字了