2020年5月17日 星期日

網站摸索筆記: Mac 的php上傳設定

Mac上已經有預設php、Apache了,所以主要針對php檔案上傳問題進行調整。

1) 問題卡關點: php檔案上傳路徑權限
- 因為預設的apache目錄有權限的問題,所以在使用php move_upload_file()時會出現permission deny的錯誤訊息。
- 解決方式是從終端機進入網站目錄,在使用指令 chmod 777 [檔案目錄名稱],就解決了。
例:檔案目錄為sites/upload_img/,在終端機中進入sites目錄,輸入 chmod 777 upload_img


2) php.ini 上傳檔案相關設定
- mac 預設php.ini設定在/etc/ 目錄中,但我只有看到php.ini.default;所以就複製一個另外命名為php.ini

幾個設定的欄位:
- file_uploads= on (預設就是on了)
- upload_tmp_dir= "/privat/tmp_dir/"(若要變更上傳的暫存路徑可以設定這個參數,前面;記得拿掉才會啟用所設定的目錄)
- upload_max_filesize= 20M (最大上傳檔案大小)
- max_file_uploads= 20(對大上傳檔案數量)
- post_max_size=20M (Post上傳的對大檔案大小,若小於upload_max_filesize,上傳時會取最小的)

重啟服務
sudo apachectl restart



2020年4月21日 星期二

網站摸索筆記:MySQL 插入中文問題

MySQL 可能因為語系導致寫入資料錯誤,因此需要變更語系設定為UTF-8。

以下列出可能導致中文寫入失敗的部分:
1) 欄位設定
- 一執行insert 指令就會出現某個欄位寫入失敗,建議可以先試試變更欄位語系
- 指令:alter table [資料表名稱] change [原欄位名稱] [新欄位名稱] [資料型態] [語系設定]- 例:alter table product change content content varchar(500) character set utf8;

2) MySQL 設定
- 也許變更資料欄位後問題就解決了,但建議還是檢查一下MySQL設定

-進入後改這一段
[mysqld]
character-set-server=utf8

3) 資料庫設定
- 進入mysql後,可使用以下指令檢查是否有設定不是utf-8
- show variables where Variable_name like '%character_set%';


4) 資料表設定
- 可以透過以下指令查看資料表語系設定
- show create table [資料表名稱]
例:show create table product;

- 變更資料庫語系指令:alter database [資料庫名稱] character set utf8
例:alter database mydb character set utf8

- 變更資料表語系指令:alter table [資料表名稱] character set utf8
例:alter table product character set utf8




2020年4月17日 星期五

網站摸索筆記:MySQL 入門常用指令

整理幾個基本指令

進入MySQL:mysql -r [username] ip [password]; 
- 進入後會看到

離開MySQL:mysql>exit;

查看目前版本:mysql>select version();

顯示目前資料庫:show databases;
- 會列出目前的資料庫

建立資料庫:create database [資料庫名稱],例:create database mydb;
-建立後可再用show databases; 查詢

使用資料庫:use [資料庫名稱],例:use mydb;
- 選擇資料庫後就可使用針對資料庫的資料表操作

顯示目前資料庫:show tables;
- 會列出資料庫mydb中的資料表

建立資料表:create table [資料表名稱](欄位名 屬性 資料型態, 欄位名 資料型態... ),
例:create table test_tb(id integer auto_increment primary key, description varchar(256), po_time datetime);
- 欄位id: integer- 資料型態為整數, auto_increment- 自動增加(整數+1),primary key(資料表索引)
- 欄位description: varchar(256)資料型態為字串,最大長度為256bytes
- 欄位po_time: 資料型態為日期(yyyy-mm-dd hh:mm:ss)

顯示資料表欄位:describe [資料表名稱]
- 列出資料表中的欄位定義


修改欄位名稱、定義:alter table [資料表名稱] change [原欄位名稱] [新欄位名稱] [資料型態]
例:alter table test_tb change po_time post_date date

新增欄位:alter table [資料表名稱] add column ([新欄位名稱] [資料型態])
例:alter table test_tb add column(ps varchar(10));

移除欄位:alter table [資料表名稱] drop column [欄位名稱]
例:alter table test_tb drop column ps;

清空資料表:truncate table [資料表名稱]
- 刪除資料表中的資料內容,資料表欄位不變

刪除資料表:drop table [資料表名稱]

插入欄位資料:insert [資料表名稱] ([欄位名稱], [欄位名稱]...) value('欄位值', '欄位值'..)
例:insert test_tb (name) value('insert from sql');

查詢欄位資料:select  [欄位名稱], [欄位名稱]... from [資料表名稱]]
例:select name,id from test_tb;

查詢所有欄位資料:select * from [資料表名稱]]
例:select * from test_tb;

條件式查詢:select * from [資料表名稱] where (條件1 and/or 條件2)
例1:select * from test_tb where id>1 and id<5  (兩個條件取交集)
例2:select * from test_tb where id<3 or id>5; (兩個條件取聯集)
例3:select * from test_tb where id=3; (等於單一條件)
例4:select * from test_tb where id between 3 and 5; (介於兩個數值之間)

查詢結果資料排序:select * from [資料表名稱] order by  [欄位名稱]
例1:select * from test_tb order by name; (由小->大)
例2:select * from test_tb order by name desc; (由大->大)

以字串查詢欄位內容:select [欄位名稱] from [資料表名稱] where [欄位名稱] like [字串]
例1:select name from test_tb where name like '33'; (字串完全相等於33才會查出)
例2:select name from test_tb where name like '%33%'; (字串包含33就會查出)

刪除欄位資料:delete from [資料表名] where (條件1 and/or 條件2)
例1:delete from test_tb where id=3;
例2:delete from test_tb where id=2 or name like '%33%';

編輯欄位資料:update [資料表名] set [欄位名稱]='欄位值' where(條件1 and/or 條件2)
例:update product set product_content='產品內容文字' where product_id= 4;


2020年4月14日 星期二

網站摸索筆記:PHP讀取網站設定.ini檔

網站在本機開發後,要部屬到伺服器上,
不同環境的DB連線資訊有些不同,因此想將網站設定檔獨立為本機、伺服器兩份,
這樣就不用再因環境不同而修改程式。

新增一個.ini檔案紀錄DB,內容如下:
[database]
db_name= 'mydb'
db_user= 'root'
db_password= '[root帳號的密碼]'
db_url='localhost:3306'
- [database]: 這是sction,區分ini檔中的各區塊
- 其下的db_name、db_user、db_password、db_url都是參數
- 儲存檔名為 "webconfig.ini"

新增一個php檔案,內容如下:
<?php
//使用parse_ini_file來讀取.ini檔案,會以陣列的方式來存放內容
$ini = parse_ini_file('webconfig.ini',true);

//ini中的sction與參數名會變成陣列的索引 $ini[secion][參數名]
$db=$ini["database"]["db_name"];
$dbhost=$ini["database"]["db_url"];
$dbuser=$ini["database"]["db_user"];
$dbpass=$ini["database"]["db_password"];

//分行列印讀取的陣列資料
echo '<pre>',print_r($ini);'</pre>';

//使用mysqli_connect()來進行DB連線
$link=mysqli_connect($dbhost,$dbuser,$dbpass);
if(! $link) {
    die ('DB連線失敗'. mysqli_error($link));
}
echo 'DB連線成功';
?>
- 使用函式 parse_ini_file(),詳見手冊https://www.php.net/manual/en/function.parse-ini-file.php
- 使用print_r()來顯示陣列資料,參閱手冊https://www.php.net/manual/en/function.print-r.php

從瀏覽器看會看到如下畫面

* 透過webconfig.ini區分兩個環境所存取的DB位置
- 對在Google Cloud Platfom上的VM程式來說就是存Localhost的資料庫
- 本機開發則是透過IP連到遠端的DB


2020年4月13日 星期一

網站摸索筆記:從windonws傳輸檔案到GCP

從本機傳輸多個檔案到Google Cloud Platform,
可以透過SCP FTP來傳輸,步驟如下:

1) 建立Key:
     - 可以使用Putty來建立Private Key、Public Key(Putty下載https://www.putty.org/)
     - Private Key用於傳輸時進行驗證
     - Public Key則要加在GCP的VM SSH設定中

2) 透過winSCP進行連線
    - 安裝winSCP (winSCP下載https://winscp.net/download/WinSCP-5.17.3-Setup.exe)
    - 連線時選擇Private Key


下載Putty建立Key
- https://www.putty.org/
-安裝後到目錄中,執行puttygen.exe


儲存Private Key
- 在如下畫面中,在key comment中輸入用戶名稱(這個名稱會在FTP連線時使用)
- 然後按儲存Private Key(這個Key也會在FTP連線時使用)


複製Public Key 如下Public Key文字


進入GCP的中繼資料SSH設定頁面
- 按下編輯,並貼上複製的Public Key到金鑰欄位


- 按下儲存就新增完成了


開啟winSCP輸入連線資料
- 檔案協定選擇SCP
- 輸入主機名稱
- 輸入使用者名稱(這使用者名稱要與建立Key時相同)
- 然後點擊進階

- SCP/Shell 中選擇sudo su,使用最高權限才可直接上傳檔案到想要的目錄中

- 身分核對中選擇資料的檔案


- 完成設定後回到連線畫面,按下登入,就可以連線到GCP的VM中了





網站摸索筆記:windows啟動Apache錯誤- 找不到VCRUNTIME140.dll

啟動apache時出現 "找不到VCRUNTIME140.dll"的錯誤訊息。

Apache下載時會需要安裝Visual C++ Redistributable for Visual Studio 2015-2019
- 在Apache下載官網上還附上下載連結了。
    vc_redist_x64下載

- 安裝後再重應該就可以正常啟動了


2020年4月12日 星期日

網站摸索筆記:GCP 安裝MySQL與設定

在GCP VM安裝php, Apache後,再來安裝MySQL;
並讓開發的遠端可以連到MySQL中,這樣開發完成後再把網頁放到VM就上線了。

安裝MySQL
-輸入指令:sudo apt-get install mysql-server 

設定MySQL連線
-輸入指令:mysql_secure_installation 
- 會開始設定mysql的帳號root的密碼
- 以及密碼安全性的相關設定

啟動MySQL
-輸入指令:sudo systemctl start mySQL

確認MySQL服務
- 輸入指令:systemctl status mysql.service
- 出現如下Active 的資訊就表示服務啟動了


修改MySQL設定
- 預設MySQL是只允許本機存取,因此要修改成允許遠端存取
-  sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
- 將blind-address這一行的IP改成自己要遠端的IP,若不限制可以加上#註解掉



重新啟動MySQL
-輸入指令:sudo systemctl restart mySQL

嘗試登入SQL
- 輸入指令:mysql -u root -p
- 再輸入root帳號的密碼,看到以下畫面表示登入成功
- 輸入exit; 離開SQL


安裝php-MySQL套件
- 輸入指令:sudo apt install php-mysql
- 這動作安裝後php存取mysql的程式才能正常運作


接著設定VM的防火牆連線3306
- 因為會在本機開發,連到GCP上的資料庫,所以要調整VM設定
- 點擊GCP選單中的VPC網路>防火牆規則


-新增防火牆規則


-防火牆設定
 輸入名稱、說明,流量方向要選輸入

- 設定目標標記來建立VM跟防火牆規則的關連
  如下在VM中的網路標記就要加上dbserver,VM就會套用這個防火牆規則

測試telnet 
- 完成設定後可以從本機命令提示字元telnet [IP] 3306來測試
- 看到以下畫面就表示可以從本機連線到GCP的資料庫了


測試PHP 存取資料庫
- 以下PHP範例可測試資料庫連線
- sudo vi /var/www/html/dbconnect.php
<?php
$dbhost='localhost:3306';
$dbuser='root';
$dbpass='[root帳號的密碼]';
$link=mysqli_connect($dbhost,$dbuser,$dbpass);
if(! $link) {
    die ('DB連線失敗'. mysqli_error($link));
}
echo 'DB連線成功';
?>
- 出現DB連線成功就表示完成PHP與MySQL的環境設定


接下來就可以在不同電腦上開發程式,然後都連GCP的資料庫了。