陳擎文教學網:PHP

資源(Resource)

Chp1. 架站練習,與蒐集已經寫好的各類互動網站

Chp2. PHP基本,變數,算術運算子,比較運算子,邏輯運算子

Chp3. 選擇控制結構

Chp4. html→php→html,之間傳遞參數,與轉換網址

Chp5. 陣列

Chp6. 各種迴圈

Chp7. 日期時間

Chp8. 自訂函數function()

Chp9. 字串相關函數

Chp10. 各種其它函數(數學函數,eval...)

Chp11. 在網頁之間傳遞參數的cookie與session

Chp12. 物件變數,物件變數陣列

Chp20. 讀取資料庫前要先學習SQL語法

Chp13. PHP讀取資料庫方法一:程序導向的介面:mysqli_connect()

Chp14. **PHP讀取資料庫方法二:物件導向的介面:$mysqli->query($sql)

Chp15. PHP讀取資料庫方法三:物件PDO:$result=$conn->query($sql)

Chp16. **ajax非同步http請求

Chp17. 無限下拉捲頁功能(infinite scroll)(ajax)

Chp18. 申請免費的PHP網站空間

(1).如何在html語法顯示網頁標籤符號:
<:&lt;
>:&gt;
換行:用<br/>
<br/>:&lt;br/&gt
空白鍵: 
轉換網頁標籤等特殊符號:https://htmleditor.io

(2).echo 中文,不顯示亂碼
header('Content-Type: text/html; charset=utf-8');
資源
  上課工具 線上jamboard白板-網頁 用jamborad app 線上黑板( Online blackboard) 線上網頁
  校務系統
  Goole 輸入法(Input software) Goole輸入法(Input:exe) Goole 輸入法(Input:zip) online goole input(中文) online goole input(英文)
  Windows+Apache
+MySQL+PHP整合安裝系統
下載phpStudy官網 下載phpStudy V8.1 XAMPP wampserver  
  免費的網頁編輯軟體 微軟的vs code(visual studio code)      
  線上網頁編輯器:轉換網頁標籤等特殊符號 HTML Editor      
  HTML 5 教學網站 w3c學校-HTML 5 (中文版) w3c學校-HTML 5 (英文版)    
  CSS教學網站 w3c學校-CSS 3(中文版) w3c學校-CSS(英文版)    
  html,CSS教學網站 w3c學校-html,xhtml,htm5
,CSS,cSS3(中文版)
     
  jQuery-DOM jQuery的DOM處理教學1 jQuery的DOM處理教學2    
 
 

 
Chp1 : 架站練習,與蒐集已經寫好的各類互動網站
目錄 1.商業資訊系統的三層架構 2.常用的架設主機與mysql的工具 3.使用Apache架站範例練習
(1) 01.商業資訊系統的三層架構

商業資訊系統的三層架構:
A.客戶端app(client,前端):html,app
B.伺服器網頁(server,後端):php,asp.net,python-django
C.資料庫(database):mySQL,SQL server

(2) 02.常用的架設主機與mysql的工具

常用的php架設主機工具:
(1).phpstudy:
特色:華人主機架設工具,免費,中文界面,一次安裝的集成包。該套裝程式集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安裝,無須配置即可使用,是非常方便
下載:phpstudy官網

(2).WAMP:
特色:Windows + Apache + MySql + PHP
WampServer是一款由法國人開發的Apache Web伺服器、PHP解譯器以及MySQL資料庫的整合套裝軟體。
wampserver支援22種語言,其中有中文簡體和中文繁體。
最大的優點:可以執行各種php的版本(PHP5 到 PHP7),其它的工具都只能夠執行單一版本php,所以有些舊版程式,就無法執行了。
圖示
下載:官網下載

(3).LAMP:
特色:Linux + Apache + MySql + PHP
下載:官網下載

(4).MAMP:
特色:MAC+ Apache + MySql + PHP(在windows也可以安裝)
MAMP 可同時支援 Apache, Nginx 網頁伺服器與其他常用的 PHP, MySQL, OpenSSL, APC, APCu, eAccelerator, XCache, OPCache, Python, Perl, phpMyAdmin, ImageMagick… 等各種套件與應用,安裝好之後只要把你的網頁或 WordPress, XOOPS… 等架站程式放到指定的資料夾之後就能開始運作。不用複雜的調整與設定,裝好軟體能有一個堪用的網頁伺服器環境。
比較特別的是,MAMP 可同時支援 Apache 與 Nginx 兩種不同的網頁伺服器與多個版本的 PHP
注意:若只想使用免費版 MAMP 的話,在安裝過程就不要勾選「MAMP PRO」這個選項,MAMP PRO 支援的功能與可用元件比較多,但只能試用14天,之後就必須付費才能繼續使用
下載:官網下載

(5).Xampp :
特色:xampp is x-os, apache, mysql, php , perl.
XAMPP是一套幫你把LAMP或WAMP環境整合好的安裝程式。上面網址是XAMPP的中文官方網站,目前它支援Linux、Windows、 MacOS、Solaris四種作業系統平台
下載:官網下載

從他們的名字就可以比較出來: AMP的A:是 Apach,
M:是 MySQL
P:是PHP
至於他們的開頭:L 是 Linux,
W 是windows ,
M 是 MAC,
X 是 x-os

(6).AMPPS:
特色:Apache + MySQL + PHP + Python + Softaculous auto-installer.
AMPPS,可架好網頁主機,還有超過250種知名的PHP架站程式可安裝,例如:架設WordPress、PhpBB、XOOPS、Joomla、osCommerce…
AMPPS就是「Apache + MySQL + PHP + Python + Softaculous auto-installer」的縮寫,
PHP跟Python都是現在非常熱門的網頁程式語言,
Softaculous auto-installer則是一套網站程式自動安裝工具,常與虛擬主機的管理後台(如cPanel、DirectAdmin、Plesk、H-Sphere…), 相結合,讓使用者可以快速地安裝各種網站程式
下載:官網下載

(3) 03.使用Apache架站練習

01.下載架站軟體:下載phpStudy

03.練習範例:源碼
A.貓走路網頁(html)
B.網頁模板1網頁模板2(html)

C.discuz論壇範例(php+mySQL資料庫,解壓縮後,複製upload到www下,直接http://localhost/upload/安裝)
D.PHP討論區範例(必須先在mySQL建立一個任意名稱資料庫,然後再安裝:複製upload到www下,直接http://localhost/upload/安裝)
解壓縮,將upload複製到www
帳號密碼root


常用的論壇程式:Molyx,Discuz,PHPwind,BMB
範例:
常見的的論壇程式有: 
1. vBB (PCZone ) 
2. IPB ( MSFN ) 
3. phpBB ( 竹貓
4. Discuz ( 大多數中文網站載點二
5. PHPWind ( 數位男女 )

 

 
Chp2.PHP基本,變數,算術運算子,比較運算子,邏輯運算子
1 範例2-1:輸出一段文字

<?php
echo "大家新年快樂" ;
?>


程式碼內容
2 範例2-2:註解

<?php
#  第一種註解 
// 第二種註解
/* 第三種註解
可以註解很多行
*/
echo "大家新年快樂" ;
?>

程式碼內容
3

範例2-3:變數

$a

<?php
//php的變數不需要宣告

//int變數
$x = 5;

//float變數
$y = 10.5;

//文字變數
$txt = "Hello world!";

//數字相加
$a = 5;
$b = 6;
echo $a+$b;

?>


程式碼內容
4

範例2-4:字串運算子

$a.$b.$c

<?php
$a = "您總共購買";
$b = "1000";
$c = "元";
$a = $a.$b.$c;
echo $a;
?>

1.祝福大家:<?php
echo "新年快樂,恭喜發財。";

echo "<br/>2.";
$a = 500;
$b = 600;
echo $a+$b."元";

echo "<hr/>3.";
$a = "你總共購買";
$b = 1100;
$c ="元";
//$a =$a.$b.$c;
echo $a.$b.$c;
?>


程式碼內容
5

範例2-5:算數運算子

+(加法)
-(減法)
*(乘法)
/(除法)
%(取餘數)

<?php
$a = 10;
echo $a+5;
echo "<br/>";
echo $a-5;
echo "<br/>";
echo $a*5;
echo "<br/>";
echo $a/5;
echo "<br/>";
echo $a%3;
?>


程式碼內容
6

範例2-6:比較運算子

等於(==)
不等於(!=)
大於(>)
小於(<)
大於等於(>=)
小於等於(<=)

var_dump($a)
//輸出變數$a的資料型態(對true,或錯false)

<?php
$a = 1>2;
var_dump($a); //輸出變數$a的資料型態(對true,或錯false)

echo '<br>';

$b = 1<2;
var_dump($b);
?>


程式碼內容
比較運算子
運算子 意義 範例 說明
== 相等 $a == $b $a等於$b
=== 全等 $a === $b $a等於$b, 
且資料格式相同。
!= 不相等 $a != $b $a不等於$b
<>  不相等 $a <> $b $a不等於$b
!== 不全等 $a !== $b $a不等於$b, 
或資料格式不相同。
小於 $a < $b $a小於$b
大於 $a > $b $a大於$b
<= 小於或等於 $a <= $b $a小於或等於$b
>= 大於或等於 $a >= $b $a大於或等於


7

範例2-7:邏輯運算子

與(and、&&)
或(or、||)
僅一(xor)
不是(!)

var_dump($a)
//輸出變數$a的資料型態(對true,或錯false)

<?php
$a = (5>6 or 8<9);
var_dump($a);
echo '<br>';

$b = (5>6 and 8<9);
var_dump($b);
echo '<br>';

$c = !(5>6); //負負得正,變成true
var_dump($c);
?>


程式碼內容
邏輯運算子(Logical Operators)
運算子 同義 意義 範例 說明
and && $a and $b $a與$b皆為真
or || $a or $b $a與$b至少有一個為真
xor   僅一 $a xor $b $a與$b僅有一個為真
!   不是 !$a $a不為真
&& and $a && $b $a與$b皆為真
|| or $a || $b $a與$b至少有一個為真

 

8 三種判斷是否有值:isset,empty,is_null

三種判斷是否有值:isset,empty,is_null
(1).isset():檢查變數是否有設置
使用方法:isset($var);
(參考資料:http://php.net/manual/en/function.isset.php)

(2).empty():檢查變數是否為空值
使用方法:empty($var);
(參考資料:http://php.net/manual/en/function.empty.php)

(3).is_null():檢查變數是否為null
使用方法:is_null($var);
(參考資料:http://php.net/manual/en/function.is-null.php)

(4).比較
isset()檢查的是「變數」存不存在,
empty()檢查的是變數內的「值」是否為空

(5).說明:
_(A).設定value1值為空陣列
isset()判定:值有設定
empty()判定:未有值
in_null()判定:有值

_(B).設定value1值為0
isset()判定:值有設定
empty()判定:未有值
in_null()判定:有值

_(C).設定value1值為null(或被註銷)
isset()判定:值未設定
empty()判定:未有值
in_null()判定:未有值
(6).範例:
<?php
$a = "test";
var_dump(isset($a)); // TRUE
$b;
var_dump(isset($b)); // FALSE
$foo = NULL;
var_dump(isset($foo)); // FALSE
?>

程式碼內容

 

 
Chp3. 選擇控制結構
1

if控制結構

if(條件){
子句;
}

<?php
$a = 7;
$b = 6;
if($a >= $b){
echo $a."大於等於".$b;
}
?>

echo "$a大於等於$b";

2

if…else…控制結構

if(條件){
子句一;
}else{
子句二;
}

<?php
$a = 6;
$b = 7;
if($a >= $b){
echo $a."大於等於".$b;
}else{
echo $a."小於".$b;
}
?>

echo "$a大於等於$b";
echo "$a小於$b";

3

 

if…elseif…else…控制結構

if(條件一){
子句一;
}elseif(條件二){
子句二;
}else{
子句三;
}

<?php
$a = 6;
$b = 6;
if($a > $b){
echo "$a大於等於$b";
}elseif($a==$b){
echo "$a等於$b";
}else{
echo "$a小於$b";
}
?>

4

 

switch 控制結構

switch($i){
case 1:
子句一;
break;
case 2:
子句二;
break;
case 3:
子句三;
break;
default:
子句四;
break;
}

<?php
$a=80;
switch(true){
case $a==100:
echo $a."滿分";
break;
case $a>=85 && $a<100:
echo $a."分,好成績";
break;
case $a>=65 && $a<85:
echo $a."分,還不錯";
break;
case $a>=50 && $a<65:
echo $a."分,要加油";
break;
case default:
echo $a."分,認真點";
break;
}
於$b";
}
?>

5

 

三元運算子(?:)控制結構

echo 條件?子句一:子句二;

變數==(條件)?子句一:子句二;

<?php
$a=80;
echo ($a>=0)?"及格":"不及格";
?>

 

 
Chp4. html→php→html,之間傳遞參數,與轉換網址
目錄 4-1前端傳回後端,計算加法(txt顯示) 4-2前端傳回後端,計算加法(原html顯示) 4-3後端計算加法(後端同時負責html網頁與計算) 4-4前端網頁javascript計算加法
4-5前端網頁javascript呼叫後端php計算 轉換網頁:從html裡面轉換到PHP 4-11轉換網頁:從php轉換到html 4-6註冊會員(php讀取html5各種元件)
4-7單選題考試(php讀取radiobutton) 4-8複選購物總金額(php讀取checkbox) 4-9單選題考試(用switch判斷 4-10下拉選單衣服樣式(php讀取selec)
4-12一切自己從零做出的範例
1

表單資料上傳
4-1前端傳回後端,計算加法(txt顯示)
(從html傳遞參數給php)
表單  method="post" 

取得表單上的欄位值:
$_POST["欄位變數"]

1.下載表單的html語法,建立exp04-1.html

2.填入參數:
 method="post"
action="exp04-1.php"

填入三個欄位的命名:
input type="text" name="t1"
input type="text" name="t2"

3.撰寫exp4-18.php
<?php

$a = $_POST["t1"];
$b = $_POST["t2"];
$c = $a+$b;
echo "總和為:".$c;

?>

☎成果範例: 結果範例

☎成果程式碼: exp4-1.php的程式碼

網頁間傳遞資料的方法有二種:
(都必須大寫)
(1).GET:有上傳資料量的限制,一般傳送大量的資料或者上傳檔案都不會使用GET
(2).POST:適合用來傳送大量的資料,直接的由伺服器接收。

  網址顯示資料否? 可否在網址修改資料?
POST 不會 不行
GET

(3).所以用POST傳遞資料比較安全

(4)在PHP接收所傳遞來資料的指令
$_POST["欄位變數"]
$_GET
["欄位變數"]

2

(接上一題)
4-2前端傳回後端,計算加法(原html顯示)
接收傳遞來的變數後,
在主機的php網頁顯示一模一樣的網頁,並在欄位顯示計算結果

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp04-2.html

2.填入參數:
 method="post"
action="exp04-2.php"

填入三個欄位的命名:
input type="text" name="t1"
input type="text" name="t2"

3.撰寫 exp04-2.php(先複製exp04-2.html的全部html語法),然後插入php語法
<div class="form-group">
<?php
$a = $_POST["t1"];
$b = $_POST["t2"];
$c = $a+$b;
?>

<input type="text" class="form-control" value="<?php echo $a; ?>">

<input type="text" class="form-control" value="<?php echo $b; ?>">

<input type="text" class="form-control" value="<?php echo $c; ?>">

4.結果範例

 

3

(接上一題)
4-3後端計算加法(後端同時負責html網頁與計算)
只用一個php網頁,本身傳遞參數給自己,並在欄位顯示計算結果

(phpl傳遞參數給自己)

1.下載表單的html語法, 建立exp04-3.php

2.填入參數:
 method="post"
action=""
(沒有指定檔案,就是傳遞給自己)
填入三個欄位的命名:
input type="text" name="t1"
input type="text" name="t2"

3.撰寫 exp4-3.php
重點1:判別前端是否有輸入資料submit按鈕到後端,php程式碼寫法有兩種:
(1)方法1:判別是否isset($_POST['n1'])==true
(2)方法2:判別是否$_POST == true
重點2:如果有按按鈕送出,才會$_POST==true
if($_POST){}

3.程式碼(採用方法2):
<form method="post" action="" class="form-inline">
<div class="form-group">
<?php
$a = 0;
$b = 0;
$c = 0;
if($_POST){
$a = $_POST["t1"];
$b = $_POST["t2"];
$c = $a+$b;

}
?>
<input type="text" name="t1" class="form-control" value="<?php echo $a; ?>">

<input type="text" name="t2" class="form-control" value="<?php echo $b; ?>">

<input type="text" name="t3" class="form-control" value="<?php echo $c; ?>">

4.結果範例

 

4

(接上一題)
4-4前端網頁javascript計算加法:
好處:前端自行計算,不呼叫後端,減輕後端主機server的工作負擔

(從html傳遞參數給php)

1.☎素材檔案:下載表單的html語法,建立exp4-4.html

2.<form method="" action="" class="form-inline"></form>
不填入參數: method="" action=""
4.把三個欄位的name改成id:
input type="text" id="t1"
input type="text" id="t2"

5.在button指定轉換網頁及傳遞參數的function
<button onclick="show()" class="btn btn-danger">雲端計算</button>
6.javasccipt程式碼:
<script>
function show()
{
y1 = parseInt(t1.value);
y2 = parseInt(t2.value);
t3.value = y1+y2;
}
</script>

☎成果範例:
4.結果範例

☎成果程式碼檔案:

2.exp4-4.html的程式碼

4

(接上一題)
4-5.前端網頁javascript呼叫後端php計算:
使用網頁網址傳遞參數的方法,不用form-actiion指定網址的方法,然後在php使用$_GET來接收變數

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp4-5.html

2.刪除<form method="post" action="exp4-2.php" class="form-inline"></form>
不填入參數: method="" action=""
3.或是把<form></form>改成<div></div>

3.在button指定轉換網頁及傳遞參數的function
<button onclick="show()" class="btn btn-danger">雲端計算</button>
<script>
function show(){
y1=t1.value;
y2=t2.value;
str= "exp11.php?t1="+ y1 + "&t2=" + y2;
window.location.assign(str);
}
</script>

☎重點1:javascript轉換網頁,有兩種寫法:
(1)window.location.assign(網址)
(2)window.location.href = 網址

☎重點2:網絡間呼叫url網址的格式:
(1)格式:https://www.sample.com/main/page/index.html?keyword=abc&happy=abc
(2)民視購物網站:https://www.pure17go.com.tw/sale/2219/157868/?mid=1916
(3)momo購物網站:https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=7858831&cid=cheap&oid=1&mdiv=1000000000-bt_0_238_01-bt_0_238_01_e1&ctype=B

☎重點3:HTTP 請求方法有 GET、POST、PUT、DELETE 等,最常用的 Get 與 Post。
☎重點4:GET vs POST
(1)Get:瀏覽器將 headers 與 data 同時送出,因此只會產生 1 個 TCP 封包,最後伺服器端回應 200 與資料。
(2)Post:瀏覽器先將 headrs 送出,等到伺服器端回應 100 continue 後再傳送 data,因此會產生 2 個 TCP 封包,最後伺服器端回應 200 與資料。

3.撰寫 exp4-5.php(先複製exp4-5.html的全部html語法),然後插入php語法
<div class="form-group">
<?php
if($_GET)
{
$a = $_GET["t1"];
$b = $_GET["t2"];
$c = $a+$b;
}
?>

<input type="text" class="form-control" value="<?php echo $a; ?>">

<input type="text" class="form-control" value="<?php echo $b; ?>">

<input type="text" class="form-control" value="<?php echo $c; ?>">

☎重點1:判別是否有$_POST變數或$_GET變數:
(1)方法:if($_POST){}
原理:如果$_POST == true,代表有按了送出submit按鈕

(2)方法:if($_GET){}
原理:如果$_GET == true,代表網址url有傳遞參數

☎範例:
4.結果範例

☎素材檔案:

1.下載表單的html語法

2.exp4-5.html的程式碼

3.exp4-5.php的程式碼

5

轉換網頁方法(I)

4-6.從html裡面轉換到PHP

(1)傳統form action methoud=post submit方法
<form method="post" action="exp08.php" class="form-inline">
<div class="form-group">
<input type="text" name="t1" class="form-control" placeholder="數字1">
</div>
<br/><br/>
<button type="submit" class="btn btn-danger">雲端計算</button>

(2)自己寫button onclick法(沒有傳遞參數法)
<button onclick="location.href='exp11.php" class="btn btn-danger">返回客戶端</button>

(3)自己寫button onclick法(有傳遞參數法)
<button onclick="show()" class="btn btn-danger">雲端計算</button>
<script>
function show(){
y1=t1.value;
y2=t2.value;
str= "exp11.php?t1="+ y1 + "&t2=" + y2;
window.location.assign(str);
}
</script>

6

轉換網頁方法(II)

exp4-11.從php轉換到html

(1)觀念:若在php呼叫javascript,程式碼會重新執行一遍,會出現錯誤信息
(2)觀念:若在javascript的function裡面執行php指令,則一開始跳過javascript直接執行php指令
換言之,php
指令會優先javascript執行
換言之,在php裡面執行javascript大部分都會引起錯誤

所以,只能用php的if判斷式來判別,符合才轉換網頁到html

(2)唯一方法:使用php的if來判別是否以及按了按鈕
<button name="backbutton" class="btn btn-danger">返回客戶端</button>

<?php
if(isset($_POST['backbutton'])){
header("Location:exp11.html");
exit;
}

?>

(3)php1轉換網頁指令
header("Location:網頁檔名");

(4)判別某個按鈕是否被按了
if(isset($_POST[按鈕名稱])){
...
}

(5)isset(變數):就是拿來確定變數是否已經被設置
isset(變數)=true(或1),表示變數已經被設置,而且有值(不是Null)
isset(變數)=false(或0),表示變數沒有被設置,或無值(Null)
       $b = NUll;
       $c = 0; 
       echo isset($a); //變數存在,但值為NULL,則 FALSE;
       echo isset($c);  //變數存在,且值為0,則 TURE 

(6).unset($c); // 清空 $c 的值

☎素材檔案:

1.下載表單的html語法,建立exp4-11b.php

☎成果範例:
(1)結果範例4-11a(由php,自動轉到yahoo網站)

(2)結果範例4-11b(php有兩個按鈕,一個轉到yahoo,一個轉到google)

☎成果程式碼檔案:

2.exp4-11a.php的程式碼

3.exp4-11b.php的程式碼

 

5

註冊會員
4-6.php讀取html5各種元件

各種html5元件,只有radio,checkbox要先檢查是否有值,isset($_POST["Radiousa"]),若有值才進行計算,若沒判斷會有錯誤

(從html傳遞參數給php)

1.☎素材檔案:下載表單的html語法 ,建立exp4-6.html

2.填入參數:
 method="post"
action="exp4-6.php"

填入三個欄位的命名:
input type="text" name="a1"
input type="text" name="a2"

3.撰寫 exp4-6.php
<?php
$a1 = $_POST["a1"];

...

if(isset($_POST["a10"])){
$a10 = $_POST["a10"];
}else{
$a10 = false;
....
}
?>

☎成果範例:
4.結果範例

☎成果程式碼檔案:

2.exp4-6.html的程式碼

3.exp4-6.php的程式碼

6

4-7.單選題考試

php讀取radiobutton單選鈕的name名稱,把value值儲存到該變數

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp4-7.html

2.填入參數:
 method="post"
action="exp4-7.php"

填入三個欄位的命名:
<label><input type="radio" name="Rusa" id="a1" value="1億">1億人</label>
<label><input type="radio" name="Rusa" id="a2" value="2億">2億人</label>

3.撰寫 exp4-7.php
<?php
$Rusa = $_POST["Rusa"];

$score=0;
if($Rusa=="3億"){
$score=100;
}

?>

☎重點1:各種html5元件,只有radio,checkbox要先檢查是否有值,isset($_POST["Radiousa"]),若有值才進行計算,若沒判斷會有錯誤
☎重點2:若radioButton1有3個子元件,則傳到php時,只會傳遞一個name的值,不是傳遞三個id子元件的個別值
☎重點3:若radioButton1有3個子元件,則傳到php時,只會傳遞一個值:name=nradioButton1的value,傳到php給$_POST["Rusa"]
☎重點4:$_POST['usa']讀取的是<input type="radio" name="usa" id="r3" value="3億">的value值,不是innerHtml文字

☎成果範例:
1.結果範例

☎成果程式碼檔案:

2.exp4-7.html的程式碼

3.exp4-7.php的程式碼

7

4-8.複選購物總金額


exp4-8 php讀取checkbox複選選鈕的多個name名稱,並把value值儲存到該變數

但php讀取checkbox時要先判斷是否有值,isset($_POST["a1"]),若有值才進行計算,若沒判斷會有錯誤

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp4-8.html

2.填入參數:
 method="post"
action="exp4-8.php"

填入三個欄位的命名:
<input type="checkbox" name="a1" value="iphoneX手機">iphoneX手機:NT$35,000元

3.撰寫 exp4-8.php
<?php
$txt="";
$money=0;
if(isset($_POST["a1"])){
$txt .= $_POST["a1"].",";
$money +=35000;
}
if(isset($_POST["a2"])){
$txt .= $_POST["a2"].",";
$money +=27000;
}
if(isset($_POST["a3"])){
$txt .= $_POST["a3"].",";
$money +=30000;
}
if(isset($_POST["a4"])){
$txt .= $_POST["a4"].",";
$money +=16000;
}

?>
☎重點1:$_POST['ck1']讀取的是<input type="checkbox" name="ck1" value="iphoneX手機">的value值,不是innerHtml文字
☎成果範例:
1.結果範例

☎成果程式碼檔案:

2.exp4-8.html的程式碼

3.exp4-8.php的程式碼

8

4-9.單選題考試

php讀取radiobutton單選鈕,可以用switch判斷,最適當

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp4-9.html

2.填入參數:
 method="post"
action="exp4-9.php"

填入三個欄位的命名:
<label><input type="radio" name="Rusa" id="a1" value="1億人">1億人</label>
<label><input type="radio" name="Rusa" id="a2" value="2億人">2億人</label>

3.撰寫 exp4-9.php
<?php
if(isset($_POST["Rusa"])){
switch($_POST["Rusa"]){
case "1億人":
$score=0;
break;
case "2億人":
$score=0;
break;
case "3億人":
$score=100;
break;
default:
$score=0;
break;

}} ?>
4.結果範例
9

4-10.下拉選單衣服樣式

php讀取select的name名稱,數值為value

(從html傳遞參數給php)

1.下載表單的html語法 ,建立exp4-10.html

2.填入參數:
 method="post"
action="exp04-10.php"

填入三個欄位的命名:
<label class="col-sm-2" for="list01name">選擇服裝款式: </label>
<select class="col-sm-10" name="list01name" class="form-control">
<option value="牛仔褲500元">牛仔褲</option>
<option value="連身裙800元">連身裙</option>
<option value="襯衫1500元">襯衫</option>
<option value="西裝5000元">西裝</option>
<option value="夾克2000元">夾克</option>
</select>

3.撰寫 exp4-10.php
<?php
echo "你所購買的衣服樣式為:".$_POST["list01name"]."<br/>size為:".$_POST["list02name"];
?>
☎重點1:$_POST['s1']讀取的是<select class="col-sm-10" name="s1">的<option value="">值
☎成果範例:
1.結果範例

☎成果程式碼檔案:

2.exp4-10.html的程式碼

3.exp4-10.php的程式碼

11

4-12一切自己從零做出的範例

4-12一切自己從零做出的範例

不靠下載表單的html語法,而是自己從零開始建立html,再連接php

☎練習範例1: 結果範例

☎練習範例2: 結果範例

☎練習範例3: 結果範例

☎練習範例4: 結果範例



補充說明:HTML 5各種元件 <input> type 語法<input type="value">

type="value"

描述

button

定義可點擊的按鈕(大多與 JavaScript 使用來啟動腳本)

checkbox

定義核取方塊。

color

定義拾色器。

date

定義日期欄位(帶有 calendar 控制項)

datetime

定義日期欄位(帶有 calendar 和 time 控制項)

datetime-local

定義日期欄位(帶有 calendar 和 time 控制項)

month

定義日期欄位的月(帶有 calendar 控制項)

week

定義日期欄位的周(帶有 calendar 控制項)

time

定義日期欄位的時、分、秒(帶有 time 控制項)

email

定義用於 e-mail 位址的文本欄位

file

定義輸入欄位和 "流覽..." 按鈕,供檔上傳

hidden

定義隱藏輸入欄位

image

定義圖像作為提交按鈕

number

定義帶有 spinner 控制項的數位欄位

password

定義密碼欄位。欄位中的字元會被遮蔽。

radio

定義選項按鈕。

range

定義帶有 slider滑動軸 控制項的數位欄位。

reset

定義重新開機按鈕。重新開機按鈕會將所有表單字段重置為初始值。

search

定義用於搜索的文本欄位。

submit

定義提交按鈕。提交按鈕向伺服器發送資料。

tel

定義用於電話號碼的文本欄位。

text

默認。定義單行輸入欄位,使用者可在其中輸入文本。預設是 20 個字元。

url

定義用於 URL 的文本欄位。

唯一的例外:下拉式選單,沒有在上面,必須用早期的html語法select-option 來做,範例:
<select id="mysize" size="4" data-native-menu="false">
<option>XL</option>
<option>L</option>
<option>M</option>
<option>S</option>
</select>

注意:在手機上無法顯示下拉式選單,除非加上data-native-menu="false",就會出現彈出樣式選單

 

 
Chp5. 陣列
練習範例 範例5-1三種一維陣列 範例5-2陣列編號可以是中英文(foreach的二種格式) 範例5-3二維陣列 範例5-4陣列的各種函數(1)
範例5-5陣列的各種函數(2) 範例5-6陣列的排序 範例5-7陣列的各種函數(3) 範例5-8將一維陣列的定給另外一個二維陣列
範例5-9二維陣列的排序      
  php把陣列轉成json,如何顯示中文,沒有亂碼

php把陣列轉成json,如何顯示中文,沒有亂碼
方法:$arr = json_encode($arr, JSON_UNESCAPED_UNICODE);

1

範例5-1:三種一維陣列的使用

隨機取得陣列的編號:array_rand()

範例5-1:三種一維陣列

<?php
echo "//第一種陣列 $a[0] =...";
$a[0] = "Did you lose weight intentionally?妳有故意在減肥嗎?";
$a[1] = "I've got missed calls. 我有未接來電耶~";
$a[2] = "I wonder which shoes to put on. 該穿那雙鞋呢?";
$a[3] = "I don't have a good appetite these days. 最近都沒什麼胃口";
$a[4] = "Don't even think about it~ 想都別想啦!!";

echo "顯示第1句英文:<br/>";
echo $a[0]."<br/>";

echo "顯示所有英文:<br/>";
for($i=0;$i<=4;$i++){
echo $a[$i]."<br/>";
}

echo "<br/><br/>";
/////////////////////////////////////////////////////////
echo "//第二種陣列 $a = array(,,,)";
$b = array("Did you lose weight intentionally?妳有故意在減肥嗎?",
"I've got missed calls. 我有未接來電耶~",
"I wonder which shoes to put on. 該穿那雙鞋呢?",
"I don't have a good appetite these days. 最近都沒什麼胃口",
"Don't even think about it~ 想都別想啦!!");

echo "顯示第2句英文:<br/>";
echo $b[1]."<br/>";

echo "顯示所有英文:<br/>";
foreach($b as $v){
echo "$v<br/>";
}
echo "<br/><br/>";
/////////////////////////////////////////////////////////
echo "//第三種陣列 $a = array(索引=>值,,,)";
$c = array(0=>"Did you lose weight intentionally?妳有故意在減肥嗎?",
1=>"I've got missed calls. 我有未接來電耶~",
2=>"I wonder which shoes to put on. 該穿那雙鞋呢?",
3=>"I don't have a good appetite these days. 最近都沒什麼胃口",
4=>"Don't even think about it~ 想都別想啦!!");

echo "顯示第3句英文:<br/>";
echo $c[2]."<br/>";

echo "顯示所有英文:<br/>";
print_r($c);

echo "<br/><br/>";
/////////////////////////////////////////////////////////
echo "//隨機取得陣列的編號:array_rand()<br/>";
$key = array_rand($c);
echo($c[$key]);
?>
4.
☎成果範例1:結果範例

☎成果範例2:結果範例

☎程式碼:

1.p5-1.php的程式碼

2.exp5-1.php的程式碼

2

範例5-2:陣列編號可以是中英文 $a['李大同'] =..."

foreach的二種格式
foreach($tel as $v){
...
}

foreach($tel as $i=>$v){
...
}

範例5-2:三種一維陣列的文字索引index=>value值

<?php
//////////////////////////////////////////////////
echo "//陣列編號可以是中英文 $a['李大同'] =...";
$tel["李大同"] = "0912123456";
$tel["張花花"] = "0956789741";
$tel["林美美"] = "0985274136";
$tel["宋妮妮"] = "0945695174";
$tel["吳盼盼"] = "0995715325";

echo "顯示第張花花同學電話:<br/>";
echo $tel["張花花"]."<br/>";

echo "顯示所有同學電話:<br/>";
foreach($tel as $v){
echo $v."<br/>";
}

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "// foreach第二種格式,foreach(陣列 as 索引編號 =>值){...}";
$score["李大同"] = 90;
$score["張花花"] = 85;
$score["林美美"] = 60;
$score["宋妮妮"] = 99;
$score["吳盼盼"] = 75;

echo "顯示所有資料:<br/>";
foreach($tel as $i=>$v){
echo $i."同學的分數".$v."<br/>";
}

?>


☎成果範例1:結果範例

☎成果範例2:結果範例

☎程式碼:

1.p5-2.php的程式碼

2.exp5-2.php的程式碼

3

範例5-3:二維陣列
array(array("..",90),
array(".."90),
array("..",85
) );

範例5-3:顯示二維陣列
foreach($stu as $v1){
foreach($v1 as $v2){
...
}
}

範例5-3:二維陣列

<?php
//////////////////////////////////////////////////
echo "//二維陣列,編號可以是中英文 $a['李大同'] =...";
$stu = array(array("李大同","0912123456",90),
array("李大同","0912123456",90),
array("張花花","0956789741",85),
array("林美美","0985274136",60),
array("宋妮妮","0945695174",99),
array("吳盼盼","0995715325",75));

echo "顯示第1位同學的所有資料<br/>";
echo "姓名".$stu[0][0].", 電話".$stu[0][1].",分數".$stu[0][2]."<br/>";

////////////////////////////////////////////////////////////
echo "顯示全部同學的資料(一個資料,一行顯示)<br/>";
foreach($stu as $v1){
foreach($v1 as $v2){
echo $v2."<br/>";
}
}

//////////////////////////////////////////////////////
echo "顯示全部同學的資料(一個人的所有資料,一行顯示)<br/>";
foreach($stu as $v1){
$txt ="";
foreach($v1 as $v2){
$txt .= $v2."," ;
}
echo $txt."<br/>";
}

?>


☎成果範例1:結果範例

☎成果範例2:結果範例

☎程式碼:

1.p5-3.php的程式碼

2.exp5-3.php的程式碼

4

範例5-4:陣列的各種函數(1)

計算陣列數目,陣列長度
count($s)

計算陣列的各元素總和
array_sum($s)

反轉後的陣列內容
array_reverse($s)

把二維陣列拆解為一維陣列
list($a1,$a2,$a3,$a4,$a5) = $stu

範例5-4:陣列的各種函數(1)

<?php
//////////////////////////////////////////////////
$stu = array(array("李大同","0912123456",90),
array("李大同","0912123456",90),
array("張花花","0956789741",85),
array("林美美","0985274136",60),
array("宋妮妮","0945695174",99),
array("吳盼盼","0995715325",75));

echo "//計算陣列內容數 count(陣列)<br/>";
echo "計算本班人數?<br/>";
echo count($stu)."人";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//傳回陣列所有元素相加之值 array_sum(陣列名稱)<br/>";
$score = array(90,80,75,60,50);
echo "傳回各科目成績總合?<br/>";
echo array_sum($score)."分";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//反轉陣列次序 array_reverse(陣列名稱)<br/>";
//$score = array(90,80,75,60,50);
echo "原本陣列內容(各科分數)?<br/>";
foreach($score as $v) echo $v.", ";
echo "傳回反轉後的陣列內容(各科分數)?<br/>";
foreach(array_reverse($score) as $v) echo $v.", ";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//把陣列,反向拆解成幾個變數$a1,$a2....:list(var1,var2...) = $arrayvar<br/>";
echo "把本班同學陣列,拆解成變數$a1,$a2....,印出第一位同學的所有資料<br/>";
list($a1,$a2,$a3,$a4,$a5) = $stu;
echo "$a1[0], $a1[1], $a1[2]";

?>


☎成果範例1:結果範例

☎成果範例2:結果範例

☎程式碼:

1.p5-4.php的程式碼

2.exp5-4.php的程式碼

5

範例5-5:陣列的各種函數(2)

計算陣列的元素數量
count($s)

計算陣列的各元素總和
array_sum($s)

反轉後的陣列內容
array_reverse($s)

把二維陣列拆解為一維陣列
list($a1,$a2,$a3,$a4,$a5) = $stu

陣列的各種函數(2)

<?php
//////////////////////////////////////////////////
$stu = array(array("李大同","0912123456",90),
array("李大同","0912123456",90),
array("張花花","0956789741",85),
array("林美美","0985274136",60),
array("宋妮妮","0945695174",99),
array("吳盼盼","0995715325",75));

echo "//計算陣列內容數 count(陣列)<br/>";
echo "計算本班人數?<br/>";
echo count($stu)."人";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//傳回陣列所有元素相加之值 array_sum(陣列名稱)<br/>";
$score = array(90,80,75,60,50);
echo "傳回各科目成績總合?<br/>";
echo array_sum($score)."分";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//反轉陣列次序 array_reverse(陣列名稱)<br/>";
//$score = array(90,80,75,60,50);
echo "原本陣列內容(各科分數)?<br/>";
foreach($score as $v) echo $v.", ";
echo "傳回反轉後的陣列內容(各科分數)?<br/>";
foreach(array_reverse($score) as $v) echo $v.", ";

echo "<br/><br/>";
//////////////////////////////////////////////////
echo "//把陣列,反向拆解成幾個變數$a1,$a2....:list(var1,var2...) = $arrayvar<br/>";
echo "把本班同學陣列,拆解成變數$a1,$a2....,印出第一位同學的所有資料<br/>";
list($a1,$a2,$a3,$a4,$a5) = $stu;
echo "$a1[0], $a1[1], $a1[2]";

?>


☎成果範例1:結果範例

☎程式碼:程式碼
6

範例5-6:陣列的排序

數字編號陣列的排序
小到大排序陣列,新的次序:sort(陣列)

大到小排序陣列,新的次序:rsort(陣列)

 

非數字編號陣列,而是文字編號陣列的排序

數值排序:小到大排序陣列次序(文字編號陣列):asort(陣列)

數值排序:大到小排序陣列次序(文字編號陣列):arsort(陣列)

文字key編號排序:小到大排序陣列次序:ksort(陣列)

文字key編號排序:大到小排序陣列次序:krsort(陣列)

範例5-6:陣列的排序

<?php
$stu = array(1=>"Orange","Banana","Grape","Apple","Flower");

echo "<br/>//數字編號陣列的排序:<br/>";
//////////////////////////////////////////////////
echo "//目前的陣列次序<br/>";
print_r($stu);

//////////////////////////////////////////////////
echo "<br/>//小到大排序陣列,新的次序:sort(陣列)<br/>";
sort($stu);
print_r($stu);

//////////////////////////////////////////////////
echo "<br/>//大到小排序陣列,新的次序:rsort(陣列)<br/>";
rsort($stu);
print_r($stu);

echo "<br/><br/>";
//////////////////////////////////////////////////////////////////
echo "<br/>//非數字編號陣列,而是文字編號陣列的排序:<br/>";
$score = array("Tom"=>75,"Bob"=>90,"David"=>95,"Apple"=>60,"Eva"=>100);
echo "//目前的陣列次序(文字編號陣列)<br/>";
foreach($score as $i=>$v)echo "$i , $v<br/>";

//////////////////////////////////////////////////
echo "<br/>//數值排序:小到大排序陣列次序(文字編號陣列):asort(陣列)<br/>";
asort($score);
foreach($score as $i=>$v)echo "$i , $v<br/>";

//////////////////////////////////////////////////
echo "<br/>//數值排序:大到小排序陣列次序(文字編號陣列):arsort(陣列)<br/>";
arsort($score);
foreach($score as $i=>$v)echo "$i , $v<br/>";

//////////////////////////////////////////////////
echo "<br/>//文字key編號排序:小到大排序陣列次序:ksort(陣列)<br/>";
ksort($score);
foreach($score as $i=>$v)echo "$i , $v<br/>";

//////////////////////////////////////////////////
echo "<br/>//文字key編號排序:大到小排序陣列次序:krsort(陣列)<br/>";
krsort($score);
foreach($score as $i=>$v)echo "$i , $v<br/>";

?>


☎成果範例:結果範例

☎程式碼:程式碼
6

範例5-7:陣列的各種函數(3)

印出陣列的所有內容:print_r(陣列),或是var_dump(陣列

搜尋字串:用函數:$key = array_search('字串',陣列)
$key是找到的位置,找不到傳回false

新增一個元素到陣列最後:array_push(陣列,元素1,元素2...)

刪除陣列最後的一個元素:array_pop(陣列)

新增陣列元素(從陣列前面):array_unshift(陣列,元素1,元素2...)

給定每個陣列元素相同起始值:array_fill(index,number,value)

亂數取出陣列元素的數目:array_rand(陣列,亂數數目

取出陣列的前面幾個,變成一個新陣列:array_slice(陣列,數目)

印出游標位置的元素內容
方法一:pos(陣列)
echo ",

方法二:current(陣列)

移動游標到陣列最後:end(陣列)

目前陣列的游標到位置(index編號):key(陣列)

往上移動一筆):pre(陣列

目前陣列游標位置編號為:key($fruit)


目前陣列游標位置的內容為:current($fruit)

範例5-7:陣列的各種函數(3)

<?php
$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");
echo "<br/>//陣列的常用函數";
echo "////////////////////////////////////////////////////<br/>";
echo "//印出陣列的所有內容:print_r(陣列),或是var_dump(陣列) <br/>";
print_r($fruit);
echo "<br/>";
var_dump($fruit);

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//搜尋字串:用函數:\$key = array_search('字串',陣列)。\$key是找到的位置,找不到傳回false<br/>";
$txt= "Grape";
$key = array_search($txt,$fruit);
if(!$key) echo "找不到".$txt;
else echo "找到".$txt;

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//新增一個元素到陣列最後:array_push(陣列,元素1,元素2...)<br/>";
array_push($fruit,"Bala","watermelon");
print_r($fruit);

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//刪除陣列最後的一個元素:array_pop(陣列)<br/>";
array_pop($fruit);
print_r($fruit);

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//新增陣列元素(從陣列前面):array_unshift(陣列,元素1,元素2...)<br/>";
array_unshift($fruit,"PineApple","berry");
print_r($fruit);

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//給定每個陣列元素相同起始值:array_fill(index,number,value)<br/>";
$color = array();
$color = array_fill(0,5,"blue");
print_r($color);
echo $color[2]."<br/>";

echo "<br/><br/>";
echo "////取出一個亂數//////////////////////////////////////////<br/>";
echo "//亂數取出陣列元素的數目:array_rand(陣列,亂數數目)<br/>";
$key = array_rand($fruit,1);
echo $key."<br/>";
echo $fruit[$key]."<br/>";

echo "<br/><br/>";
echo "/////取出三個亂數///////////////////////////////////////////<br/>";
$key = array_rand($fruit,3);
echo $key[0]."<br/>";
echo $fruit[$key[0]]."<br/>";

echo $key[1]."<br/>";
echo $fruit[$key[1]]."<br/>";

echo $key[2]."<br/>";
echo $fruit[$key[2]]."<br/>";

echo "<br/><br/>";
echo "//////////////////////////////////////////////<br/>";
echo "//取出陣列的前面幾個,變成一個新陣列:array_slice(陣列,數目)<br/>";
echo "//array_slice(array,start,length,preserve) <br/>";
echo "fruit: ";
print_r($fruit);
echo "<br/>";
$fruit2 = array_slice($fruit,1,5,true);
print_r($fruit2);
echo "<br/>";
//反向
$fruit2 = array_slice($fruit,1,5,false);
print_r($fruit2);

echo "<br/><br/>";
echo "//////////////////////////////////////////////<br/>";
echo "//印出游標位置的元素內容,方法一:pos(陣列)<br/>";
echo "//印出游標位置的元素內容,方法二:current(陣列)<br/>";
echo "目前陣列游標位置的內容為:".pos($fruit)."<br/>";
echo "目前陣列游標位置的內容為:".current($fruit)."<br/>";

echo "<br/><br/>";
echo "//////////////////////////////////////////////<br/>";
echo "//移動游標到陣列最後:end(陣列)<br/>";
end($fruit);
echo "目前陣列游標位置的內容為:".current($fruit)."<br/>";

echo "<br/><br/>";
echo "//////////////////////////////////////////////<br/>";
echo "//目前陣列的游標到位置(index編號):key(陣列)<br/>";
echo "目前陣列游標位置編號為:".key($fruit)."<br/>";

echo "<br/><br/>";
echo "//////////////////////////////////////////////<br/>";
echo "//往上移動一筆):pre(陣列)<br/>";
prev($fruit);
echo "目前陣列游標位置編號為:".key($fruit)."<br/>";
echo "目前陣列游標位置的內容為:".current($fruit)."<br/>";
?>

☎成果範例:結果範例

☎程式碼:程式碼
8

範例5-8:將一維陣列的定給另外一個二維陣列

一維陣列的定給另外一個一維陣列:$a2 = $fruit

二維陣列的定給另外一個二維陣列:$a2 = $stu

將一維陣列的定給另外一個二維陣列:$a3[] = $fruit

範例5-8:將一維陣列的定給另外一個二維陣列

<?php
$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");
echo "<br/>//一維陣列的定給另外一個一維陣列";
echo "////////////////////////////////////////////////////<br/>";
echo "//方法一:\$a2 = 陣列 <br/>";
$a2 = $fruit;
print_r($a2);
echo "<br/>第二個元素:".$a2[2];

 

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "<br/>//二維陣列的定給另外一個二維陣列";
echo "////////////////////////////////////////////////////<br/>";
echo "//方法一:\$a2 = 陣列 <br/>";
echo "//注意:二維陣列不能放在' '內,無法顯示(一維陣列可以顯示) <br/>";
$stu = array(array("李大同","0912123456",90),
array("李大同","0912123456",90),
array("張花花","0956789741",85),
array("林美美","0985274136",60),
array("宋妮妮","0945695174",99),
array("吳盼盼","0995715325",75));
$a2 = $stu;
print_r($a2);
echo "<br/>第二個元素:".$a2[2][0];

 

echo "<br/><br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
echo "<br/>//將一維陣列的定給另外一個二維陣列";
echo "////////////////////////////////////////////////////<br/>";
echo "//方一:\$a3[](這表示a3 = 陣列<br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");
$a3[] = $fruit;
print_r($a3);
echo "<br/>第二個元素\$a3[0][2]:".$a3[0][2];
?>

☎成果範例:結果範例

☎程式碼:程式碼
8

範例5-9:二維陣列的排序

(1)二維陣列的排序(文字編號)
陣列$product
$arrtemp = array();
foreach ($product as $v) {
$arrtemp[] = $v['欄位名稱'];
}

array_multisort($arrtemp, SORT_ASC, $product);

 

(2)二維陣列的排序(數字編號)

陣列$product
$arrtemp = array();
foreach ($product as $v) {
$arrtemp[] = $v[編號];
}

array_multisort($arrtemp, SORT_ASC, $product);

範例5-9:二維陣列的排序

<?php
///範例一:二維陣列的排序(文字編號)--最佳建議///////////////
$product = array(
array('name' => 'richard', 'score' => 20),
array('name' => 'alex', 'score' => 18),
array('name' => 'jack', 'score' => 22),
);

$arrtemp = array();
foreach ($product as $v) {
$arrtemp[] = $v['score'];
}

//array_multisort($陣列,排序方式);
array_multisort($arrtemp, SORT_ASC, $product);
//array_multisort($arrtemp, SORT_DESC, $product);

foreach( $product as $ay_tmp ){
print "<br> " . implode(", ", $ay_tmp );
}

echo "<br/><br/>";
///範例二:二維陣列的排序(數字編號)--最佳建議////////////////
$product[0][0]='aa';
$product[0][1]=5000; //價格
$product[0][2]=7; //數量

$product[1][0]='bb';
$product[1][1]=9000;
$product[1][2]=6;

$product[2][0]='cc';
$product[2][1]=2000;
$product[2][2]=12;

$arrtemp = array();
foreach ($product as $v) {
$arrtemp[] = $v[1];
}

//array_multisort($陣列,排序方式);
array_multisort($arrtemp, SORT_ASC, $product);
//array_multisort($arrtemp, SORT_DESC, $product);

foreach( $product as $ay_tmp ){
print "<br> " . implode(", ", $ay_tmp );
}

echo "<br/><br/>";
///範例三:二維陣列的排序(數字編號)/////////////////////////////////
$product[0][0]='aa';
$product[0][1]=5000; //價格
$product[0][2]=7; //數量

$product[1][0]='bb';
$product[1][1]=9000;
$product[1][2]=6;

$product[2][0]='cc';
$product[2][1]=2000;
$product[2][2]=12;

foreach ($product as $i => $value) {
$arrtemp[$i] = $value[2];
}
array_multisort($arrtemp,SORT_DESC,$product);
foreach( $product as $ay_tmp ){
print "<br> " . implode(", ", $ay_tmp );
}

echo "<br/><br/>";
///範例四:二維陣列的排序(文字編號)/////////////////////////////////////////
$score = array(
0 => array( 'id' => 1, 'number' => 3 , 'english' => 80 , 'chinese' => 88 , 'math' => 90),
1 => array( 'id' => 2, 'number' => 2 , 'english' => 68 , 'chinese' => 81 , 'math' => 77),
2 => array( 'id' => 3, 'number' => 5 , 'english' => 77 , 'chinese' => 56 , 'math' => 95),
3 => array( 'id' => 4, 'number' => 4 , 'english' => 53 , 'chinese' => 88 , 'math' => 80),
4 => array( 'id' => 5, 'number' => 1 , 'english' => 92 , 'chinese' => 92 , 'math' => 70)) ;
//建立一個排序的函數
function sort_name($a, $b){
//下面的chinese是要排序的陣列索引,可以替換成你要排序的東西(例如:english或是math)
if($a['english'] == $b['english']) return 0;
return ($a['english'] < $b['english']) ? 1 : -1; //由小到大>, 由大到小<
}
//最後使用usort來做排序
// usort(要排序的陣列,使用的函數)
usort($score, 'sort_name');
//列印驗證就可以了
foreach( $score as $ay_tmp ){
print "<br> " . implode(", ", $ay_tmp );
}

?>

☎成果範例:結果範例

☎程式碼:程式碼
  如何在資料表欄位新增{"types":{"1":"蘋果","2":"柳丁","3":"葡萄"}}

如何在資料表欄位新增{"types":{"1":"蘋果","2":"柳丁","3":"葡萄"}}
(1).關鍵:這是(文字indx)陣列,外面再包個陣列(編號為types),再轉成json

_(A).分析:這個是php的(文字indx)陣列寫法:
語法:$arr['apple'] = '蘋果';
語法:$arr['555'] = '測試';
語法:$arr['415'] = '公告';
語法:$arr['870'] = '投票';

_(B).外面再包個陣列(編號為types)
$arr2 = array("types" => $arr);

_(C).然後再把陣列轉成json
$arr3 = json_encode($arr2, JSON_UNESCAPED_UNICODE);

(2).範例:include/action/editForum.php
$threadtypes_arr = json_decode($threadtypes, true);
foreach($threadtypes_arr as $i=>$list)
{
$types[$list[0]] = $list[1];
}
$threadtypes01 = array("types" => $types);
$threadtypes01 = json_encode($threadtypes01, JSON_UNESCAPED_UNICODE);

  好像從js傳遞二維陣列到php,似乎有問題,可以先轉成json再傳給php,再轉成陣列

好像從js傳遞二維陣列到php,似乎有問題,可以先轉成json再傳給php,再轉成陣列
(1).原理:
//js:把陣列轉成json
threadtypes[$i][0] = typeid;
fd.append("threadtypes", JSON.stringify(threadtypes));

//php:把json轉成陣列
$threadtypes_arr = json_decode($threadtypes, true);

(2).範例:js/manageForum.js
_(A).設定二維陣列
var threadtypes = [];
$("input[name^='threadtypesnew[options][moderators]']").each(function()
{
threadtypes[$i] = new Array();
var typeid = $(this).val();
threadtypes[$i][0] = typeid;
threadtypes[$i][1] = $("input[name='threadtypesnew[options][name]["+typeid+"]'").val();
$i++;
}
});
_(B).把二維陣列轉成json
fd.append("threadtypes", JSON.stringify(threadtypes));

_(C).ajax傳給php

_(D).editForum.php(把json轉成陣列)
$threadtypes = $_G["threadtypes"]; // 啟用主題分類
$threadtypes_arr = json_decode($threadtypes, true);

  陣列數量,陣列數目,陣列長度

陣列數量,陣列數目,陣列長度:count(陣列) $Test = Array('a'=>1,'b'=>2,'c'=>3); echo count($Test); 輸出 3

  在php,把二維陣列A裡面所有在二維陣列B的部分刪除的標準寫法

在php,把二維陣列A裡面所有在二維陣列B的部分刪除的標準寫法:
觀念1:二維陣列的比對,無法用in_Array(),必須用迴圈
觀念2:刪除這陣列但不會影響陣列序號:unset(陣列[i]);
觀念3:unset刪除陣列元素後,要把被刪除的元素key,全部重整 = array_values(陣列);
觀念4:將json轉成陣列 = json_decode(json變數, true);
觀念5:陣列轉成json = json_encode(陣列)

範例:include/action/moderator_del.php
(1).第1個陣列($uuid_arr):all_uuid轉成陣列
$uuid_arr = array_filter(explode(',', $all_uuid));

(2).第2個陣列($old_moderators_arr):先讀取目前在pre_forum_forumfield的版主json設定,並轉成陣列
$res = $db->query("select * from `pre_forum_forumfield` where `fid` = '$fid'");
$info = $res->fetch();
$old_moderators = $info["moderators"];
$old_moderators_arr = json_decode($old_moderators, true); //轉成陣列

(3).迴圈比對:判別擬刪除的版主,是否已經在$old_moderators_arr裡面了
foreach($old_moderators_arr as $i=>$m)
{
foreach($uuid_arr as $u)
{
if ($m['uuid'] == $u)
{
//刪除這個陣列
unset($old_moderators_arr[$i]);
}
}
}
// 把被刪除的元素key,全部重整
$old_moderators_arr = array_values($old_moderators_arr);
//把陣列轉成json
$moderators_json = json_encode($old_moderators_arr);

  如何查詢資料表的陣列,轉換成字串

如何查詢資料表的陣列,轉換成字串:
方法:
$info_forum = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($info_forum as $i=>$v)
{
$txt .= '<option value="'.$v["fid"].'">'.$v["name"].'</option>';
}

範例:
$res = $db->query("select * from `pre_forum_forum` where `type` = 'forum'");
$info_forum = $res->fetchAll(PDO::FETCH_ASSOC);
$option_forum = '<option value="0">請選擇</option>';
foreach($info_forum as $i=>$v)
{
$option_forum .= '<option value="'.$v["fid"].'">'.$v["name"].'</option>';
}

  一筆資料的一維陣列,與二維陣列寫法

一筆資料的一維陣列,與二維陣列寫法
(1).一維陣列(一筆)
$arr1 = array('uuid' => $uuid, 'name' => $moderator);
或是
$arr1['uuid'] = $uuid;
$arr1['name'] = $moderator;

(2).二維陣列(一筆)
$arr2[0]['uuid'] = $uuid;
$arr2[0]['name'] = $moderator;

  如何加入到陣列中的push函數,可用在一維與二維陣列

如何加入到陣列中的push函數,可用在一維與二維陣列
觀念:push可以用在一維陣列,也可以用到二維陣列

語法:
array_push(一維陣列, 字串);
array_push(二維陣列, 一維陣列);

觀念:這個是一位陣列,只是有兩個屬性uuid,name(因為只有一筆,就是一維陣列)
$arr1 = array('uuid' => $uuid, 'name' => $moderator);

  將資料表的json格式轉成陣列後是個二維陣列,如何新增一筆新的陣列

將資料表的json格式轉成陣列後是個二維陣列,如何新增一筆新的陣列
[{"uuid":"29239ce0-a2f5-4458-84e8-a6e3fd5656c1","name":"Monkey"},{"uuid":"a394fa7b-398b-44e4-9c76-2bafe6b7ded2","name":"陳志豪"}]

(1).把json轉成陣列:
$old_moderators_arr = json_decode($old_moderators, true); //轉成陣列

(2).判別新的資料name=ccw是否已經在二維陣列中
觀念:不宜用in_array(項目,陣列) ,因為in_array()只能用在一維陣列
方法:用迴圈來做判別
$found = false;
foreach($old_moderators_arr as $v)
{
if ($v['name'] == $moderator) {
$found = true;
}
}

(3).若已經有了,則不做什麼
若還沒有,把這個一維陣列,加入到二維陣列內
觀念:push可以用在一維陣列,也可以用到二維陣列
語法:
array_push(一維陣列, 字串);
array_push(二維陣列, 一維陣列);

寫法:
if($found == false)
{
$arr1 = array('uuid' => $uuid, 'name' => $moderator);
if($old_moderators)
{
//加入原有的二維陣列
array_push($old_moderators_arr, $arr1);
}
else //新增一個新的二維陣列
{
$old_moderators_arr[0]['uuid'] = $uuid;
$old_moderators_arr[0]['name'] = $moderator;
}
}

(4).把陣列轉成json
$moderators_json = json_encode($old_moderators_arr);

  如何將mySql讀取資料表的資料,轉成陣列

如何將mySql讀取資料表的資料,轉成陣列:
(1).將mySql讀取資料表的資料,轉成陣列:
方法1:一維陣列
$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetch(PDO::FETCH_ASSOC);
印出陣列:echo $info['id'];
結果:97f410c7-eca7-4af6-b1a1-2dd4a3b85f3c
注意:因為只有一維陣列,所以是$info['id']

方法2:二維陣列
$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetchAll(PDO::FETCH_ASSOC);
印出陣列:echo $info[0]['id'];
結果:97f410c7-eca7-4af6-b1a1-2dd4a3b85f3c
注意:這個二維陣列與傳統不同(不是$info['id'][0])

(2).如何將資料表二維陣列,轉成:'陣列1','陣列2','陣列3','陣列4'
方法:foreach($info as $list){..$list['欄位']..}

$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetchAll(PDO::FETCH_ASSOC);
$uuid_str = '';
foreach($info as $list)
{
$uuid_str .= "'" . $list['id'] . "',";
}
$uuid_str = substr($uuid_str, 0, -1);

  如何印出sql資料表變數二維陣列的指定某個tid的subject

如何印出sql資料表變數二維陣列的指定某個tid的subject
(1).關鍵:兩個方法都可以
_(A).傳統方法,乃是用index號碼,缺點:無法直接定位$tid
$info = $res->fetchAll(PDO::FETCH_ASSOC);
印出陣列:echo $info[0]['id'];

_(B).fdz方法,乃是使用唯一主鍵key的欄位,例如:$tid
$info = $res->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE);
印出陣列:echo $info[$tid]['id'];

(2).方法一(fdz的方法):建議的方法
重點2:$uuid = $thread_info[$tid]["authorid"]
重點1:二維陣列不用index編號,而是綁定唯一主鍵key欄位
範例:
$res = $db->query("select * from `pre_forum_thread` where `tid` in ( $tids )");
$thread_info = $res->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE);
foreach($tid_arr as $i=>$tid)
{
$uuid = $thread_info[$tid]["authorid"];
}

(3).方法二(我的方法):但是沒有fdz方法好
$res = $db->query("select * from `pre_forum_thread` where `tid` in ( $tids )");
$thread_info = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($tid_arr as $i=>$tid)
{
$uuid = $thread_info[$i]["authorid"];
}

  如何刪除mysql資料庫所有具有uuid欄位的資料表:

如何把查詢後的資料表陣列,轉換成字串:
注意:不能用join(',',陣列)
注意:陣列的取值式:$info[0]['TABLE_NAME'])
注意:陣列必須用迴圈取值:foreach($info as $i=>$v)

範例:
$res = $db->query("SELECT distinct TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name like 'uuid' and TABLE_SCHEMA = 'fdz'");
if($res->rowCount())
{
$info = $res->fetchAll(PDO::FETCH_ASSOC);
// die(json_encode(array('status' => $info[0]['TABLE_NAME'])));
$TABLE_NAME_uuid = '';
foreach($info as $i=>$v)
{
$TABLE_NAME_uuid .= "`".$v["TABLE_NAME"]."`,";
}
$sql_del_uuid = '';
foreach($info as $i=>$v
) {
$sql_del_uuid .= "delete from `".$v['TABLE_NAME']."` where `uuid` in ('$all_member_ids_new');";
}
}

  合併多個陣列成一個陣列

一,合併多個陣列成一個陣列
語法:陣列C = array("名稱A" => 陣列A, "名稱B" => 陣列B);
範例:$admin_arr = array("adminuser" => $adminuser_arr, "supmoderator" => $supmoderator_arr);

  陣列轉成json,json轉成陣列

一,陣列轉成json
語法:json格式變數 = json_encode(陣列));
範例:$admin_arr = json_encode($admin_arr);

二,將json轉成陣列或object
語法:json轉成object:物件 = json_decode(json字串));
語法:json轉成object:陣列 = json_decode(json字串, true));
$admin_arr = json_decode($svalue); //轉成object
$admin_arr = json_decode($svalue, true); //轉成陣列
輸出:
var_dump($admin_arr);
echo $admin_arr['adminuser'][0];

  比較jQuery,js VS. PHP的處理陣列函數

比較jQuery,js VS. PHP的處理陣列函數:
一,jQuery, js如何處理陣列:
(1).把字串分成陣列:字串.split(',')
var all_msgids = $('#all_msgids').val();
var msgid_arr = [];
msgid_arr = all_msgids.split(',');

(2).把陣列合併成字串:陣列.join(',')
str_msgids = msgid_arr.join(',');

(3).新增一筆加入到陣列:陣列.push(新項目)
msgid = $(this).val();
msgid_arr.push(msgid);

(4).從陣列刪除一筆項目:陣列.splice(陣列位置, 1)
var indexOfid = $.inArray(msgid,msgid_arr);
msgid_arr.splice(indexOfid, 1);

(5).查詢某個項目是否存在陣列裡面:$.inArray(項目,陣列) =傳回所在位置(0代表沒有存在)
if($.inArray(msgid,msgid_arr))
{
var indexOfid = $.inArray(msgid,msgid_arr);
msgid_arr.splice(indexOfid, 1);
}

(6).取得畫面上所有checkbox的id值:$(".網頁class名").each(function(){});
$(".msg-select").each(function()
{
msgid = $(this).val();
});

(7).如何清除陣列中的空值(,abcd-sda):
陣列 = jQuery.grep(陣列, function(n){ return (n); });
msgid_arr = jQuery.grep(msgid_arr, function(n){ return (n); });

二,PHP如何處理陣列:
(1).把字串分成陣列:
$陣列 = explode(',', 字串);
$msgids_arr = explode(',', $all_msgids);

(2).把陣列合併成字串:
字串 = join(",", 陣列);
$all_msgids = join(",", $msgids_arr);

(3).清除空陣列
array_filter(陣列);

(4).轉成陣列,並且清除空陣列
陣列 = array_filter(explode(',', 字串));
$msgids_arr = array_filter(explode(',', $all_msgids));

(5).加入一個陣列元素到最後:
array_push(陣列, 項目);
array_push($all_uuid, $info['to_uuid']);

(6).新增一個元素到陣列最後:
array_push(陣列,元素1,元素2...)

(7).刪除陣列最後的一個元素:
array_pop(陣列)

(8).新增陣列元素(從陣列前面):
array_unshift(陣列,元素1,元素2...)

(9).查詢某個項目是否存在陣列裡面:
指令:in_array(項目,陣列) = 傳回所在位置(0代表沒有存在)
if (!in_array($info['to_uuid'], $all_uuid))
{
array_push($all_uuid, $info['to_uuid']);
}

  jQuery針對陣列(數組)的過濾篩選(過濾>9,!=9..)

一,jQuery清除陣列(数组)中的空值,空陣列
(1).方法1:
var arr=["","hello","","world"," ","goodboy"];
alert($.grep(arr, function(n) {return $.trim(n).length > 0;}));

(2).方法2:(vcenter用這個方法)
// 刪除空陣列
favid_arr = jQuery.grep(favid_arr, function(n){ return (n); });

  jQuery針對陣列(數組)的過濾篩選(過濾>9,!=9..)

一,jQuery針對陣列(數組)的過濾篩選:(過濾>9,!=9..)
描述:grep可以在陣列中逐一尋找並篩選出符合條件的內容,該方法會返回一個新的陣列。
用法:jQuery.grep( array, function(elementOfArray, indexInArray) [, invert ] )
範例:
var arr = [ 1, 9, 4, 7, 3, 8, 6, 9, 1 ];
//找出數值不等於9的資料
arr = jQuery.grep(arr, function( a ) {
return a !== 9;
});
結果: 1, 4, 7, 3, 8, 6, 1

  jQuery,js查詢是否有存在陣列內的四種方法

jQuery,js查詢是否有存在陣列內的四種方法:
(1).方法一:$.inArray(vcenter用這個方法)
使用jQuery 的$.inArray。
回傳 -1,表示找不到。
回傳 2,表示在陣列中的第三個位置

var fruits = ['apple', 'orange', 'grape'];
$.inArray('pineapple', fruits); // -1
$.inArray('grape', fruits); // 2

(2).方法二:indexOf
使用原生 JavaScript 的Array.prototype.indexOf()。
回傳 -1,表示找不到。
回傳 2,表示在陣列中的第三個位置找到。

var fruits = ['apple', 'orange', 'grape'];
fruits.indexOf("mango"); // -1
fruits.indexOf("grape"); // 2

(3).方法三:filter
使用 Array.prototype.filter() 回傳符合條件的元素,得到一個新陣列。

var fruits = ['apple', 'orange', 'grape'];
var filtered = fruits.filter(function(value) {
return value === 'pineapple'
});
//找「鳳梨」(pineapple),回傳空陣列,表示找不到。
filtered // []

(4).方法四:includes
ES2016 加入了 Array.prototype.includes(),可在陣列中尋找指定元素,
回傳 true(找到) 或 false(沒找到)。注意,IE 不支援。

var fruits = ['apple', 'orange', 'banana'];
console.log(fruits.includes('orange')); // true
console.log(fruits.includes('pineapple')); // false

  檢查某個字串是否在陣列裡面,若存在則傳回1,否則傳回0

檢查某個字串是否在陣列裡面,若存在則傳回1,否則傳回0:
(1).booltxt = (inArray('abc',array01)) ? 1 : 0;

(2)範例:
$res = $db->query("select * from `pre_forum_thread` where `tid`='$tid'");
if ($res->rowCount())
{
$tid_info = $res->fetch();
$thanks_list = explode(",", $tid_info['thanks_list']);
$is_tks = (in_array($_G['SESSION']['uuid'], $thanks_list)) ? 1 : 0;
}

  如何避免update和舊值一樣會報錯

如何避免update和舊值一樣會報錯:if(!($db->exec($sql_member) !== false))
$sql_member ="update `pre_common_member` set `groupid` = '10', `groupexpiry` = 0 where `uuid` = '$authorid'";
//檢查是否錯誤:
if(!($db->exec($sql_member) !== false))
{
die(json_encode(array("status" => "member")));
}
//檢查是否正確:
if($db->exec($sql) !== false)
{
die(json_encode(array("status" => "OK")));
}

1

判別某個字串是否在某個陣列裡面:in_array(字串,陣列)

隨機取得陣列的編號:array_rand()

判別某個字串是否在某個陣列裡面:in_array(字串,陣列)
$people = array("Bill", "Steve", "Mark", "David");
if (in_array("Mark",$people, TRUE))
{
echo "匹配已找到";
}
else
{
echo "匹配未找到";
}

1

刪除陣列中的特定元素:兩種方法

隨機取得陣列的編號:array_rand()

68.PHP實現刪除陣列中的特定元素:兩種方法:unset,array_splice(但是兩個有差別)
(1)比較差別:
☎array_splice()函式刪除的話,陣列的索引值也變化了。
☎unset()函式刪除的話,陣列的索引值沒有變化。

(2)範例:
$arr = array('a','b','c','d');
array_splice($arr,1,1);
unset($arr[1]);

(3)如何把被刪除的元素key,全部重整(reset array keys after unset)
$id = array_values($id);

 

 
Chp6. 各種迴圈
練習範例 迴圈有三種:for,while,$.each() PHP的雙層迴圈,如何break 範例6-1:各種計數迴圈(for,while) 範例6-2:不用計數器的迴圈(while)
範例6-3:搜尋字串:用函數\$key=array_search() 範例6-4:搜尋字串,不用計數器的while迴圈 範例6-5:搜尋字串,用計數器的while迴圈(2) 範例6-6:搜尋字串,用函數array_search(陣列)>0找到,=false沒找到
範例6-7:複選購物總金額(php讀取checkbox的多個name陣列phone[] 範例6-8:計算各科全班平均成績(前端網頁用陣列stuname[],數學math[]) 範例6-9:計算各科全班平均成績(前端網頁用一個陣列stu[][]) 範例6-10:計算各科全班平均成績(同一網頁傳給自己,用stu[][])
  迴圈有三種:for,while,$.each() 39.迴圈有三種:for,while,$.each()
(1)$.each()是jqery,很好用
(2)$.each()的continue,break寫法指令不同(continue=return true)(break=return false)
jQuery 有個非常好用的東西叫做 $.each()
$.each 這個 function 是用來達到 for each 的功能
for 迴圈跟 while 迴圈都可以使用 continue 跟 break,但$.each() 就不行
$.each() 裡面
return true; 代表的就是 continue;
return false; 代表的就是 break;

程式碼如下:
$("[name='list[]']").each(function() {
count++;
if (2 == count) {
//break
return false;
}
this.checked = true;
//continue
return true;
});
  PHP的雙層迴圈,如何break(break 2) 43.PHP的雙層迴圈,如何break
方法:break 2;
for($i=0;$i<5;$i++)
{
for($j=0;$j<3;$j++)
{
if($i == 3) {
break 2;
}
}
1

範例6-1:各種計數迴圈

for($i=1;$i<=4;$i++){
...
}

$i=1;
while($i<=4){
.....
$i++;
}

$i=1;
do{
....
$i++;
}while($i<=4);

foreach($stu as $v){
....
}

foreach($stu as $key=>$v){
....
}

迴圈印到第3個,跳過不印,其它繼續:continue

迴圈印到第3個,就中斷印出陣列:break

範例6-1:各種計數迴圈

<?php

$stu = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//for迴圈印出陣列:<br/>";
for($i=1;$i<=4;$i++){
echo $stu[$i].", ";
}

////////////////////////////////////////////////
echo "<br/><br/>//while迴圈印出陣列:<br/>";
$i=1;
while($i<=4){
echo $stu[$i].", ";
$i++;
}

////////////////////////////////////////////////
echo "<br/><br/>//do...while迴圈印出陣列:<br/>";
$i=1;
do{
echo $stu[$i].", ";
$i++;
}while($i<=4);

////////////////////////////////////////////////
echo "<br/><br/>//迴圈印到第3個,跳過不印,其它繼續:continue<br/>";
for($i=1;$i<=4;$i++){
if($i==3) continue;
echo $stu[$i].", ";
}

////////////////////////////////////////////////
echo "<br/><br/>//迴圈印到第3個,就中斷印出陣列:break<br/>";
$i=1;
while($i<=4){
if($i==3)break;
echo $stu[$i].", ";
$i++;
}

////////////////////////////////////////////////
echo "<br/><br/>//foreach迴圈印出陣列:<br/>";
foreach($stu as $v){
echo $v.", ";
}

////////////////////////////////////////////////
echo "<br/><br/>//foreach迴圈印出陣列(也有印出編號):<br/>";
foreach($stu as $key=>$v){
echo $key."=".$v.", ";
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
2

範例6-2:不用計數器的迴圈(while)

不用計數器的while迴圈,印出陣列:while(($v=current($陣列)) != NULL){..next(陣列)...

不用計數器的while迴圈,印出陣列:while(($v=next($陣列)) != NULL){...

不用計數器的while迴圈,印出陣列:while((list($key,$v) =each($fruit))){..

這個方法最適合非數字key編號陣列,而是文字編號陣列

範例6-2:不用計數器的迴圈(while)

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//不用計數器的while迴圈,印出陣列:while(($v=current($陣列)) != NULL){..next(陣列)...<br/>";
while(($v=current($fruit)) != NULL){
echo $v." ," ;
next($fruit);
}

reset($fruit);
echo "<br/><br/>";
////////////////////////////////////////////////
echo "<br/>//不用計數器的while迴圈,印出陣列:while(($v=next($陣列)) != NULL){...<br/>";
while(($v=next($fruit)) != NULL){
echo $v." ," ;
}

reset($fruit);
echo "<br/><br/>";
////////////////////////////////////////////////
echo "<br/>//不用計數器的while迴圈,印出陣列:while((list($key,$v) =each($fruit))){...<br/>";
echo "//這個方法最適合非數字key編號陣列,而是文字編號陣列<br/>";
while((list($key,$v) =each($fruit))){
echo $key."個數值為".$v." ," ;
}

echo "<br/><br/>";
////////////////////////////////////////////////
echo "<br/>//不用計數器的while迴圈,印出陣列:while((list($key,$v) =each($fruit))){...<br/>";
echo "//這個方法最適合非數字key編號陣列,而是文字編號陣列<br/>";
$tel["李大同"] = "0912123456";
$tel["張花花"] = "0956789741";
$tel["林美美"] = "0985274136";
$tel["宋妮妮"] = "0945695174";
$tel["吳盼盼"] = "0995715325";
while(list($key,$v)=each($tel)){
echo $key."電話為".$v."<br/>" ;
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
3

範例6-3:搜尋字串,不用計數器的while迴圈,印出陣列

while(list($key,$v) = each($fruit)){
if($v==$txt){
....
break;
}
}

搜尋字串:用函數:
$key = array_search('字串',陣列)
找不到傳回false
$key是找到的位置

範例6-3:搜尋字串,不用計數器的while迴圈,印出陣列
搜尋字串:用函數$key=array_search()

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//搜尋字串,不用計數器的while迴圈,印出陣列:<br/>";
$txt="Apple2";
while(list($key,$v) = each($fruit)){
if($v==$txt){
echo "找到 $txt";
break;
}
if($key==count($fruit)){
echo "沒有找到 $txt";
}

echo "<br/><br/>";
////////////////////////////////////////////////
echo "<br/>//搜尋字串:用函數:\$key = array_search('字串',陣列)。找不到傳回false<br/>";
$txt="Apple3";
$key = array_search($txt,$fruit);
if($key==false) echo "找不到".$txt;
else echo "找到".$txt.",在第".$key."個位置";
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
4

範例6-4:搜尋字串,不用計數器的while迴圈

while(($v=current($fruit)) != NULL){
if($v==$txt){
....
break;
}
}

範例6-4:搜尋字串,不用計數器的while迴圈,印出陣列

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//搜尋字串,不用計數器的while迴圈,印出陣列:<br/>";
$txt="Apple";
while(($v=current($fruit)) != NULL){
if($v==$txt){
echo "找到 $txt";
break;
}
if(key($fruit)==count($fruit)){
echo "沒有找到 $txt";
}
next($fruit);
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
5

範例6-5:搜尋字串,用計數器的while迴圈(2)

$i=1;
while($i<=count($fruit)){
if($fruit[$i]==$txt){
...
break;
}
$i++;
}

範例6-5:搜尋字串,用計數器的while迴圈(2)

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//搜尋字串,用計數器的while迴圈,印出陣列:<br/>";
$txt="Apple2";
$i=1;
while($i<=count($fruit)){
if($fruit[$i]==$txt){
echo "找到 $txt";
break;
}
if($i==4){
echo "沒有找到 $txt";
}
$i++;
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
6

範例6-6:搜尋字串,不用迴圈,用函數:array_search(陣列)>0找到,=0沒找到

if(array_search($txt,$fruit) ==0){
...;
}

if( ($key =array_search($txt,$fruit)) !=0){
...
}

範例6-6:搜尋字串,用函數array_search(陣列)>0找到,=false沒找到

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

////////////////////////////////////////////////
echo "<br/>//搜尋字串,不用迴圈,用函數:array_search(陣列)<br/>";
$txt="Apple2";
if(array_search($txt,$fruit) ==0){
echo "沒有找到 $txt";
}else{
echo "找到 $txt";
}

echo "<br/><br/>";
////////////////////////////////////////////////
echo "<br/>//方法二,一樣方法,函數:array_search(陣列)<br/>";
$txt="Grape";
if( ($key =array_search($txt,$fruit)) !=0){
echo "找到 $txt";
}else{
echo "沒有找到 $txt";
}
?>

☎成果範例:結果範例

☎程式碼:程式碼
7

範例6-7:複選購物總金額


php讀取checkbox複選選鈕的多個name陣列名稱phone[],並把value值儲存到該變數$_POST["phone"]

但php讀取checkbox時要先判斷是否有值,isset($_POST["a1"]),若有值才進行計算,若沒判斷會有錯誤

(從html傳遞參數給php)

範例6-7:複選購物總金額(php讀取checkbox的多個name陣列phone[]

1.下載表單的html語法 ,建立exp06-7.html

2.填入參數:
 method="post"
action="exp06-7.php"

填入三個欄位的命名:
<input type="checkbox" name="phone[]" value="iphoneX手機">iphoneX手機:NT$35,000元

3.撰寫 exp06-7.php
<?php
if(isset($_POST["phone"])){
$txt="";
foreach($_POST["phone"] as $v){
$txt .= $v."<br/>";
}
echo "你所採購的物品為:<br/>$txt";

?>
☎成果範例:結果範例

☎程式碼:程式碼
8

範例6-8:計算各科全班平均成績

前端網頁用多個陣列stuname[],數學math[],英文english[]

label不是form元素,只能用<input type='hidden' name='stu[0][]' value='宋妮妮'>

範例6-8:計算各科全班平均成績(前端網頁用陣列stuname[],數學math[])

1.下載表單的html語法 ,建立exp06-8.html

2.填入參數:
 method="post"
action="exp06-8.php"

填入三個欄位的命名:
<label class="col-sm-offset-1 col-sm-3 bg-info text-center">李大同</label>
<input type="hidden" name="stuname[]" value="李大同">
<label class="col-sm-3 bg-danger text-center">
<input type="text" value="85" size="6" maxlength="3 class="form-control" name="math[]">
</label>
<label class="col-sm-3 bg-success text-center">
<input type="text" value="65" size="6" maxlength="3 class="form-control" name="english[]">

3.撰寫 exp06-8.php
<?php
echo "//label不是form元素,只能用<input type='hidden' name='stuname[]' value='宋妮妮'><br/>";
$txt="";
$stuname = $_POST["stuname"];
foreach($stuname as $v){
$txt .= $v.",";
}
echo "學生姓名:$txt <br/>";

/////////////////////////////////
$txt="";
$math = $_POST["math"];
foreach($math as $v){
$txt .= $v.",";
}
echo "數學成績:$txt <br/>";

/////////////////////////////////
$txt="";
$english = $_POST["english"];
foreach($english as $v){
$txt .= $v.",";
}
echo "英文成績:$txt <br/>";

/////////////////////////////////
echo "數學平均成績:".array_sum($math)/count($math)."<br/>";
/////////////////////////////////
echo "英文平均成績:".array_sum($english)/count($english)."<br/>";


?>
☎成果範例:結果範例

☎程式碼:程式碼
9

範例6-9:計算各科全班平均成績

前端網頁用一個陣列stu[][],但是同一類,例如姓名stu[0][],數學stu[1][]

label不是form元素,只能用<input type='hidden' name='stu[0][]' value='宋妮妮'>

範例6-9:計算各科全班平均成績(前端網頁用一個陣列stu[][])

1.下載表單的html語法 ,建立exp06-9.html

2.填入參數:
 method="post"
action="exp06-9.php"

填入三個欄位的命名:
<label class="col-sm-offset-1 col-sm-3 bg-info text-center">李大同</label>
<input type="hidden" name="stu[0][]" value="李大同">
<label class="col-sm-3 bg-danger text-center">
<input type="text" value="85" size="6" maxlength="3" class="form-control" name="stu[1][]">
</label>
<label class="col-sm-3 bg-success text-center">
<input type="text" value="65" size="6" maxlength="3" class="form-control" name="stu[2][]">

3.撰寫 exp06-9.php
$txt="";
$stu = $_POST["stu"];
print_r($stu);

echo "<br/><br/>";
/////////////////////////////////
list($stuname,$math,$english) = $stu;

//////////////////////////
echo "//從二維陣列,拆解成幾個一維陣列,其中的stuname陣列<br/>";
while(list($key,$v)=each($stuname)){
echo $v.",";

}
echo "<br/><br/>";
///////////////////////////////////
echo "//用兩個迴圈,印出二維陣列<br/>";
foreach($stu as $v1){
foreach($v1 as $v2){
$txt .= $v2.",";
}
$txt .= "<br/>";
}
echo "學生姓名:<br/>$txt <br/>";

/////////////////////////////////
/////////////////////////////////
echo "//印出平均成績:<br/>";
echo "數學平均成績:".array_sum($math)/count($math)."<br/>";

/////////////////////////////////
echo "英文平均成績:".array_sum($english)/count($english)."<br/>";


☎成果範例:結果範例

☎程式碼:程式碼
 

 
Chp7. 日期時間
練習範例 7-1兩種日期時間宣告法 7-2設定某個虛擬日期時間 mktime(時,分,秒,月,日,年)(while)
  最簡單顯示日期的方法

(1).最簡單顯示日期的方法:2018-09-15
$dateline = date("Y-m-d");

  unix 時間戳

(1).unix時間戳
$timestamp = time();

(2).把文字格式轉成時間戳
$timestamp = strtotime('22-09-2008');
$timestamp = strtotime("now");

(3).把時間戳轉成文字格式:2018-07-15
date("Y-m-d ", time());

1

兩種日期時間

(1)傳統:date('Y-m-d')
date('西元Y年n月j日 G時i分s秒')

date_default_timezone_set('Asia/Taipei')
date("Y年n月j日 G時i分s秒",time())

date('Y年n月j日 G時i分s秒time()+7*24*60*60)

(2)新的物件變數DateTime 類別
現在時間的物件導向變數,二種寫法
方法一:
date_default_timezone_set('Asia/Taipei');
$date = new DateTime();


方法二
$date = new DateTime('now',new DateTimeZone('Asia/Taipei'));


後天的物件導向變數:$date = new DateTime('+2 day')
設定某一天的物件導向變數:$date = new DateTime('2017-05-11')

輸出format()
輸出現在時間的物件導向變數:$date -> format('Y-m-d H:i:s PM')
取得Unix時間戳:$date->getTimestamp()

日期時間的比較 diff()
$interval = $date1->diff($date2)
$interval->format('%r%a 天 %h 時 %i 分 %s 秒') 

時區設定:DateTimeZone class //////////////////////
方法一:
台灣時區:$timezone = new DateTimeZone('Asia/Taipei');
$date = new DateTime('now', $timezone);
方法二:
date = new DateTime();
$timezone = new DateTimeZone('Asia/Taipei');
$date->setTimezone($timezone);

 

時間間隔修改DateTime內容
方法一:$interval = 2週 5小時
$interval = new DateInterval('P2WT5H');

方法二:
$interval = DateInterval::createFromDateString('2 weeks + 5 hours')

<?php

echo "//日期時間要先設定時區,方法一: date_default_timezone_set('Asia/Taipei'),日本是Asia/Tokyo";
echo "<br/>//日期時間要先設定時區,方法二: ini_set(\"date.timezone\",\"Asia\Taipei\"),俄羅斯是Europe/Moscow";
date_default_timezone_set('Asia/Taipei');
//date_default_timezone_set('Asia/Tokyo');
//ini_set("date.timezone","Europe/Moscow");
echo "<br/>//現在的日期時間 date(”Y-m-d“)";
echo "<br/>現在的日期(有前導零 Y-m-d):".date('Y-m-d');
echo "<br/>現在的日期(沒有前導零 Y-n-j):".date('Y-n-j');
echo "<br/>現在的時間(12小時制,有前導零 h-i-s):".date('h-i-s');
echo "<br/>現在的時間(24小時制,有前導零 H-i-s):".date('H-i-s');
echo "<br/>現在的時間(24小時制,沒有前導零 G-i-s):".date('G-i-s');
echo "<br/>現在的時間(12小時制,註明am/pm,有前導零 h-i-s a):".date('h-i-s a');
echo "<br/>現在的時間(24小時制,註明AM/PM,有前導零 H-i-s A):".date('H-i-s A');
echo "<br/>現在的時間(24小時制,註明AM/PM,沒有前導零 G-i-s A):".date('G-i-s A');
echo "<br/>目前時區: T:".date('T');

///////////////////////////////////////////////////
echo "<br/>現在日期(自訂格式輸出 Y-n-j):".date('西元Y年,n月,j日');
echo "<br/>現在日期時間(自訂格式輸出 Y-n-j G-i-s):".date('西元Y年n月j日 G時i分s秒');

///////////////////////////////////////////////////
echo "<br/>現在星期幾(英文全名:l=小寫L):".date('l');
echo "<br/>現在星期幾(三字英文:D):".date('D');
echo "<br/>現在星期幾(數字:w):".date('w');

///////////////////////////////////////////////////
echo "<br/>現在是今年第幾週(數字:W):".date('W');
echo "<br/>現在是今年第幾天(數字:z:0~365,所以若算當天,還要加1):".(date('z')+1);

///////////////////////////////////////////////////
echo "<br/>本月天數(數字:t):".date('t');
echo "<br/>本年是否有閏月(數字:L,0=false,1=true):".date('L');

///////////////////////////////////////////////////
echo "//time()):計算西元1970年1月1日00:00:00到現在的時間,以秒做為預設單位<br/>";
echo "//PHP time 函數的功能與 mktime 有點類似,但卻更簡單,不用設置參數就可以直接使用,可以搭配 date 函數一起使用,用來計算一些時間差)<br/>";
echo "<br/>現在日期時間(time()):".time();
echo "<br/>格式化輸出現在的日期時間(date(\"Y年n月j日 G時i分s秒\",time())):".date("Y年n月j日 G時i分s秒",time());

///52////////////////////////////////////////////////
echo "//time()+秒數,就可以搭配date()來顯示2個小時後,或1天後,或7天後的日期<br/>";
echo "//顯示2個小時後的日期時間:date('西元Y年n月j日 G時i分s秒',time()+2*60*60) <br/>";
echo "顯示2個小時後的日期時間:".date('Y年n月j日 G時i分s秒',time()+2*60*60);
echo "<br/>顯示1天後的日期時間:".date('Y年n月j日 G時i分s秒',time()+1*24*60*60);
echo "<br/>顯示7天後的的日期時間:".date('Y年n月j日 G時i分s秒',time()+7*24*60*60);

///////////////////////////////////////////////////
echo "//strtotime() 函數將任何英文文本的日期時間描述解析為Unix 時間戳 <br/>";
echo strtotime('now')."<br/>"; ;
echo strtotime("5 September 2016")."<br/>";

/////////////////////////////////////////////////
echo "//將英文日期寫法,轉換成日期時間格式date(): date('Y-m-d h:i:sa', strtotime('10:38pm April 15 2015'))<br/>";
$d=strtotime("10:38pm April 15 2015");
echo "設定的日期是 " . date("Y-m-d h:i:sa", $d);

/////////////////////////////////////////////////
echo "//明天tomorrow: date('Y-m-d h:i:sa', strtotime('tomorrow'))<br/>";
echo "//下星期六next Saturday: date('Y-m-d h:i:sa', strtotime('next Saturday'))<br/>";
echo "//三個月後+3 Months: date('Y-m-d h:i:sa', strtotime('+3 Months'))<br/>";
$d=strtotime("tomorrow");
echo "明天是:".date("Y-m-d h:i:sa", $d) . "<br>";

$d=strtotime("next Saturday");
echo "下星期六是:".date("Y-m-d h:i:sa", $d) . "<br>";

$d=strtotime("+3 Months");
echo "三個月後是:".date("Y-m-d h:i:sa", $d) . "<br>";

echo "<br/><br/>";
/////////////////////////////////////////////////
echo "//時間間隔,date_diff(時間1,時間2)<br/>";
$date1=date_create("1984-01-28");
$date2=date_create("1980-10-15");
$diff=date_diff($date1,$date2);

// %a 输出总天数
echo $diff->format("总天数:%a.");

echo "/////////////////////////////////////////////////<br>";
echo "//以上都是舊式的日期時間函數,太多不好使用的個別函數<br>";
echo "//新的物件變數DateTime 類別:封裝了老式日期函數所有功能,甚至更多,並且使得時區轉換更加容易<br>";
echo "///////設定現在,某天 = new DateTime()//////////////////////////////////////////<br>";
echo "//現在時間的物件導向變數:\$date = new DateTime()<br>";
echo "//後天的物件導向變數:\$date = new DateTime('+2 day')<br>";
echo "//設定某一天的物件導向變數:\$date = new DateTime('2017-05-11')<br>";

echo "/////輸出 format()////////////////////////////////////////////<br>";
echo "//輸出現在時間的物件導向變數:\$date -> format('Y-m-d H:i:s PM')<br>";
echo "//取得Unix時間戳:\$date->getTimestamp()<br>";

echo "/////日期時間的比較 diff() ////////////////////////////////////////////<br>";
echo "//日期時間的比較 diff():\$interval = \$date1->diff(\$date2)<br>";
echo "\$interval->format('%r%a 天 %h 時 %i 分 %s 秒') <br>";
echo "format格式:DateInterval::format(format);<br>";
echo "• % - Literal %<br>";
echo "• Y - 年,至少 2 個數字,帶前置字元為零(例如 03)<br>";
echo "• y - 年(例如 3)<br>";
echo "• M - 月,帶前置字元為零(例如 06)<br>";
echo "• m - 月(例如 6)<br>";
echo "• D - 日,帶前置字元為零(例如 09)<br>";
echo "• d - 日(例如 9)<br>";
echo "• a - 由 date_diff() 得出的兩個日期間隔的總天數<br>";
echo "• H - 小時,帶前置字元為零(例如 08、23)<br>";
echo "• h - 小時(例如 8、23)<br>";
echo "• I - 分,帶前置字元為零(例如 08、23)<br>";
echo "• i - 分(例如 8、23)<br>";
echo "• S - 秒,帶前置字元為零(例如 08、23)<br>";
echo "• s - 秒(例如 8、23)<br>";
echo "• R - 當負數時為符號 "-",當正數時為符號 "+"<br>";
echo "• r - 當負數時為符號 "-",當正數時為空<br>";
echo "注釋:每個格式字串必須以 % 符號作為首碼!<br>";

echo "///////時區 new DateTimeZone()////////////////////////////////////////////<br>";
echo "//時區設定:DateTimeZone class //////////////////////<br>";
echo "//方法一:\$timezone = new DateTimeZone('America/New_York');<br>";
echo "\$date = new DateTime('now', \$timezone);<br>";
echo "台灣時區:\$timezone = new DateTimeZone('Asia/Taipei');<br>";

echo "//方法二:date = new DateTime();<br>";
echo "\$timezone = new DateTimeZone('America/New_York');<br>";
echo "\$date->setTimezone(\$timezone);<br>";

echo "///////時間間隔修改DateTime內容////////////////////////////////////////////<br>";
echo "//DateInterval class<br>";
echo "//方法一:\$interval = new DateInterval('P2WT5H') 2週 5小時<br>";
echo "\$interval = new DateInterval('P2WT5H');<br>";
echo "//方法二:\$interval = DateInterval::createFromDateString('2 weeks + 5 hours');<br>";
echo "\$interval = DateInterval::createFromDateString('2 weeks + 5 hours')<br>";

/////////////////////////////////////////////////////////////////////////////////
//現在時間,兩種寫法
echo "//物件時間,方法一:<br/>";
date_default_timezone_set('Asia/Taipei');
$date = new DateTime();

echo "今天是:".$date->format('Y-m-d H:i:s')."<br>";

echo "//物件時間,方法二:<br/>";
$date = new DateTime('now',new DateTimeZone('Asia/Taipei'));
echo "今天是:".$date->format('Y-m-d H:i:s')."<br>";

$date = new DateTime('yesterday');
echo "昨天是:".$date->format('Y年n月j日 G時i分s秒')."<br>";

$date = new DateTime('2017-05-17 18:00:00');
echo "印出mktime是:".$date->format('Y-m-d H:i:s')."<br>";

$date = new DateTime('2017/05/17 09:15 PM');
echo "印出mktime是:".$date->format('Y-m-d H:i:s')."<br>";

// +- day, week, month, year
$date = new DateTime('+2 day');
echo "印出+2day是:".$date->format('Y-m-d H:i:s')."<br>";

// 1495088399
echo "取得Unix時間戳:".$date->getTimestamp()."<br>";

//日期時間的比較 diff():
$date1 = new DateTime('2017-05-11 12:15:15');
$date2 = new DateTime('2017-05-17 10:10:10');
$interval = $date1->diff($date2);
echo "這兩個時間差別:".$interval->format('%r%a 天 %h 時 %i 分 %s 秒')."<br>";

//日期時間的比較 diff():
$date1 = new DateTime();
$datt2 = new DateTime('+3days +2 hours +15minutes');
$interval = $date1->diff($datt2);
echo "這兩個時間差別:".$interval->format('%r%a天 %h時 %i分')."<br>";

//////////////////////////////////////////////////////////////////////

// 建立 2週 5小時
$interval = new DateInterval('P2WT5H');

// 建立 2週 5小時
$interval = DateInterval::createFromDateString('2 weeks + 5 hours');

$date = new DateTime();

/////////////////////////////////////////////
// 建立 2週 5小時
$interval = new DateInterval('P2WT5H');
$date->add($interval);
echo "今天再過2週 5小時:".$date->format('Y-m-d H:i:s');

?>

4.結果範例

1

(1)傳統日期時間

設定某個虛擬日期時間:
mktime(時,分,秒,月,日,年)
注意:沒有前導零

例如 mktime(15,25,50,5,5,2018)
注意:沒有前導零

查詢虛擬日期的資訊(星期幾,前天,上個月):

例如昨天日期:date('Y-n-j',mktime(15,25,50,5,4,2018)

 


<?php

//echo "//日期時間要先設定時區,方法一: date_default_timezone_set('Asia/Taipei'),日本是Asia/Tokyo";
//echo "<br/>//日期時間要先設定時區,方法二: ini_set(\"date.timezone\",\"Asia\Taipei\"),俄羅斯是Europe/Moscow";
date_default_timezone_set('Asia/Taipei');
//date_default_timezone_set('Asia/Tokyo');
//ini_set("date.timezone","Europe/Moscow");

///////////////////////////////////////////////////
echo "<br/>//設定某個虛擬日期時間 mktime(時,分,秒,月,日,年),注意:沒有前導零";
echo "<br/>//例如 mktime(15,25,50,5,5,2018),注意:沒有前導零";
echo "<br/>//查詢虛擬日期的資訊(星期幾,前天,上個月):例如昨天日期:date('Y-n-j',mktime(15,25,50,5,4,2018)";

///////////////////////////////////////////////////
$day1 = mktime(0,0,0,10,10,2010);
echo $day1;
echo "<br/>請問2018/05/15是星期幾(英文全名:1):".date('l',$day1);

///////////////////////////////////////////////////
$day2= mktime(0,0,0,date('n'),date('j')+2,date('Y'));
echo "<br/>請顯示後天的日期(Y-n-j):".date('Y-n-j',$day2);

$day2= mktime(0,0,0,date('n')-1,date('j'),date('Y'));
echo "<br/>請顯示上個月同一天的日期(Y-n-j),若落在上個月會自動改變月份:".date('Y-n-j',$day2);

$day2= mktime(0,0,0,date('n'),date('j')-10,date('Y'));
echo "<br/>請問10天前星期幾(英文全名l),若落在上個月會自動改變月份:".date('Y-n-j',$day2);

$day2= mktime(0,0,0,date('n'),date('j'),date('Y')+1);
echo "<br/>請問明年的今天是星期幾(英文全名l):".date('l',$day2);

?>

4.結果範例

 

 
Chp8. 自訂函數function()
練習範例 8-1自訂專門比較大小的函數 8-2函數參數的預設值 8-3自訂計算梯形面積的函數 8-4自訂印出陣列所有內容的函數
8-5自訂計算分數的函數  

 
1

自訂函數function()
function bigsmall($a,$b)

 

範例結果

 

範例8-1:自訂專門比較大小的函數

<?php
echo "//自訂函數function()";
echo "<br/>//自訂專門比較大小的函數 function bigsmall()<br/>";

function bigsmall($a,$b){
if($a>$b)echo "$a 大於 $b <br/>";
if($a<$b)echo "$a 小於 $b <br/>";
if($a==$b)echo "$a 等於 $b <br/>";
}

bigsmall(5,6);

bigsmall(500,500);

bigsmall(500,50);

?>

☎成果範例:結果範例

☎程式碼:程式碼

2 範例8-2:函數參數的預設值

自訂函數function()
函數參數的預設值
function bigsmall($a=7,$b=6)

 

範例結果

<?php
echo "//自訂函數function()";
echo "<br/>//自訂專門比較大小的函數 function bigsmall($a=7,$b=6)<br/>";

function bigsmall($a=7,$b=6){
if($a>$b)echo "$a 大於 $b <br/>";
if($a<$b)echo "$a 小於 $b <br/>";
if($a==$b)echo "$a 等於 $b <br/>";
}

bigsmall();

bigsmall(500,50);

?>

☎成果範例:結果範例

☎程式碼:程式碼

3

自訂傳回數值的函數
return $r;

 

範例結果

範例8-3:自訂計算梯形面積的函數

<?php
echo "//自訂傳回數值的函數function()";
echo "<br/>//自訂計算梯形面積的函數 function area($a,$b){....return $a;)<br/>";

function area($a,$b,$c){
$r =($a+$b)*$c/2;
return $r;
}

echo "<br/>面積為".area(2,2,2);

echo "<br/>面積為".area(10,10,10);

?>

☎成果範例:結果範例

☎程式碼:程式碼

4

自訂函數,傳遞陣列function()

show(#array)

 

範例結果

範例8-4:自訂印出陣列所有內容的函數

<?php
echo "//自訂函數,傳遞陣列function()";
echo "<br/>//自訂印出陣列所有內容的函數 function show(#array)<br/>";

function show($a){
echo "本陣列所有內容:";
while(list($key,$v) = each($a)){
echo $v.",";
}
echo "<br/><br/>";
}

$stu = array(1=>"李大同","張花花","林美美","宋妮妮","吳盼盼");
show($stu);

 

$b = array("Did you lose weight intentionally?妳有故意在減肥嗎?",
"I've got missed calls. 我有未接來電耶~",
"I wonder which shoes to put on. 該穿那雙鞋呢?",
"I don't have a good appetite these days. 最近都沒什麼胃口",
"Don't even think about it~ 想都別想啦!!");
show($b);

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");
show($fruit);

?>

☎成果範例:結果範例

☎程式碼:程式碼

5

函數function()若傳回數值變數都有變化了,可傳回陣列,之後再拆解

拆解方法:list($a1,$a2,$a3,$a4) = show($stu1)

function show($a)

list($a1,$a2,$a3,$a4) = show($stu1)

 

範例結果

範例8-5:自訂計算分數的函數

<?php
echo "//函數function()若傳回數值變數都有變化了,可傳回陣列,之後再拆解,";
echo "<br/>//拆解方法:list($a1,$a2,$a3,$a4) = show($stu1);";
echo "<br/>//自訂計算分數的函數 function show($array){....return $score;)<br/>";

function show($a){
$s = array_sum($a)/count($a);
$score = array($a["math"],$a["english"],$a["computer"],$s);
return $score;
}

$stu1 =array("math"=>90,"english"=>80,"computer"=>75);
list($a1,$a2,$a3,$a4) = show($stu1);
echo "<br/>第一位學生的平均分數為".$a4;
echo "<br/>第一位學生的各科分數為 $a1 , $a2 , $a3 ";

echo "<br/><br/>";
//////////////////////////////////////////////////////////
$stu2 =array("math"=>60,"english"=>90,"computer"=>100);
list($a1,$a2,$a3,$a4) = show($stu2);
echo "<br/>第二位學生的平均分數為".$a4;
echo "<br/>第二位學生的各科分數為 $a1 , $a2 , $a3 ";

?>

☎成果範例:結果範例

☎程式碼:程式碼

 

 
Chp9. 字串相關函數
練習範例 9-1字串相關與字串搜尋 9-2子字串相關函數(取出子字串,計算出現次數,取代,反轉,分割成陣列) 9-3比較兩個字串 9-4網頁字串相關函數(刪除網頁標籤,加上反斜線,刪除字串的反斜線)
練習範例 9-5設定輸出文字與數字的格式: sprintf(字串%u...%s....,變數1,變數2)(字串%s,科學計數%e,浮點數%f) 9-6輸出html特殊字元(<(&lt;,>(&gt;) 9-7比對輸入的格式是否正確(以 preg_match() 結合規則運算式(Regular Expression) 9-8表單驗證(檢查最少4個英文,驗證密碼,電子信箱格式,住家電話格式,身份證格式)
9-9把一些預定義的字符轉換為 HTML 實體(htmlentities,htmlspecialchars      
  注意:在搜尋比對字串時,若是bbcode的搜尋比對,會出現錯誤,無法比對

注意:在搜尋比對字串時,若是bbcode的搜尋比對,會出現錯誤,無法比對
原因:因為有[]符號,就會無法比對
例如:viewthread.php
$message = "附件類型17附件類型17附件類型17[attachment]7468feca-f0b2-4cf9-bc00-96804e970cfe[/attachment]"
(1).錯誤寫法:
$pos = stripos($message, "[attachment]");
if ($pos === false)
{
找不到;
}

(2).正確寫法:移除[]符號,才能找的到
$pos = stripos($message, "attachment");
if ($pos === false)
{
找不到;
}

  比較兩種PHP vs js 取代字串的方法

比較兩種PHP vs js 取代字串的方法:
一,PHP的取代函數:substr_replace()
語法:substr_replace( $string , $replacement , $start , $length )
範例:
$MyString = 'ABCDEF';
 // 用 ZZZ 取代原始字串
 echo substr_replace($MyString, 'ZZZ', 0).'<br>';

 // 將 ZZZ 插入到原始字串開頭處
 echo substr_replace($MyString, 'ZZZ', 0, 0).'<br>';

 // 用 ZZZ 取代原始字串的字母 E
 echo substr_replace($MyString, 'ZZZ', 3, -1).'<br>';

 // 將原始字串的字母 D 用空值取代
 echo substr_replace($MyString, '', 3, 1);

二,[PHP]正規表示式取代字串:preg_replace()
(1).濾掉 \n\r\t
$value = preg_replace("/[\n\r\t]/",'',$value);

(2).濾掉 <style ..... /style>
$body = preg_replace("/\<style(.*?)style\>/",'',$body);

(3).取代字串中各種單字(用陣列)
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);

三,javascript字串的取代(例如:將bbcode的微笑表情轉成img)
語法:新字串 = 舊字串.replace('字根','新替代字');
(1).例如1:把字串msg_h裡面的所有:),都取代成img
msg_h = msg_h.replace(':)', '<img src="/images/emoticons/smile.gif" alt="微笑" />');

(2).但是若要取代的舊字根,有單引號,該如何做
方法:只能用正則表示式(regular expression)
語法:/'/g
應用:/_/g,
注意:剛開始不懂為什麼替換單引號需要/g,原來/g是正則中的匹配全部(global)

(3).範例:单引号替换成雙引號:
新字串 = 舊字串.replace(/'/g, '"');

(4).範例:雙引号替换成单引號:(雙引號:\")
新字串 = 舊字串.replace(/\"/g,"'");

(5).範例:半型字括弧,轉成全型字括弧
新字串 = 舊字串.replace(/</g,"《");
str=str.replace(/</g,"《").replace(/>/g,"》");

  nl2br() 函數

nl2br() 函數在字符串中的每個新行(\n) 之前插入HTML 換行符(<br>)。
(1).語法:nl2br(string)

(2).PHP例子
echo nl2br("One line.\nAnother line.") ;

(3).輸出:
One line.
Another line.

(4).HTML 代碼:
One line.<br>
Another line.

  php取代函數:str_replace()

php取代函數:str_replace()
功能:str_replace() 函數使用一個字符串替換字符串中的另一些字符
語法:str_replace(find,replace,string,count)
範例:
str_replace("world","John","Hello world!")

  將aaa,bbb,ccc分割成陣列(javascript寫法)

將tags字串,分割成arr陣列:arr = tags.split(",")

將新的字串label加入到arr資料裡面:arr.push(label)

將最後的陣列,串聯成新字串:arr.join()

//將tags字串,分割成arr陣列:arr = tags.split(",")
var tags = "apple,bala,bananna";
var arr = tags.split(",");

//將新的字串label加入到arr資料裡面:arr.push(label)
var label="grape";
arr = jQuery.grep(arr, function(n){ return (n); });
var index = $.inArray(label, arr);
if(index == -1)
{
arr.push(label);
}

//將最後的陣列,串聯成新字串:arr.join()
text = arr.join() + ",";
$(target_id).val(text);

  將aaa,bbb,ccc分割成陣列(PHP寫法):explode

(1).字串轉成陣列:explode()
$tags = "apple,bala,bananna";
$arr_tags = explode(",",$tags);
foreach($arr_tags as $i=>$v){
$sql .="(".$v.")";
}

(2).字串轉成陣列:explode()+array_filter()過濾陣列的空白值
$pid_arr = array_filter(explode(",", $pid));

  如何將陣列串聯成字串:join

如何將$arr_tags陣列串聯成字串
公式:join("連接字",陣列)
$str_tags = join(",",$arr_tags)

  把字串最後一個','刪除的兩種方法

把字串最後一個','刪除的兩種方法
(1).最快的方法:
$tags = "apple,bala,bananna,";
$tags = substr($tags, 0, -1);

(2)較傻的方法
$tags = "apple,bala,bananna,";
$tags = substr($tags,0,strlen($tags)-1);

  取得字串的長度

取得字串的長度
公式:strlen(字串)
$len = strlen($pre_tags)

  取得第一個字元:substr($str,strlen($str)-1,1)

一,字串存取目標:
刪除第一個字元
刪除最後一個字元
取得第一個字元
取得最後一個字元

二,使用函數
substr(原字串,從第幾個開始取,取到第幾個結束)
strlen() 取得字串長度

三,寫法
(1).刪除第一個字元:substr($str,1,strlen($str))
(2).刪除最後一個字元:substr($str,0,strlen($str)-1)
(3).取得第一個字元:substr($str,0,1)
(4).取得最後一個字元:substr($str,strlen($str)-1,1)

  Heredoc 定界符 的用法 21.Heredoc 定界符 的用法(連續三個小於符號 "<<<" )
功用:heredoc常用在输出包含大量HTML语法d文档的时候。
分類:函数outputhtml()要输出HTML的主页。可以有两种写法。
很明显第二种写法比较简单和易于阅读。

第一种
function outputhtml(){
echo "<html>";
echo "<head><title>主页</title></head>";
echo "<body>主页内容</body>";
echo "</html>";
}

第二种
function outputhtml()
{
echo <<<EOT
<html>
<head><title>主页</title></head>
<body>主页内容</body>
</html>
EOT;
}

23.注意heredoc的常見錯誤:
(1)EOF;必須緊接在開頭(不可有空白)

24.在heredoc 裡面不可以有迴圈,否則會錯誤

25.觀念:php的迴圈及計算指令放在前面計算,最後就是輸出heredoc,一次組裝
範例:
//在使用heredoc之前,要先把迴圈的內容裝在另外一個變數,做完後,再一次性的組合(先異地建模,再組裝)//
$str="";
foreach($rowall as $i=>$v){
$str .= "<tr><td>{$rowall[$i]['書籍編號']}</td><td>{$rowall[$i]['書籍名稱']}</td><td>{$rowall[$i]['價格']}</td></tr>";
}

$content = <<<EOF
<table class="table table-striped table-bordered table-condensed">
<thead class="thead-dark"><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead>
<tbody>
EOF;

$content .= <<<EOF
$str
EOF;


$content .= <<<EOF
</tbody>
</table>
EOF;


26.注意:heredoc裡面,不可以是單引號在最外圍,必須是雙引號在最外圍
錯誤範例:
$str ="";
$str .= '<span class="demo-item-price">
...
{$rowall[1]["product_price"]}元
</span>';

$content = <<<EOF
$str
EOF;


//正確範例
$str ="";
$str .= "<span class='demo-item-price'>
...
{$rowall[1]['product_price']}元
</span>";
$content = <<<EOF
$str
EOF;


27.最後發現:其實在php寫標籤,不需要用到hreedoc($content = <<<EOF)
其實只要用到$str = "<div id='a1'....";
用字串即可,可以一組""但是分很多行
(發現,根本就不需要heredoc)(用$content = <<<EOF,不好用,經常發生錯誤)
範例:
$str="";
foreach($rowall as $i=>$v){
$str .="<div class='review-item' id='item_{$rowall[$i]['product_id']}'>
<div class='review-cart'>
<a href='javascript:void(0)' onclick='remove_item(\"{$rowall[$i]['product_id']}\",\"{$rowall[$i]['product_price']}\")'>
<i id='far_{$rowall[$i]['product_id']}' class='fas fa-times'></i>
</a>
</div>
}
  heredoc的好處:可以在javascript裡面可以直接讀取php的變數 (1).heredoc的好處
可以在javascript裡面可以直接讀取php的變數
(傳統的php與javascript無法溝通變數)

範例:在javascript裡面顯示php變數
$res = $db->query("select * from `pre_common_member` where `uuid` = '$uuid'");
$info = $res->fetch();
$username = $info["username"];

$content = <<<EOF
<div class="modal-dialog">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-4">
主題查看
</div>
<div class="col-md-8 col-sm-8 col-xs-8">
<label class="radio-inline"><input type="radio" name="allowviewnew" checked><font color="limegreen">默認</font></label>
<label class="radio-inline"><input type="radio" name="allowviewnew">允許</label>
<label class="radio-inline"><input type="radio" name="allowviewnew">禁止</label>
</div>
</div>
</div>

<script language="javascript">
$( "#tid" ).change(function() {
alert( "$username" );
});
</script>
EOF;
  heredoc缺點:無法使用陣列變數 heredoc缺點:無法使用陣列變數:
範例:
$a[0] = "Did you lose weight intentionally?妳有故意在減肥嗎?";
$a[1] = "I've got missed calls. 我有未接來電耶~";
$a[2] = "I wonder which shoes to put on. 該穿那雙鞋呢?";
$a[3] = "I don't have a good appetite these days. 最近都沒什麼胃口";

以下這個寫法是錯誤的:
<script language="javascript">
$( "#tid" ).change(function() {
} $( "#tid option:selected" ).each(function() {
alert($a[1]);
});
});
</script>
  heredoc中間要加上php變數的寫法 heredoc中間要加上php變數的寫法:
觀念:有兩種架構,其插入變數的寫法不同
(1).單一heredoc架構,沒有被拆開上下兩段
例如:變數
$fidname = '閒聊哈拉話題區';
方法:直接放置到heredoc裡面,不需要再串接
$content = << <div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">編輯版主 - $fidname</h4>
</div>
<div class="modal-body">
<div class="row mod-list">
<div class="col-md-1 col-sm-1 col-xs-1 px0"> </div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center px0">顯示順序</div>
</div>
EOF;


(2).被拆開成上下的heredoc,在中間的php迴圈生成標籤區域,若要插入變數
例如:變數:$list["uuid"]
若要在中間php迴圈插入變數,必須要用串接
方法:<input type="checkbox" id="'.$list["uuid"].'">

範例:
$content = <<<EOF
<div class="modal-dialog">
....
EOF;

foreach($info_moderator as $key => $list)
{
<input type="checkbox" name="delete[]" id="'.$list["uuid"].'">
}

$content .= <<<EOF
<div class="row mod-list">
</div>
EOF;
  heredoc應用:彈出modal視窗,互動操作後讀取資料表再傳回,顯示在modal畫面上 heredoc應用:彈出modal:
如何在彈出modal視窗,互動操作後讀取資料表再傳回,顯示在modal畫面上
方法:必須用ajax才能夠完成
(1).include/modal/boardset.php
$content = <<<EOF
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title" id='h4'>用戶:$username</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-4" style="line-height: 34px;">
選擇版塊
</div>
<div class="col-md-8 col-sm-8 col-xs-8 text-center">
<select class="form-control" name="tid" id="tid">
$option_forum
</select>
</div>
</div>
</div>

<script language="javascript">
$( "#tid" ).change(function()
{
$("#tid option:selected" ).each(function()
{
$.ajax({
type: "POST",
url: "./?sub=action&type=boardset_select",
data: "fid=" + $(this).val(),
cache: false,
dataType: "json",
success: function(data)
{
if(data['status'] == "OK")
{
toastr.success('   操作成功!');
}
else
{
toastr.options.timeOut = 1000;
toastr.error('   操作失敗!');
}
}
});
});
});
</script>
EOF;

(2).include/action.php
switch ($_G['type'])
{
case "boardset_select":
//顯示版塊權限
require_once include_path."/action/boardset_select.php";
break;
}

(3).boardset_select.php
$fid = $_G['fid'];
$res = $db->query("select * from `pre_forum_forumfield` where fid = '$fid'");
if($res->rowCount())
{
$info_forumfield = $res->fetchAll(PDO::FETCH_ASSOC);
die(json_encode(array("status" => "OK", "forum" => $info_forumfield)));
}
else
{
die(json_encode(array("status" => "err_pre_forum_forumfield_select")));
}
  heredoc中間要加上php迴圈的寫法 heredoc中間要加上php迴圈的寫法:
結構:拆開前後段,中間加入php迴圈指令
$content = <<<EOF
<div class="modal-dialog">
....
EOF;

foreach($info_moderator as $key => $list)
{
<input type="checkbox" name="delete[]" id="'.$list["uuid"].'">
}

$content .= <<<EOF
<div class="row mod-list">
</div>
EOF;

範例:
$content = <<<EOF
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">編輯版主 - $fidname</h4>
</div>
<div class="modal-body">
<div class="row mod-list">
<div class="col-md-1 col-sm-1 col-xs-1 px0"> </div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center px0">顯示順序</div>
<div class="col-md-4 col-sm-4 col-xs-4 text-center px0">用戶名</div>
<div class="col-md-3 col-sm-3 col-xs-3 text-center px0">用戶組</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center px0">版塊繼承</div>
</div>
EOF;
foreach($info_moderator as $key => $list)
{
$username = $list["username"];
$inherited = $list['inherited']==1 ? '是' : '否';
$content .= '<div class="row mod-list">
<div class="col-md-1 col-sm-1 col-xs-1 px0 text-center">
<input type="checkbox" name="delete[]" id="'.$list["uuid"].'">
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center">
<input class="mod-input dp" type="text" name="displayordernew[1]" id="displayordernew_'.$list["uuid"].'" value="'.$list["displayorder"].'">
</div>
<div class="col-md-4 col-sm-4 col-xs-4 text-center">
<a href="./?sub=memberProfile&uuid='.$list["uuid"].'">'.$username.'</a>
</div>
<div class="col-md-3 col-sm-3 col-xs-3 text-center">
<font color="white">管理員</font>
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center">'.$inherited.'</div>
</div>';
}

$content .= <<<EOF
<div class="row mod-list">
<div class="col-md-1 col-sm-1 col-xs-1 px0 text-center">
新增
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center">
<input class="mod-input dp" type="text" name="displayordernew[1]" id="displayordernew_a3227e89-d9d9-4f74-8237-c9765d4b3335">
</div>
<div class="col-md-4 col-sm-4 col-xs-4 text-center">
<input class="mod-input dp" type="text" name="newmoderator" id="newmoderator">
</div>
<div class="col-md-3 col-sm-3 col-xs-3 text-center">
<select name="newgroup" class="mod-input newgroup">
$option_group
</select>
</div>
<div class="col-md-2 col-sm-2 col-xs-2 text-center"> </div>
</div>

<div class="row mod-list">
<div class="col-md-1 col-sm-1 col-xs-1 px0 text-center">
<input type="checkbox" id="mod-select">
</div>
<div class="col-md-11 col-sm-11 col-xs-11 btn_block">
<button type="button" class="btn btn-danger">刪除</button>
<input type="checkbox" name="inheritedmodnew" id="inheritedmodnew" value="1">
<label for="inheritedmodnew">權限繼承到子版塊</label> 
<button type="button" class="btn btn-blue">送出</button>
</div>
</div>

</div>
</div>

</div>
EOF;
  密碼強度-在heredoc裡面顯示(修改密碼)

5-密碼強度-在heredoc裡面顯示(修改密碼):
(1)觀念:在heredoc裡面顯示js,jquery事件的方法不同:
_(A).在heredoc裡面顯示js, 例如:function show()
方法:
例如,在common.js,建立functionl show(){....}

_(B).在heredoc裡面顯示jquery, 例如:$('#submit').attr('disabled', true);
__i).錯誤方法:在common.js,若放到$(document ).ready(function(){...}裡面,無法使用
換言之:heredoc的jquery事件,無法到外部common.js建立與使用
但是:heredoc的js事件,可以到外部common.js建立與使用

__ii).正確方法:在hredoc的下方,直接把jquery事件加上,即可
範例1:https://stackoverflow.com/questions/47992821/how-to-use-jquery-in-php-heredoc
$embedHtml = <<<'FORM'
<div id="slider" class="nivoSlider">
<img src="toystory.jpg" />
<img src="nemo.jpg" />
</div>
<script language="javascript">
$(window).load(function(){$("#slider").nivoSlider({directionNav: false, controlNav: false, pauseTime: 4000});});
</script>
FORM;

範例2:fdz:include/modal/pwdChange.php
$content = <<<EOF
<div class="modal-content">
<div class="modal-body">
<p>新密碼(最短長度8碼,密碼強度最少60)</p>
<input class="form-control" type="password" name="new_pwd" id="new_pwd"><br>
</div>
</div>
<script language="javascript">
$('#submit_edit_ps').attr('disabled', true);
$('#new_pwd').password().on('password.score', function (e, score)
{
if (score > 60) {
$('#submit_edit_ps').removeAttr('disabled');
} else {
$('#submit_edit_ps').attr('disabled', true);
}
});
</script>
EOF;

  彈出的modal視窗,下方按鈕(儲存,刪除,送出)的程式碼寫法

彈出的modal視窗,下方按鈕(儲存,刪除,送出)的程式碼寫法:
(1).不需要在modal的heredoc下方的javascript區域來寫ajax
(2).到外面的js來寫javascript function(例如:memberList.js)
(3).在memberList.js,只要不把modal隱藏,modal視窗就會一直保留
會把modal視窗消除的,有兩種,例如:
$("#reportModal").modal("hide");
window.location.reload(true);

範例:
$.ajax({
type: "POST",
url: "./?sub=action&type=report",
data: data_string + "&hash_string=" + hash_string,
cache: false,
dataType: "json",
success: function(data)
{
$("#reportModal").modal("hide");
if (data["status"] == "OK")
{
toastr.success("    檢舉成功");
setTimeout(function(){
window.location.reload(true);
}, 1000);
}
}

  為什麼志豪版本在modal的點選js函數,可以寫在外面的js函數

為什麼志豪版本在modal的點選js函數,可以寫在外面的js函數
(1).過去我寫的include/modal/memset.php,函數都寫在memberList.js
範例:https://vbb.news/?sub=memberList,選擇-->設定-->用戶組
寫法:
<script language="javascript">
//下拉選單,改變項目事件
$("#ul_admin ul li").click(function()
{
$("#ul_admin button").text($(this).text());
$("#ul_admin button").val($(this).prop("id"));
});

_(A).在heredoc裡面顯示jquery, 例如:$('#submit').attr('disabled', true);
__i).錯誤方法:在common.js,若放到$(document ).ready(function(){...}裡面,無法使用
換言之:heredoc的jquery事件,無法到外部common.js建立與使用
但是:heredoc的js事件,可以到外部common.js建立與使用

(2).志豪的寫法,不是用jquery函數寫法,而是用js函數寫法(這個在heredoc是可以的,可以讀取js函數)
_(A).include/modal/memset.php
foreach($admincp_group as $adminid => $group)
{
$content .= '<li><a href="javascript:void(0)" onclick="set_admingroup(\'#adminid\', \'#admingroup_title\', \''.$adminid.'\', \''.$group["cpgroupname"].'\')">'.$group["cpgroupname"].'</a></li>';
}

_(B).js/memberList.js
function set_usergroup(inputid, dropdownid, groupid, grouptitle)
{
$(dropdownid).html(grouptitle+'<span class="caret"></span>');
$(inputid).val(groupid);
}

  heredoc單引號,雙引號的規則:第一層’,第二層",第三層\'

heredoc單引號,雙引號的規則:第一層’,第二層",第三層\'
例如:include/modal/memset.php
$content .= '<li><a href="javascript:void(0)" onclick="set_admingroup(\'#adminid\', \'#admingroup_title\', \''.$adminid.'\', \''.$group["cpgroupname"].'\')">'.$group["cpgroupname"].'</a></li>';

1

**php的字串,前後用雙引號""或是單引號''

**輸出字元,可以用Escape逸出字元,來顯示某些無法正常顯示的字元:例如雙引號,$,tab跳格
例如顯示雙引號(\ "):"台南"
例如顯示$符號(\$):金額共美金$ 3000 元
例如顯示\符號(\\):\台灣\

**搜尋字串 strpos(被查字串,要查字串)
注意:在第一個位置傳回0,找不到傳回false(也是0),所以比較時要用 if($pos===false),或是if ($pos !== false) ,就是除了值一樣外,形態也要一樣

注意:搜尋字,第一個字由0開始

注意:搜尋中文字,一個字有三個字元


**stripos():查找字串在另一字串中第一次出現的位置(不區分大小寫)
**strripos():查找字串在另一字串中最後一次出現的位置(不區分大小寫)
**strrpos():查找字串在另一字串中最後一次出現的位置(區分大小寫)

**搜尋所在字之後的字串:strstr(被查字串,要查字串)

**搜尋特殊字元(”,\)之後的字串:strchr(被查字串,要查字元)

**反向搜尋特殊字元(”,\),從後面開始找的第一個字,的之後字串:strrchr(被查字串,要查字元)

 

範例結果

 

<?php
echo '//字串相關';
echo "<br/>//php的字串,前後用雙引號\"\"或是單引號''";

///////////////////////////////////////////////////
echo '//輸出字元,可以用Escape逸出字元,來顯示某些無法正常顯示的字元:例如雙引號,$,tab跳格 <br/>';
echo "例如顯示雙引號(\ \"):\"台南\" <br/>";
echo "例如顯示$符號(\$):金額共美金\$ 3000 元 <br/>";
echo "例如顯示\符號(\\\\):\\台灣\\ <br/>";

///////////////////////////////////////////////////
echo '//搜尋字串 strpos(被查字串,要查字串) <br/>';
echo '注意:在第一個位置傳回0,找不到傳回false(也是0),所以比較時要用 if($pos===false),或是if ($pos !== false) ,就是除了值一樣外,形態也要一樣<br/>';
echo '注意:搜尋字,第一個字由0開始<br/>';
echo '注意:搜尋中文字,一個字有三個字元<br/>';
echo '//stripos():查找字串在另一字串中第一次出現的位置(不區分大小寫) <br/>';
echo '//strripos():查找字串在另一字串中最後一次出現的位置(不區分大小寫) <br/>';
echo '//strrpos():查找字串在另一字串中最後一次出現的位置(區分大小寫) <br/>';

$str = "abcdefghijk";
echo $str."<br/>";
//////////////////////////////////////////
$find1="a";
$pos = stripos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}
//////////////////////////////////////////
$find1="c";
$pos = stripos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}


//////////////////////////////////////////
//$str = "今天2018-01-05陽光很大,晴空萬里";
$str = "今天陽光很大,晴空萬里";
echo $str."<br/>";
$find1="今";
$pos = strpos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}

//////////////////////////////////////////
$find1="天";
$pos = strpos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}

//////////////////////////////////////////
$find1="陽";
$pos = strpos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}

//////////////////////////////////////////
$find1="有";
$pos = strpos($str,$find1);
if($pos===false){echo "找不到: $find1 <br/>";}
else{
echo "找到: $find1";
echo ",位置在第 $pos 個字元處 <br/>";
}

//////////////////////////////////////////
echo '//搜尋所在字之後的字串 strstr(被查字串,要查字串) <br/>';
$str = "今天2018-01-05陽光很大,晴空萬里";
echo $str."<br/>";
$find1="6";
$txt = strstr($str,$find1);
if($txt===false){echo "找不到: $find1 <br/>";}
else{
echo "找到 $find1 : $txt <br/>";
}

$find1="5";
$txt = strstr($str,$find1);
if($txt===false){echo "找不到: $find1 <br/>";}
else{
echo "找到 $find1 : $txt <br/>";
}


//////////////////////////////////////////
echo '//搜尋特殊字元(”,\)之後的字串 strchr(被查字串,要查字元) <br/>';
$str = "今\"天2018/01/05陽光很大,晴空萬里";
echo $str."<br/>";
$find1='"';
$txt = strchr($str,$find1);
if($txt===false){echo "找不到: $find1 <br/>";}
else{
echo "找到 $find1 : $txt <br/>";
}

$find1='/';
$txt = strchr($str,$find1);
if($txt===false){echo "找不到: $find1 <br/>";}
else{
echo "找到 $find1 : $txt <br/>";
}

//////////////////////////////////////////
echo '//反向搜尋特殊字元(”,\),從後面開始找的第一個字,的之後字串 strrchr(被查字串,要查字元) <br/>';
$str = "今\"天2018/01/05陽光很大,晴空萬里";
echo $str."<br/>";
$find1='0';
$txt = strrchr($str,$find1);
if($txt===false){echo "找不到: $find1 <br/>";}
else{
echo "找到 $find1 : $txt <br/>";
}

?>

2

*取出子字串 方法1:substr(字串,位置3,共4個字)

*取出子字串 方法2:取出@之後的文字 strchr(字串,'@')

*計算某個字元出現的次數 substr_count(字串,"o")

*取代某個字串 substr_replace(字串,"新字串",開始位置4,長度5)

*反轉某個字串 strrev(字串)

*將某字串分割成陣列 explode(',',字串)

*將某陣列組成字串 implode(' , ',字串)

 

範例結果

<?php
echo '//子字串相關函數 <br/>';
///////////////////////////////////////////////////
echo '//取出子字串 方法1:substr(字串,位置3,共4個字) <br/>';
$str= "abc@yahoo.com.tw";
echo $str."<br/>";
echo substr($str,3,4);

///////////////////////////////////////////////////
echo "//取出子字串 方法2:取出@之後的文字 strchr(字串,'@') <br/>";
echo strchr($str,'@');

///////////////////////////////////////////////////
echo "//計算某個字元出現的次數 substr_count(字串,\"o\") <br/>";
echo "o 出現過";
echo substr_count($str,"o");
echo "次";

///////////////////////////////////////////////////
echo "//取代某個字串 substr_replace(字串,\"新字串\",開始位置4,長度5) <br/>";
echo substr_replace($str,"gmail",4,5);

///////////////////////////////////////////////////
echo "//反轉某個字串 strrev(字串) <br/>";
echo strrev($str);

///////////////////////////////////////////////////
echo "//將某字串分割成陣列 explode(',',字串) <br/>";
$str= "李大同70;張花花85;林美美60;宋妮妮99;吳盼盼75;";
echo $str."<br/>";
$a = explode(";",$str);
while(list($key,$v) = each($a)){
echo $v."<br/>";
}

///////////////////////////////////////////////////
echo "//將某陣列組成字串 implode(' , ',字串) <br/>";
$str2 = implode(" , ",$a);
echo $str2."<br/>";

?>

3

比較兩個字串 :if(strcmp(字串1,字串2)==0){...},傳回0為相等,>0會前者大

*注意傳回0,就是false,所以有人寫成 if(!strcmp(字串1,字串2))

*不區分英文大小寫的比較兩個字串 :if(strcasecmp(字串1,字串2)==0){...},傳回0為相等,>0會前者大

*只比較前面幾個字元 :if(strncmp(字串1,字串2,10)==0){...},傳回0為相等,>0會前者大
*注意傳回0,就是false,所以有人寫成 if(!strncmp(字串1,字串2,10))


 

範例結果

<?php
echo '//字串比較相關函數 <br/>';
///////////////////////////////////////////////////
echo '//比較兩個字串 :if(strcmp(字串1,字串2)==0){...},傳回0為相等,>0會前者大 <br/>';
echo '//注意傳回0,就是false,所以有人寫成 if(!strcmp(字串1,字串2)) <br/>';
$str1= "yahoo.com.tw";
$str2= "yahoo.com.TW";
echo $str1."<br/>";
echo $str2."<br/>";
if(strcmp($str1,$str2)==0)echo "兩者相等";
else echo "兩者不相等";

///////////////////////////////////////////////////
$str1= "yahoo.com.tw";
$str2= "yahoo.com.tw";
echo $str1."<br/>";
echo $str2."<br/>";
if(!strcmp($str1,$str2))echo "兩者相等";
else echo "兩者不相等";

///////////////////////////////////////////////////
echo '//不區分英文大小寫的比較兩個字串 :if(strcasecmp(字串1,字串2)==0){...},傳回0為相等,>0會前者大 <br/>';
echo '//注意傳回0,就是false,所以有人寫成 if(!strcasecmp(字串1,字串2)) <br/>';
$str1= "yahoo.com.tw";
$str2= "yahoo.com.TW";
echo $str1."<br/>";
echo $str2."<br/>";
if(!strcasecmp($str1,$str2))echo "兩者相等";
else echo "兩者不相等";

///////////////////////////////////////////////////
echo '//只比較前面幾個字元 :if(strncmp(字串1,字串2,10)==0){...},傳回0為相等,>0會前者大 <br/>';
echo '//注意傳回0,就是false,所以有人寫成 if(!strncmp(字串1,字串2,10)) <br/>';
$str1= "yahoo.com.tw";
$str2= "yahoo.com.TW";
echo $str1."<br/>";
echo $str2."<br/>";
if(!strncmp($str1,$str2,10))echo "兩者相等";
else echo "兩者不相等";

?>

4

網頁字串相關函數

*把網頁標籤刪除: strip_tags(\$str)

*把某個字串有雙引號",單引號',反斜線\的前面都加上反斜線\: addslashes($str)

*刪除字串的反斜線\: stripslashes($str)

* 把\ n轉成 <br/>:nl2br($str)

 

範例結果

<?php
echo '//網頁字串相關函數 <br/>';
///////////////////////////////////////////////////
echo '//把網頁標籤刪除: strip_tags(\$str) <br/>';
$str= "<table><tr><td style='color:red'>姓名</td></tr><tr><td style='color:blue'>成績</td></tr></table>";
echo $str."<br/>";
echo strip_tags($str);

///////////////////////////////////////////////////
echo "//把某個字串有雙引號\",單引號',反斜線\\的前面都加上反斜線\\: addslashes(\$str) <br/>";
$str= '他說:"希望大家都能\快樂"。';
echo $str."<br/>";
$t2 = addslashes($str);
echo $t2;

///////////////////////////////////////////////////
echo "//刪除字串的反斜線\\: stripslashes(\$str) <br/>";
$str= '他說:"希望大家都能\快樂"。';
echo $str."<br/>";
$t2 = stripslashes($str);
echo $t2;

///////////////////////////////////////////////////
echo "// 把\\ n轉成 <br/>:nl2br(\$str) <br/>";
$str = "if (x < 5 && y >= 8) {\n sum();\n }\n";
echo nl2br($str);

?>

5

格式化輸出字串相關函數

*設定輸出文字與數字的格式: sprintf(字串%u...%s....,變數1,變數2)

*字串:%s

*科學計數法:%e我的名字是李大同,要二手賣i4蘋果手機價錢3.000000e+4,費用剩下5.600000e+3

*控制小數點的格式: sprintf(字串%f,變數1)
*2個小數點:%1\$.2f
*0個小數點:%1\$u

 

範例結果

<?php
echo '//格式化輸出字串相關函數 <br/>';
///////////////////////////////////////////////////
echo '//設定輸出文字獄數字的格式: sprintf(字串%u...%s....,變數1,變數2) <br/>';
echo '<br/>//字串:%s';
echo '<br/>//科學計數法:%e';
$a="李大同";
$b= 30000;
$c= 5600;
echo sprintf("我的名字是%s,要二手賣i4蘋果手機價錢%e,費用剩下%e",$a,$b,$c)."<br/>";

///////////////////////////////////////////////////
echo '//控制小數點的格式: sprintf(字串%f,變數1) ';
echo '<br/>//2個小數點:%1\$.2f';
echo '<br/>//0個小數點:%1\$u';
$h=175.5;
echo sprintf("<br/>我的身高是(2個小數點)%1\$.2f",$h);
echo sprintf("<br/>我的身高是(0個小數點)%1\$u",$h);

/*
echo "可能的格式值:<br/>";
echo "•%% - 返回一個百分號 %<br/>";
echo "•%b - 二進位數字<br/>";
echo "•%c - ASCII 值對應的字元<br/>";
echo "•%d - 包含正負號的十進位數字(負數、0、正數)<br/>";
echo "•%e - 使用小寫的科學計數法(例如 1.2e+2)<br/>";
echo "•%E - 使用大寫的科學計數法(例如 1.2E+2)<br/>";
echo "•%u - 不包含正負號的十進位數字(大於等於 0)<br/>";
echo "•%f - 浮點數(本地設置)<br/>";
echo "•%F - 浮點數(非本地設置)<br/>";
echo "•%g - 較短的 %e 和 %f<br/>";
echo "•%G - 較短的 %E 和 %f<br/>";
echo "•%o - 八進位數<br/>";
echo "•%s - 字串<br/>";
echo "•%x - 十六進位數(小寫字母)<br/>";
echo "•%X - 十六進位數(大寫字母)<br/>";
echo "附加的格式值。必需放置在 % 和字母之間(例如 %.2f):<br/>";
echo "•+ (在數字前面加上 + 或 - 來定義數字的正負性。預設情況下,只有負數才做標記,正數不做標記)<br/>";
echo "•' (規定使用什麼作為填充,默認是空格。它必須與寬度指定器一起使用。例如:%'x20s(使用 "x" 作為填充))<br/>";
echo "•- (左調整變數值)<br/>";
echo "•[0-9] (規定變數值的最小寬度)<br/>";
echo "•.[0-9] (規定小數位數或最大字串長度)<br/>";

*/

?>

6

輸出html特殊字元

<(&lt;)
>(&gt;)
&(&amp;)
"(&quot;)
'(&#039;)
空白(&nbsp;)
換行(&lt;br>)

 

範例結果

<?php
echo "//輸出html特殊字元 <br/>";
///////////////////////////////////////////////////
echo "//<(&lt;) <br/>";
echo "//>(&gt;) <br/>";
echo "//&(&amp;) <br/>";
echo "//\"(&quot;) <br/>";
echo "//'(&#039;) <br/>";
echo "//空白(&nbsp;) <br/>";
echo "//換行(&lt;br&gt;) <br/>";

echo "&lt; &quot;大家好&quot;&gt;<br/>";

?>

7

比對輸入的格式是否正確:

preg_match() 結合規則運算式(Regular Expression),進行複雜字串比對
適合在做表單輸入格式的驗證(手機電話格式,email...

驗證是否字串有中文字 好 存在:preg_match('/好/',$a)

驗證是否字串有間隔的兩字,e..g 存在:
preg_match('/e.g/',$a)

驗證是否有任一數字,有兩個方法:[0-9],或是/\d/:preg_match('/\d/',$a)

驗證是否有任一數字,有兩個方法:[0-9],或是/\d/:preg_match('/\d/',$a)

驗證是否有英文字母:[a-zA-A]:
preg_match('/[a-zA-A]/',$a)

驗證是否有任一數字,有兩個方法:[a-zA-A0-9],或是
/\w/:preg_match('/\w/',$a)

從URL取得主機名稱:@^(?:http://)?([^/]+)@i:preg_match('/\w/',$a)
比對結果放在$matches陣列

密碼長度6,包含英數字://^.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*$/

檢查最少6個英文數字,最多15個字元:/(?=.[a-zA-A0-9])(?=.{6,15})/

驗證密碼 長度6,英數字再加上包含大小寫 ::^.*(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$

驗證密碼 至少各一位英文字母、數字,共8~12位,沒特殊字元 ::/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/

檢查是不是電子信箱格式,兩種格式:
/^[\w]*@[\w-]+(\.[\w-]+)+$/

檢查住家電話格式是否正確:02-12345678:/^[0-9]{2}-[0-9]{8}$/

檢查身份證格式是否正確:G123456789:/^[A-Za-z][1-2]\d{8}$/


 

範例結果

<?php
echo "//比對輸入的格式是否正確:以 preg_match() 結合規則運算式(Regular Expression),進行複雜字串比對 <br/>";
echo "//適合在做表單輸入格式的驗證(手機電話格式,email... <br/>";

///////////////////////////////////////////////////
echo "//驗證是否字串有中文字 好 存在:preg_match('/好/',\$a)<br/>";
$a = "今天天氣很好,晴空萬里";
echo "$a <br/>";
$b = "/好/";
if(preg_match($b,$a)==true){
echo "找到".$b;
}else{
echo "找不到".$b;
}

///////////////////////////////////////////////////
echo "//驗證是否字串有間隔的兩字,e..g 存在:preg_match('/e.g/',\$a)<br/>";
$a = "abcdefghi";
echo "$a <br/>";
$b = "/e.g/";
if(preg_match($b,$a)==true){
echo "找到".$b;
}else{
echo "找不到".$b;
}

///////////////////////////////////////////////////
echo "//驗證是否有任一數字,有兩個方法:[0-9],或是/\d/:preg_match('/\d/',\$a)<br/>";
$a = "abcdefghi123";
echo "$a <br/>";
if(preg_match("/\d/",$a)==true){
echo "找到數字";
}else{
echo "找不到數字";
}

///////////////////////////////////////////////////
echo "//驗證是否有任一數字,有兩個方法:[0-9],或是/\d/:preg_match('/\d/',\$a)<br/>";
$a = "abcdefghi";
echo "$a <br/>";
$b = "/[0-9]/";
if(preg_match($b,$a)==true){
echo "找到".$b;
}else{
echo "找不到".$b;
}

///////////////////////////////////////////////////
echo "//驗證是否有英文字母:[a-zA-A]:preg_match('/[a-zA-A]/',\$a)<br/>";
$a = "123456789";
echo "$a <br/>";
$b = "/[a-zA-A]/";
if(preg_match($b,$a)==true){
echo "找到".$b;
}else{
echo "找不到".$b;
}

///////////////////////////////////////////////////
echo "//驗證是否有任一數字,有兩個方法:[a-zA-A0-9],或是/\w/:preg_match('/\w/',\$a)<br/>";
$a = "@##$%%^&&";
echo "$a <br/>";
$b = "/[a-zA-A0-9]/";
if(preg_match($b,$a)==true){
echo "找到".$b;
}else{
echo "找不到".$b;
}

///////////////////////////////////////////////////
echo "//從URL取得主機名稱:@^(?:http://)?([^/]+)@i:preg_match('/\w/',\$a)<br/>";
echo "//比對結果放在\$matches陣列<br/>";
$a = "http://tw.yahoo.com/";
echo "$a <br/>";
preg_match('@^(?:http://)?([^/]+)@i',$a , $matches);
echo $matches[0]."<br/>";

///////////////////////////////////////////////////
echo "//密碼長度6,包含英數字://^.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*$/<br/>";
$a = "ab125$";
echo "$a <br/>";
$b = "/^.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*$/";
if(preg_match($b,$a)==true){

echo "符合,密碼長度6,包含英數字:".$a;
}else{
echo "不符合,密碼長度6,包含英數字:".$a;
}

///////////////////////////////////////////////////
echo "//檢查最少6個英文數字,最多15個字元:/(?=.[a-zA-A0-9])(?=.{6,15})/<br/>";
$a = "abffffff$";
echo "$a <br/>";
$b = "/(?=.[a-zA-A0-9])(?=.{6,15})/";
if(preg_match($b,$a)==true){

echo "符合,最少6個字元,最多15個字元:".$a;
}else{
echo "不符合,最少6個字元,最多15個字元:".$a;
}

///////////////////////////////////////////////////
echo "//驗證密碼 長度6,英數字再加上包含大小寫 ::^.*(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$ <br/>";
$a = "ab56☎B";
echo "$a <br/>";
$b = "/^.*(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/";
if(preg_match($b,$a)==true){

echo "符合,密碼長度6,英數字再加上包含大小寫:".$a;
}else{
echo "不符合,密碼長度6,英數字再加上包含大小寫 :".$a;
}

///////////////////////////////////////////////////
echo "//驗證密碼 至少各一位英文字母、數字,共8~12位,沒特殊字元 ::/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/<br/>";
$a = "ab56@f6ll";
echo "$a <br/>";
$b = "/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/";
if(preg_match($b,$a)==true){

echo "符合,至少各一位英文字母、數字,共8~12位,沒特殊字元 :".$a;
}else{
echo "不符合,至少各一位英文字母、數字,共8~12位,沒特殊字元 :".$a;
}

///////////////////////////////////////////////////
echo "//檢查是不是電子信箱格式,兩種格式:/^[\w]*@[\w-]+(\.[\w-]+)+$/<br/>";
echo "//\$standard_G_1 = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/<br/>";
echo "//\$standard_G_2 = /^[\w]*@[\w-]+(\.[\w-]+)+$/<br/>";
$a = "abc@yahoo.com.tw";
echo "$a <br/>";
$b = "/^[\w]*@[\w-]+(\.[\w-]+)+$/";
if(preg_match($b,$a)==true){

echo "電子信箱格式正確:".$a;
}else{
echo "電子信箱格式不正確:".$a;
}

///////////////////////////////////////////////////
echo "//檢查住家電話格式是否正確:02-12345678:/^[0-9]{2}-[0-9]{8}$/ <br/>";
$a = "(02)12345678";
echo "$a <br/>";
$b = "/^[0-9]{2}-[0-9]{8}$/";
if(preg_match($b,$a)==true){
echo "住家電話格式正確:".$a;
}else{
echo "住家電話格式不正確:".$a;
}

///////////////////////////////////////////////////
echo "//檢查身份證格式是否正確:G123456789:/^[A-Za-z][1-2]\d{8}$/ <br/>";
$a = "G123456789";
echo "$a <br/>";
$b = "/^[A-Za-z][1-2]\d{8}$/";
if(preg_match($b,$a)==true){

echo "身份證格式正確:".$a;
}else{
echo "身份證格式不正確:".$a;
}

 

/*

關於密碼驗證的Regular Expression,我自己在網路上找到的是以下這個:

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

上述的Regular Expression可達到以下幾個驗證密碼的項目:

(?=.{10,}):密碼長度10個以上
(?=.*\d):至少要有一個0-9的數字
(?=.*[a-z]):至少要有一個小寫的英文字母(a-z)
(?=.*[A-Z]]):至少要有一個大寫的英文字母(A-Z)
(?=.*[@#$%^&+=]):至少要有清單中的一個特殊符號(@#$%^&+=)


技巧上很簡單,把每個(?=)項目都當做個驗證的關卡來看,要通過這個密碼驗證,就要每一關都通過。
至於整個Regular Expression最後面的.*是一定要有的,前面的.*可有可無;如果兩個都沒有,或是只有前面有.*,都是不行的。(有興趣的可以多方嘗試)
以下說明一下各個驗證的項目:(記住:不管是(?=)或(?!),.*都記得先放進去)

(?=.{10,}):檢查輸入的字元長度是否有超過10。如果資料庫裡的密碼欄位長度是20,那就改成(?=.{10,20})。
(?=.*\d):因為\d表示[0-9],所以此部分是檢查輸入的字串裡有沒有0-9的數字。
(?=.*[a-z])(?=.*[A-Z]):概念同(?=.*\d),不過這是分開檢查有沒有輸入大寫與小寫英文字母。如果只是要有英文字母,就改成(?=.*[a-zA-Z])。
(?=.*[@#$%^&+=]):要使用者輸入至少一個指定的特殊符號。有人會用(?=.*\W)來表示,因為\W表示[^A-Za-z0-9_],這邊要注意\W有排除掉"_"這個符號

?>

8

表單欄位驗證

檢查最少4個英文數字,最多15個字元

驗證密碼 至少各一位英文字母、數字,共8~12位,沒特殊字元

檢查是不是電子信箱格式,兩種格式

檢查住家電話格式是否正確

檢查身份證格式是否正確


 

範例結果

1.下載表單的html語法 ,建立exp09-8.html

2.填入參數:
 method="post"
action="exp09-8.php"

填入多個欄位的命名:
<label for="a1" class="col-sm-2 control-label">帳號</label>
<div class="col-sm-10"><input type="text" class="form-control" name="a1" placeholder="最少4個英文數字,最多15個字元" ></div>
</div>

3.撰寫 exp06-7.php
<?php
$a1 = $_POST["a1"];
$a2 = $_POST["a2"];//密碼

$a3 = $_POST["a3"];//email
$a4 = $_POST["a4"];//電話
$a5 = $_POST["a5"];//身份證

///////////////////////////////////////////////////
//echo "//檢查最少4個英文數字,最多15個字元:/(?=.[a-zA-A0-9])(?=.{4,15})/<br/>";
$b = "/(?=.[a-zA-A0-9])(?=.{4,15})/";
if(preg_match($b,$a1)==true)
{
echo "<br/>帳號 格式正確:".$a1;
}else{
echo "<br/>帳號 格式不正確:".$a1;
}

///////////////////////////////////////////////////
//echo "//驗證密碼 至少各一位英文字母、數字,共8~12位,沒特殊字元 ::/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/<br/>";
$b = "/^(?!.*[^a-zA-Z0-9])(?=.*\d)(?=.*[a-zA-Z]).{8,12}$/";
if(preg_match($b,$a2)==true)
{
echo "<br/>密碼 格式正確:".$a2;
}else{
echo "<br/>密碼 格式不正確:".$a2;
}

///////////////////////////////////////////////////
//echo "//檢查是不是電子信箱格式,兩種格式:/^[\w]*@[\w-]+(\.[\w-]+)+$/<br/>";
//echo "//\$standard_G_1 = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/<br/>";
//echo "//\$standard_G_2 = /^[\w]*@[\w-]+(\.[\w-]+)+$/<br/>";
$b = "/^[\w]*@[\w-]+(\.[\w-]+)+$/";
if(preg_match($b,$a3)==true){

echo "<br/>電子信箱格式正確:".$a3;
}else{
echo "<br/>電子信箱格式不正確:".$a3;
}

///////////////////////////////////////////////////
//echo "//檢查住家電話格式是否正確:02-12345678:/^[0-9]{2}-[0-9]{8}$/ <br/>";
$b = "/^[0-9]{2}-[0-9]{8}$/";
if(preg_match($b,$a4)==true){

echo "<br/>住家電話格式正確:".$a4;
}else{
echo "<br/>住家電話格式不正確:".$a4;
}

///////////////////////////////////////////////////
//echo "//檢查身份證格式是否正確:G123456789:/^[A-Za-z][1-2]\d{8}$/ <br/>";
$b = "/^[A-Za-z][1-2]\d{8}$/";
if(preg_match($b,$a5)==true){

echo "<br/>身份證格式正確:".$a5;
}else{
echo "<br/>身份證格式不正確:".$a5;
}


?>

9

如何把一些預定義的字符轉換為 HTML 實體(兩種方法:htmlentities,htmlspecialchars)

1.htmlentities: 函數把字元轉換為 HTML 實體

2.htmlspecialchars函數把一些預定義的字元轉換為 HTML 實體 (5個html代碼(&,"",'',>,<)轉換成amp......

差異1:這兩個函數在格式化帶有英文字符的html代碼的時候基本沒甚麼區別,但若內容有中文字符,使用 htmlentities則會連同中文字一併轉換,導致最後變為一堆亂碼

差異2:htmlspecialchars只會轉化5個html代碼(&,"",'',>,<),但是 htmlentities卻會轉化所有的html代碼,連同裡面的它無法識別的中文字符也轉換掉

原則:一般處理UTF-8,或是內容有中文的html字詞轉換,就使用htmlspecialchars。

 

範例結果

<?php
echo "//如何把把一些預定義的字符轉換為 HTML 實體(兩種方法:htmlentities,htmlspecialchars)<br/>";
echo "//1.htmlentities: 函數把字元轉換為 HTML 實體 <br/>";
echo "//2.htmlspecialchars函數把一些預定義的字元轉換為 HTML 實體 (5個html代碼(&,"",'',>,<)轉換成amp......<br/>";
echo "差異1:這兩個函數在格式化帶有英文字符的html代碼的時候基本沒甚麼區別,但若內容有中文字符,使用 htmlentities則會連同中文字一併轉換,導致最後變為一堆亂碼 <br/>";
echo "差異2:htmlspecialchars只會轉化5個html代碼(&,"",'',>,<),但是 htmlentities卻會轉化所有的html代碼,連同裡面的它無法識別的中文字符也轉換掉 <br/>";
echo "原則:一般處理UTF-8,或是內容有中文的html字詞轉換,就使用htmlspecialchars。<br/>";
//可用的引号类型:
//ENT_COMPAT - 默认。仅编码双引号。
//ENT_QUOTES - 编码双引号和单引号。
//ENT_NOQUOTES - 不编码任何引号。

///////////////////////////////////////////////////
echo "//輸出西歐語系:était une fois un être>. <br/>";
$a = "était une fois un être>.";
echo $a."<br/>";
echo "htmlentities(西歐語)= ".htmlentities($a);
echo "<br/>htmlspecialchars(西歐語)=".htmlspecialchars($a);
echo "<br/>兩者結果,不一樣";

///////////////////////////////////////////////////
echo "//輸出中文字:今天天氣很好 <br/>";
$a = "今天天氣很好。";
echo $a."<br/>";
echo "htmlentities(中文)= ".htmlentities($a);
echo "<br/>htmlspecialchars(中文)=".htmlspecialchars($a);
echo "<br/>兩者結果,不一樣";

///////////////////////////////////////////////////
echo "//輸出5個html代碼:'&amp;,&quot;,&#039;,&lt;,&gt; <br/>";
$a = "<'a'>";
//$a = "&amp;,&quot;,&#039;,&lt;,&gt;";
//$a = "'abc'";
echo $a."<br/>";
echo "htmlentities(5個html代碼)= ".htmlentities($a,ENT_QUOTES);
echo "<br/>htmlspecialchars(5個html代碼)=".htmlspecialchars($a,ENT_QUOTES);
echo "<br/>兩者結果,一樣";

?>

 

 
Chp10. 各種其它函數(數學函數,eval...)
練習範例 10-1亂數顯示骰子,亂數顯示橫幅圖片) 10-2資料形態轉換的三種方法 10-3無條件進位法,無條件捨去法,四捨五入法)
  eval的功用:可以把代入變數的代數式進行計算

eval的功用:可以把代入變數的代數式進行計算
語法:
(1).簡單範例:
$string = "下午" ;
$name = "咖啡" ;
$srt = ' 我每天$string都要喝$name ';
echo $str ;
eval("\$str = \"$str\";") ;
echo $str ;
輸出結果:
我每天$string都要喝$name 
我每天下午都要喝咖啡
-----------------------------

(2).複雜範例:計算會員當下積分
位置:在fdz的common.php,memberList.php
$res = $db->query("select * from `pre_common_member` left join `pre_common_member_count` on `pre_common_member_count`.uuid=`pre_common_member`.uuid where `pre_common_member`.uuid='".$_G['SESSION']['uuid']."'");
$member_info = $res->fetch();
$credits = $setting['creditsformula']; //讀取積分公式
for($i=1; $i<=9; $i++)
{
//把積分公式的變數extcredits1,2,3..代入pre_common_member_count的該會員的積分值
$credits = str_replace('extcredits'.$i, '$member_info["extcredits'.$i.'"]', $credits);
}
//把代入的代數式,進行計算(eavl(..))
eval("\$_G['credit'] = @round({$credits});");

分析://把積分公式的變數extcredits1,2,3..代入pre_common_member_count的該會員的積分值
試算hinet的積分(extcredits2=137)
積分公式 = extcredits1/1 + extcredits2/100 + extcredits3/500 + extcredits7 / -1
積分結果 = 四捨五入(137/100 -1) = 1

  陣列過濾函數array_filter 陣列過濾函數array_filter:兩種功能:
(1).過濾空白值(把null,0...的陣列過濾掉)
(2).使用自己的過濾法則來過濾陣列

1.用此函数来過濾数组中的空元素
$arr1 = array('a'=>1,'b'=>0,'c'=>'','d'=>null,'e'=>5,'f'=>false);
$resArr1 = array_filter($arr1);
print_r($resArr1);
结果 Array ( [a] => 1 [e] => 5 )
注意值为0的也会给過濾,数组的下标并没有改变

2.用其中的回调函数自定義過濾法则過濾数组
$arr2 = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5,'f'=>6);
$resArr2=array_filter($arr2,'fun_odd');//其中的fun_odd必须加引号,不能加()
print_r($resArr2);
function fun_odd($arr){
if($arr % 2 == 1){
return $arr;
}
}
结果:Array ( [a] => 1 [c] => 3 [e] => 5 )

3.常用應用時機:字串轉成陣列後,再把空白值去除
字串轉成陣列:explode()+array_filter()過濾陣列的空白值
$pid_arr = array_filter(explode(",", $pid));
1

亂數 mt_rand(min,max)

顯示骰子

亂數顯示每次登入網頁的橫幅圖片與超連結

 

範例結果

 

<?php
echo "//亂數 mt_rand(min,max) <br/>";
///////////////////////////////////////////////////
echo "丟出的骰子是".mt_rand(1,6);

///////////////////////////////////////////////////
echo "//亂數顯示每次登入網頁的橫幅圖片與超連結 用echo輸出 <br/>";
$banner = array(array("pic/ban_top1.gif","https://tw.yahoo.com/"),
array("pic/ban_top2.gif","https://www.youtube.com/"),
array("pic/ban_top3.gif","https://www.google.com.tw/"));

$i = mt_rand(0,2);

echo "<a href='".$banner[$i][1]."'><img src='".$banner[$i][0]."'></a>";

///////////////////////////////////////////////////
echo "<br/><br/>//亂數顯示每次登入網頁的橫幅圖片與超連結 用sprintf輸出<br/>";

$i = mt_rand(0,2);

echo sprintf("<a href='%s'><img src='%s'></a>",$banner[$i][1],$banner[$i][0]);
?>

2

資料形態轉換的三種方法

方法一:(資料形態名稱)變數:例如,(int)$a

種類:int,integer,float,double,real,binary,bool,boolean,string,array,object,unset(轉成NULL),,,

方法二:使用函數來轉換:例如,intval($a)

種類:intval(),strlval(),doubleval(),floatval()

方法三:使用函數settype來轉換:例如,settype($a,'int')

 

傳回資料形態:gettype($a)

 

範例結果

<?php
echo "//資料形態轉換的三種方法 <br/>";
echo "///////////////////////////////////////////////////// <br/>";
echo "//方法一:(資料形態名稱)變數:例如,(int)\$a <br/>";
echo "種類:int,integer,float,double,real,binary,bool,boolean,string,array,object,unset(轉成NULL),,, <br/>";
$a = 2.59;
echo "a=".$a."<br/>";
echo "a轉成整數=".(int)$a."<br/>";
$a = "2.59公尺";
echo "b=".$a."<br/>";
echo "a轉成浮點數=".(float)$a."<br/>";

///////////////////////////////////////////////////
echo "//方法二:使用函數來轉換:例如,intval(\$a) <br/>";
echo "種類:intval(),strlval(),doubleval(),floatval() <br/>";
$a = 2.59;
echo "a=".$a."<br/>";
echo "a轉成整數=".intval($a)."<br/>";
$a = "2.59公尺";
echo "b=".$a."<br/>";
echo "a轉成浮點數=".floatval($a)."<br/>";

///////////////////////////////////////////////////
echo "//方法三:使用函數settype來轉換:例如,settype(\$a,'int') <br/>";
echo "種類:int,integer,float,double,real,binary,bool,boolean,string,array,object,unset(轉成NULL),,, <br/>";
$a = 2.59;
echo "a=".$a."<br/>";
settype($a,"int");
echo "a轉成整數=".$a."<br/>";
$a = "2.59公尺";
settype($a,"float");
echo "b=".$a."<br/>";
echo "a轉成浮點數=".$a."<br/>";

///////////////////////////////////////////////////
echo "//傳回資料形態:gettype(\$a) <br/>";
$a = 2.59;
echo "a=".$a."<br/>";
echo "a的資料形態=".gettype($a)."<br/>";

?>

3

四捨五入數學函數

無條件進位法ceil(3.29) = 4
無條件進位法:ceil(-3.29) = -3

無條件捨去法floor(3.29) = 3
無條件捨去法:floor(-3.29) = -4

四捨五入法:round(3.29) = 3
四捨五入法:floor(3.69) = 4

**指定小數點第幾位四捨五入,或指定百位千位
四捨五入法:round(3.296755,3) = 3.297
四捨五入法:floor(3296768.355,-3) = 3297000

 

範例結果

<?php
echo "//四捨五入數學函數 <br/>";
echo "///////////////////////////////////////////////////// <br/>";
echo "//無條件進位法:ceil(3.29) = 4 <br/>";
echo "//無條件進位法:ceil(-3.29) = -3 <br/>";
echo "ceil(3.29)=".ceil(3.29)."<br/>";
echo "ceil(-3.29)=".ceil(-3.29)."<br/>";

echo "///////////////////////////////////////////////////// <br/>";
echo "//無條件捨去法:floor(3.29) = 3 <br/>";
echo "//無條件捨去法:floor(-3.29) = -4 <br/>";
echo "floor(3.29)=".floor(3.29)."<br/>";
echo "floor(-3.29)=".floor(-3.29)."<br/>";

echo "///////////////////////////////////////////////////// <br/>";
echo "//四捨五入法:round(3.29) = 3 <br/>";
echo "//四捨五入法:floor(3.69) = 4 <br/>";
echo "round(3.29)=".round(3.29)."<br/>";
echo "round(3.69)=".round(3.69)."<br/>";

echo "/////指定小數點第幾位四捨五入,或指定百位千位//////////////////////// <br/>";
echo "//四捨五入法:round(3.296755,3) = 3.297 <br/>";
echo "//四捨五入法:floor(3296768.355,-3) = 3297000 <br/>";
echo "round(3.296755,3)=".round(3.296755,3)."<br/>";
echo "round(3296768.355,-3)=".round(3296768.355,-3)."<br/>";

?>

3

 

php轉換網頁

javascript換網頁

 

範例結果

/////php前往網頁/////////////////////
<?php
header("Location:exp13.php");

?>

/////按鈕的超連結(1)/////////////////////
<input type="button" id="btn1" value="按鈕" onclick="javascript:location.href='https://tw.yahoo.com/'" />

/////按鈕的超連結(2)/////////////////////
<input type="button" id="btn1" value="按鈕" onclick="gopage()" />

....................................................

<script type="text/javascript">
function gopage(){
location.href = "https://tw.yahoo.com";
}
</script>

 

 

4

include_once

require_once

include 和 include_once
(1).都是用來引入檔案,後者可避免重複引入,故建議用後者。
(2).引不到檔案會出現警告誤息,但程式不會停止。

require 和 require_once
(1).都是用來引入檔案,後者可避免重複引入,故建議用後者。
(2). 引不到檔案會出現錯誤訊息,而且程式會停止執行。

require_once "exp10-1.inc";

require_once ("exp10-1.inc");

 

 
Chp11. 在網頁之間傳遞參數的cookie與session
練習範例 11-1建立背景顏色的cookie 11-2建立背景顏色的cookie陣列 11-3下拉選單設定cookie後,關閉瀏覽器再開啟,文字顏色設定還在 11-4session設定已登入網頁時間
  js傳遞url特殊符號的處理方法 從js傳遞url變數,若含有+號碼,在php驗證會出現錯誤:
解決方法:
(1).在js:data_string += "&pid=" + pid + "&reason=" + base64EncodingUTF8(encodeURIComponent(reason));

(2).在php:$reason = urldecode(base64_decode($reason));
  若是傳遞動作原因reason有特殊符號(+,',^...),如何傳遞特殊符號 若是傳遞動作原因reason有特殊符號(+,',^...),如何傳遞特殊符號
(1).關鍵原理:
js:data_string += "&reason=" + base64EncodingUTF8(encodeURIComponent(reason))

php:$reason = urldecode(base64_decode($reason));

(2).舉例:刪除主題:thread.js
case "del":
// 刪除主題
var reason = $.trim($("#del_reason").val());
var crime = $("#del_notice_crime").prop("checked");
var notice = $("#del_notice_author").prop("checked");
// data_string += "&reason=" + reason + "&crime=" + Number(crime) + "¬ice=" + Number(notice);
data_string += "&reason=" + base64EncodingUTF8(encodeURIComponent(reason)) + "&crime=" + Number(crime) + "¬ice=" + Number(notice);

(3).include/threadfunc/delthread.php
$reason = urldecode(base64_decode($reason));
  session無法被清除 37.觀念:
a.在shipment_save.php,裡面的if(isset($_SESSION['all_product_ids']內,無法將all_product_ids清除session
例如:下面這個的session無法被清除(似乎是被當作if內局部變數)
if(isset($_SESSION['all_product_ids'])){
unset($_SESSION['all_product_ids']);
}

b.只能在獨立檔案的開頭設定:開頭就設定,不可在if(){..內}
unset($_SESSION['all_product_ids']);
1

cookie 儲存在客戶端瀏覽器的文字記錄 

用途;記錄購物車、會員登入,網頁style喜好設定,或瀏覽紀錄 

缺點1:如果用戶端的瀏覽器關閉 cookie 的使用,那就沒辦法記錄這些相關資訊((改善法:PHP4以後有 session 來替代))

缺點2:cookie 由於是儲存在用戶端電腦,所以被竊取的風險比較高(改善法:重要的資料應該盡量採用 session 來儲存)

限制1:目前每個瀏覽器最多只能儲存 300 個 cookie。

限制2:每個瀏覽器對單一網站只能儲存 20 的 cookie。

限制3:用戶端電腦的 cookie 只要關閉就沒辦法使用。

cookie指令:setcookie("變數名稱","內容","保存期限","路徑","網域","安全") 
後面三個可以省略 

注意:cookie指令前面不能有任何網頁輸出,所以若在網頁使用,第一行必須有 ob_start()才不會有錯誤 


建立背景顏色的cookie:
setcookie('bgcolor','pink',time()+1800秒) 

建立背景顏色的cookie:
setcookie('bgcolor','pink',mktime(0,0,0,10,15,2050)
 

讀取cookie指令:$_COOKIE["變數"] 
注意:讀取前要先測試,該變數是否存在?if(isset($_COOKIE["變數"]))..else... 

 

讓cookie失效,方法一:讓bgcolor值,過期 
A.指令一:$_COOKIE["變數","內容",time()-1800秒] 
B.指令二:$_COOKIE["變數","內容",mktime(0,0,0,10,15,2010) 

 

讓cookie失效,方法二:將bgcolor值,清空 
指令:$_COOKIE["變數",""] 

 

範例結果

 

<?php ob_start();
///////////////////////////////////////////////////
echo "//建立背景顏色的cookie:setcookie('bgcolor','pink',time()+1800秒) <br/>";
echo "//建立背景顏色的cookie:setcookie('bgcolor','pink',mktime(0,0,0,10,15,2050) <br/>";
//setcookie("bgcolor","pink",time()+1800);
setcookie("bgcolor","pink",mktime(0,0,0,10,15,2050))
;

///////////////////////////////////////////////////
echo "//查詢cookie的設定值:bgcolor <br/>";
echo "<a href='exp11-1a.php'>查詢cookie的設定值bgcolor</a> <br/>";
echo "<a href='exp11-1b.php'>瀏覽讀取cookie的網頁</a> <br/>";
echo "<a href='exp11-1c.php'>讓cookie失效,方法一:讓bgcolor值,過期</a> <br/>";
echo "<a href='exp11-1d.php'>讓cookie失效,方法二:將bgcolor值,清空</a> <br/>";
echo "<a href='exp11-1.php'>重新設定讓cookie的bgcolor值,pink</a> <br/>";

?>

exp11-1a.php

<?php ob_start();
///////////////////////////////////////////////////
///////////////////////////////////////////////////
if(isset($_COOKIE["bgcolor"])) echo "cookie變數bgcolor的內容為:".$_COOKIE["bgcolor"];
else echo "cookie變數bgcolor,不存在";

?>

exp11-1b.php

<style>
body{
background-color:<?php
if(isset($_COOKIE["bgcolor"])) echo $_COOKIE["bgcolor"];
else echo "yellow";
?>

}
</style>

exp11-1c.php

<?php ob_start();

if(isset($_COOKIE["bgcolor"])) {
// echo "已經將cookie變數bgcolor過期,7600秒(60分)了:";
// setcookie("bgcolor","pink",time()-7600);
echo "已經將cookie變數bgcolor過期,2010年10月15)了:";
setcookie("bgcolor","pink",mktime(0,0,0,10,15,2010));
}
else echo "cookie變數bgcolor,不存在";

?>

exp11-1d.php

<?php ob_start();
if(isset($_COOKIE["bgcolor"])) {
echo "已經將cookie變數bgcolor,清空了:";
setcookie("bgcolor","");
}
else echo "cookie變數bgcolor,不存在";

?>

2

cookie陣列 

cookie指令:setcookie("\array["變數"]","內容","保存期限","路徑","網域","安全") 
後面三個可以省略 
注意,這裡陣列,前面不需要$ 


建立背景顏色的cookie:
setcookie('mycolor[0]','pink',time()+1800秒) 

建立文字顏色的cookie:
setcookie('mycolor[1]','pink',mktime(0,0,0,10,15,2020) 

讀取cookie指令:$_COOKIE["變數"] 

接收cookie變數:$_COOKIE['bgcolor']

讓cookie失效,方法一:讓bgcolor值,過期 
指令一:$_COOKIE["變數","內容",time()-1800秒] 
指令二:$_COOKIE["變數","內容",mktime(0,0,0,10,15,2010) 

讓cookie失效,方法二:將bgcolor值,清空 
指令:$_COOKIE["mycolor[bg]",""] 


範例結果

<?php ob_start();
echo "//建立背景顏色的cookie:setcookie('mycolor[0]','pink',time()+1800秒) <br/>";
echo "//建立文字顏色的cookie:setcookie('mycolor[1]','pink',mktime(0,0,0,10,15,2020) <br/>";
//setcookie("mycolor[bg]","pink",time()+1800);
setcookie("mycolor[bg]","pink",mktime(0,0,0,10,15,2050));
setcookie("mycolor[txt]","blue",mktime(0,0,0,10,15,2050));

///////////////////////////////////////////////////
echo "//查詢cookie的設定值:bgcolor <br/>";
echo "<a href='exp11-2a.php'>查詢cookie的設定值bgcolor</a> <br/>";
echo "<a href='exp11-2b.php'>瀏覽讀取cookie的網頁</a> <br/>";
echo "<a href='exp11-2c.php'>讓cookie失效,方法一:讓bgcolor值,過期</a> <br/>";
echo "<a href='exp11-2d.php'>讓cookie失效,方法二:將bgcolor值,清空</a> <br/>";
echo "<a href='exp11-2.php'>重新設定讓cookie的mycolor的bg,txt顏色值,pink</a> <br/>";

?>

exp11-2a.php

<?php ob_start();
if(isset($_COOKIE['mycolor']['bg']) and isset($_COOKIE['mycolor']['txt'])){
echo "cookie變數mycolor的背景顏色內容為:".$_COOKIE['mycolor']['bg'];
echo "<br/>cookie變數mycolor的文字顏色內容為:".$_COOKIE['mycolor']['txt'];
}else{
echo "COOKIE變數不存在";
}

?>

exp11-2b.php

<style>
body{

background-color:<?php
if(isset($_COOKIE['mycolor']['bg']) and isset($_COOKIE['mycolor']['txt'])){
echo $_COOKIE["mycolor"]["bg"];
}else{
echo "yellow";
}

?>;
color:<?php
if(isset($_COOKIE['mycolor']['bg']) and isset($_COOKIE['mycolor']['txt'])){
echo $_COOKIE["mycolor"]["txt"];
}else{
echo "red";
}
?>;

}
</style>

exp11-2c.php

<?php ob_start();
if(isset($_COOKIE['mycolor']['bg']) and isset($_COOKIE['mycolor']['txt'])){
// echo "已經將cookie變數bgcolor過期,7600秒(60分)了:";
// setcookie("mycolor[bg]","pink",time()-7600);
echo "已經將cookie變數mycolor過期,2010年10月15)了:";
setcookie("mycolor[bg]","pink",mktime(0,0,0,10,15,2010));
setcookie("mycolor[txt]","blue",mktime(0,0,0,10,15,2010));
}
else echo "cookie變數mycolor,不存在";

?>

exp11-2d.php

<?php ob_start();
if(isset($_COOKIE['mycolor']['bg']) and isset($_COOKIE['mycolor']['txt'])){
echo "已經將cookie變數mycolor,清空了:";
setcookie("mycolor[bg]","");
setcookie("mycolor[txt]","");

}
else echo "cookie變數mycolor,不存在";

?>

3

設定cookie後,關閉瀏覽器再開啟,文字顏色設定還在


三個if判別,(1)不是第一開啟網頁,根據下拉式選單的顏色顯示:
if(isset(\$_POST["selcolor"])){

三個if判別,(2)第一次開啟網頁,但已經有cookie設定:
if(isset(\$_COOKIE["cookiecolor"])){

三個if判別,(3)第一次開啟網頁,也沒有cookie設定,則文字顏色為黑色:else{}


 

範例結果

<?php
ob_start();
if(isset($_POST["selcolor"])){
//不是第一開啟網頁,根據下拉式選單的顏色顯示,並設定cookie
$mycolor = $_POST["selcolor"];
//設定cookie
}else if(isset($_COOKIE["cookiecolor"])){

//第一次開啟網頁,但已經有cookie設定
$mycolor = $_COOKIE["cookiecolor"];
}else{
//第一次開啟網頁,也沒有cookie設定,則文字顏色
為黑色
$mycolor = "black";
}

//設定cookie:
setcookie("cookiecolor",$mycolor,time()+36000);
?>

<style>
body{
font-size:18px;
}
p{
text-align:center;
color:<?php echo $mycolor; ?>;
}
h2{
text-align:center;
color:<?php echo $mycolor; ?>;
}
.author{
text-align:right;
color:<?php echo $mycolor; ?>;
}
div{
float:left; /* 讓區塊與下個區塊由左至右排列 */
margin:10px;
}
</style>

4

session:儲存於伺服器端,不用擔心用戶禁用session的問題,但計錄檔案的負荷由伺服器承擔 
用途;重要或機密資訊,例如(用戶登入帳號,記錄購物車) 

缺點1:如果關閉瀏覽器過久(超過24分鐘),session的生命週期就結束
缺點2:若沒有關閉瀏覽器,但超過24分鐘沒有動作瀏覽器,session的生命週期也會結束
改善時間週期:若要延長24分鐘的限制,必須修改伺服器的php.ini設定

限制1:同一瀏覽器的前後網頁之間,才能彼此傳遞參數

 

一、啟用 Session : session_start() 
二、給變數值並記錄在伺服器上:$_SESSION['UserName']='Jordan'; 
三、取得 session 的值,使用 $_SESSION["變數名稱"]:echo $_SESSION['UserName'];
四、刪除 session:unset($_SESSION['變數名稱']);
或是session_destroy(); 


設定第一次登入的session變數:
$_SESSION['comeintime']=time () 

注意:$_SESSION["comeintime2"] 是字串,不是時間 
注意: 將$_SESSION["comeintime2"] 字串,轉換成時間 
注意:但是不能直接印出$date1,因為它的形態是時間,不是字串 

注意:要將時間轉成造成是:$date1->format('Y年n月j日 G時i分s秒') 

注意:結論:session是字串 
注意:不可寫成 $_SESSION['comeintime2'] = $date1;

 

讀取session變數指令:$_SESSION["變數"] 
注意:讀取前要先測試,該變數是否存在
if(isset($_SESSION["變數"]))..else... 


注意:$_SESSION["comeintime2"] 是字串,不是時間 
注意:要將時間轉成造成是:$date1->format('Y年n月j日 G時i分s秒') 
結論:session是字串 
所以要將session是字串 => 轉成時間 => 再轉成字串顯示format() 


日期時間的比較 diff()
$date2 = new DateTime();
$timediff = $date1->diff($date2);
$timediff->format('%h 時 %i 分 %s 秒');

 

讓session失效,方法一:刪除全部:session_unset() 

讓session失效,方法二:刪除某個:unset($_SESSION['x']) 

讓session失效,方法一:刪除全部:session_destroy() 


範例結果

<?php session_start();
echo "///////////////////////////////////////////////////<br/>";
echo "//一、啟用 Session : session_start() <br/>";
echo "//二、給變數值並記錄在伺服器上:\$_SESSION['UserName']='Jordan'; <br/>";
echo "//三、取得 session 的值,使用 \$_SESSION[\"變數名稱\"]:echo \$_SESSION['UserName'];<br/>";
echo "//四、刪除 session:unset(\$_SESSION['變數名稱']);或是session_destroy(); <br/>";

echo "<br/><br/>";
///////////////////////////////////////////////////
echo "//設定第一次登入的session變數:\$_SESSION['comeintime']=time () <br/>";
echo "//注意,若要使用日期時間前,務必要先設定時區,方法一: date_default_timezone_set('Asia/Taipei'),日本是Asia/Tokyo <br/>";
echo "//方法二: \$timezone = new DateTimeZone('Asia/Taipei');<br/>";

//date_default_timezone_set('Asia/Taipei');
$timezone = new DateTimeZone('Asia/Taipei');

 

echo "//注意:\$_SESSION[\"comeintime2\"] 是字串,不是時間 <br/>";
echo "//注意: 將\$_SESSION[\"comeintime2\"] 字串,轉換成時間 <br/>";
echo "//注意:但是不能直接印出\$date1,因為它的形態是時間,不是字串 <br/>";
echo "//注意:要將時間轉成造成是:\$date1->format('Y年n月j日 G時i分s秒') <br/>";
echo "//注意:結論:session是字串 <br/>";
echo "注意:不可寫成 \$_SESSION['comeintime2'] = \$date1;<br/>";

if(!isset($_SESSION['comeintime2'])){
//傳統time()寫法
//$_SESSION['comeintime2']=time();

/////////////////////////////////////////////////
//物件時間寫法:
$date1 = new DateTime('now',$timezone);
$_SESSION['comeintime2'] =$date1->format('Y-m-d H:i:s');
//注意:不可寫成 \$_SESSION['comeintime2'] = $date1;
}
///////////////////////////////////////////////////
echo "<br/><br/>";
echo "<a href='exp11-4a.php'>查詢第一次登入本網頁的時間</a> <br/>";
echo "<a href='exp11-4b.php'>查詢至今停留的時間</a> <br/>";
echo "<a href='exp11-4c.php'>刪除session,方法一:unset(\$_SESSION['變數名稱'])</a> <br/>";
echo "<a href='exp11-4d.php'>刪除session,方法二:session_destroy() <br/>";

?>

exp11-4a.php

<?php session_start();
$date1 = new DateTime($_SESSION["comeintime2"]);
echo "你的第一次登入時間為:".$date1->format('Y年n月j日 G時i分s秒');
}else echo "session變數comeintime,不存在";

?>

exp11-4b.php

<?php session_start();
$date1 = new DateTime($_SESSION['comeintime2']);
$date2 = new DateTime();
$timediff = $date1->diff($date2);
echo "<br/>你登入後停留至今的時間有:".$timediff->format('%h 時 %i 分 %s 秒');

}else echo "session變數comeintime,不存在";

?>

exp11-4c.php

<?php session_start();
if(isset($_SESSION['comeintime2'])) {
echo "已經將session變數comintime,刪除了:";
unset($_SESSION['comeintime2']);

}
else echo "cookie變數bgcolor,不存在";

?>

exp11-4d.php

<?php session_start();
if(isset($_SESSION['comeintime2'])) {
echo "已經將session變數全部刪除了:";
session_unset();

}
else echo "cookie變數bgcolor,不存在";

?>

 

 
Chp12. 物件變數,物件變數陣列
練習範例 12-1物件變數(建構子函數,解構子函數) 12-2物件變數的簡易宣告(設定網頁背景顏色,文字顏色) 12-3物件變數的static function,物件常數的引用 12-4兩種物件陣列:班上同學資料(姓名,電話,LineID)
12-5雲端主機,判別下拉選單是第幾個(阿Q桶麵查詢價錢庫存) 12-6雲端主機計算物件陣列,計算各科全班平均成績 12-7物件陣列(把陣列當作物件來操作):ArrayObject(陣列)

1

class 名稱{....} 
member: public $a1; 公有成員
member: var $a1; 公有成員(就是public)
member: private $a1;私有成員(只能被其定義的類別存取)
method: public function show(){....}
method: public可以省略{

method: 給定起始值:建構子函數:function __construct($a1='',$a2=0,$a3=0){...』
method: 建構子函數,若要能夠允許沒有給定起始值的宣告,必須給定預設值,例如$a1='',$a2=0 

method: 解構子函數,釋放物件變數:function __destruct(){$this->name = NULL;} 
method: 設定member變數值,$this->name = $a1

宣告物件變數:$my = new phone()
使用物件method: $my->show()
釋放物件變數:$my = NULL;

 

範例結果

 

範例12-1:物件變數(建構子函數,解構子函數)

<?php
//////標準寫法/////////////////////////////////////////////
class phone{
var $name;
public $price;
public $num;
public function __construct($a1="",$a2=0,$a3=0){
$this->name = $a1;
$this->price = $a2;
$this->num = $a3;
}
public function __destruct(){
$this->name = NULL;
$this->price = NULL;

$this->num = NULL;
echo "<br/>宣告的物件變數已經被釋放了";
}
public function show(){
echo "你要購買的手機是".$this->name.",數量是".$this->num.",單價為".$this->price;
}
}

//////////////////////////////////////////////////
$myp1 = new phone();
$myp1->name = "iphoneX手機";
$myp1->price = 35000;
$myp1->num = 2;
$myp1->show();

echo "<br/><br/>";
$myp2 = new phone('Samsung Galaxy Note 8手機',30000,5);
$myp2->show();

echo "<br/><br/>";
$myp1 = NULL;
$myp2 = NULL;

echo "//物件變數的比較 ==, === <br/>";
echo "兩個物件變數宣告內容一樣,兩種符合(==),但是還是兩個物件(不符合===) <br/>";
echo "讓物件2=物件1,則兩者(符合===)(符合==) <br/>";
/////////////////////////////////////////////////////////////
$myp4 = new phone('Samsung Galaxy Note 8手機',30000,5);

$myp5 = new phone('Samsung Galaxy Note 8手機',30000,5);

$myp6 = $myp5;
///4-5//////////////////////////////////
if($myp4==$myp5)echo "$myp4 == $myp5 <br/>";
else echo "$myp4 != $myp5 <br/>";
if($myp4===$myp5)echo "$myp4 === $myp5 <br/>";
else echo "$myp4 !== $myp5 <br/>";

//5-6///////////////////////////////////
if($myp6==$myp5)echo "$myp6 == $myp5 <br/>";
else echo "$myp6 != $myp5 <br/>";
if($myp6===$myp5)echo "$myp6 === $myp5 <br/> <br/>";
else echo "$myp6 !== $myp5 <br/>";

☎成果範例1:結果範例

☎程式碼1:程式碼


☎成果範例2:結果範例

☎程式碼2:程式碼

2

物件變數的簡易宣告
簡易物件變數宣告
member:用var取代public
function:不需要寫public

 

範例結果

範例12-2物件變數的簡易宣告(設定網頁背景顏色,文字顏色)

<?php
//////簡易寫法/////////////////////////////////////////////
class webpage{
var $title;
var $bgcolor;
var $txtcolor;
var $h1txt;
function __construct($a1="標題",$a2="white",$a3="black",$a4="測試"){
$this->title = $a1;
$this->bgcolor = $a2;

$this->txtcolor = $a3;
$this->h1txt = $a4;
}
function __destruct(){
$this->title = NULL;
$this->bgcolor = NULL;
$this->txtcolor = NULL;
$this->h1txt = NULL;

}
function show(){
$str = "<!DOCTYPE html><html xmlns='http://www.w3.org/1999/xhtml'><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title>".$this->title."</title><style>body{ background-color:".$this->bgcolor."; color:".$this->txtcolor.";}</style></head><body><h1>".$this->h1txt."</h2></body></html>";
echo $str;
}
}

//////////////////////////////////////////////////
//$myweb = new webpage("網頁物件","gray","purple","物件變數的宣告與呼叫");
//$myweb = new webpage("新年祝福","blue","white","心想事成,事事如意");
$myweb = new webpage("生日祝福","pink","darkgreen","福如東海,壽比南山");
$myweb->show();

?>

☎成果範例:結果範例

☎程式碼:程式碼

3 範例12-3物件變數的static function,物件常數的引用

物件變數的static function不需要宣告,直接用類似呼叫普通function的方式使用 
定義法: static function cubic(){...} 

呼叫法: class變數名稱::cubic(); 

範例: mymath::cubic(); 

 


物件常數(pi) 
定義法:const pi=3.14
物件常數在class外部的引用法: class變數名稱::pi 
範例: mymath::pi 

物件常數在class內部的引用法:self::pi 

 

☎成果範例:結果範例

範例12-3物件變數的static function

<?php
/////////////////////////////////////////////////////////////
class mymath{
const pi=3.14;
static function cubic($a1){
return $a1*$a1*$a1;
}
static function circlearea($a1){
return self::pi*$a1*$a1;
}

}
/////////////////////////////////////////////////////////////
echo "// 計算三次方///////////////////////////////////////////////////<br/>";
$num =5;
echo $num."的三次方是".mymath::cubic($num);

echo "<br/><br/>";
/////////////////////////////////////////////////////////////
echo "// 計算圓形面積///////////////////////////////////////////////////<br/>";
$num =5;
echo "半徑".$num."的圓形面積是".mymath::circlearea($num);

?>

☎成果範例:結果範例

☎程式碼:程式碼

4

範例12-4兩種物件陣列:班上同學資料(姓名,電話,LineID) 

第一種物件陣列 :
不需要宣告陣列,直接設定元素
$stu[0]= new student(... 
$stu[1]= new student(..) 

第二種物件陣列
$member = array(new student(...),new student(...),new student(...)) 

物件陣列的迴圈:物件陣列的代號是 $member 
foreach($member as $i=>$v){...} 

 

範例結果

範例12-4兩種物件陣列:班上同學資料(姓名,電話,LineID) 

<?php
class student{
var $name;
var $tel;
var $line;
function __construct($a1="",$a2="",$a3=""){
$this->name=$a1;
$this->tel=$a2;
$this->line=$a3;
}
function __destruct(){
$this->name=NULL;
$this->tel=NULL;
$this->line=NULL;
}
}
echo "////第一種物件陣列//////////////////////////////////////////////// <br/>";
$stu[0]= new student("李大同","0936-456741","tom234");
$stu[1]= new student("張花花","0925-753951","jolin987");
$stu[2]= new student("林美美","0942-654852","julie22");

//印出全班姓名
for($i=0;$i<=2;$i++){
echo "全班姓名:".$stu[$i]->name.", ";
}

echo "/////第二種物件陣列/////////////////////////////////////////////// <br/>";
$member = array(new student("李大同","0936-456741","tom234"),
new student("張花花","0925-753951","jolin987"),
new student("林美美","0942-654852","julie22"));

//印出全班姓名,電話
foreach($member as $i=>$v){
echo $member[$i]->name.", ".$member[$i]->tel."<br/>";
}

?>


☎成果範例1:結果範例

☎程式碼1:程式碼


☎成果範例2:結果範例

☎程式碼2:程式碼

5

範例12-5:傳回雲端主機,判別下拉選單是第幾個

1.觀念:php沒有onchange()事件,都必須由form-action-submit傳送

2.觀念:php不能夠寫到javascript程式碼區內,彼此不相容

3.觀念:若表單元件要直接呼叫php,只能用ajax事件

 

4.如何得到selectedIndex(I):將option 的value設定為0,1,2,3..,那麼由\$_POST得到的就是selectedIndex

 

5.如何得到selectedIndex(II):不然就要while(list(..) = each(..){比對選到的intm名稱與物件資料名稱一樣時的\$key,就是selectedIndex

6.php讀取select的name名稱,數值為value

 

6.如何在php設定表單select的選項:在option內判斷,若選到就顯示selected
例如:<option value="阿Q桶麵" <?php if($key==0){echo 'selected';}?>阿Q桶麵</option>

 

7.如何在php設定input-text的內容:在input內的value='...'
例如:<input type="text" class="form-control" name="num" value="<?php echo $mynum;?>">

 

範例結果

範例12-5:雲端主機,判別下拉選單是第幾個(阿Q桶麵查詢價錢庫存)

<?php
///class////////////////////////////////
class product{
var $name;
var $price;
var $num;
function __construct($a1="",$a2=0,$a3=0){
$this->name = $a1;
$this->price = $a2;
$this->num = $a3;
}
function __destruct(){
$this->name=NULL;
$this->price=NULL;
$this->num=NULL;
}
}// end class
///////////////////////////////////
$myp = array(new product("阿Q桶麵",30,560),
new product("可口可樂",15,150),
new product("義美水餃",85,50),
new product("鐵路便當",50,30));

$selname="";
$myprice = 0;
$mynum = 0;
$key =0;

//讀取selection的數值//////////////////////////////////////////////
if(isset($_POST['list01name'])){
$selname = $_POST['list01name'];
while(list($i,$v) = each($myp)){
if($myp[$i]->name==$selname){
$myprice = $myp[$i]->price;
$mynum = $myp[$i]->num;
$key = $i;

break;
}
}// end while
}// end if isset

?>

<select class="col-sm-10" name="list01name" class="form-control" >
<option value="阿Q桶麵" <?php if($key==0){echo 'selected';}?>>阿Q桶麵</option>
<option value="可口可樂" <?php if($key==1){echo 'selected';}?>>可口可樂</option>
<option value="義美水餃" <?php if($key==2){echo 'selected';}?>>義美水餃</option>
<option value="鐵路便當" <?php if($key==3){echo 'selected';}?>>鐵路便當</option>
</select>

 

<div class="col-sm-10"><input type="text" class="form-control" name="price" value="<?php echo $myprice;?>"></div>

☎成果範例:結果範例

☎程式碼:程式碼

6

 

範例12-6:雲端主機計算陣列,計算各科全班平均成績

1.前端網頁用多個陣列stuname[],數學math[],英文english[]

2.如何把前端陣列,變成後端的物件陣列:用迴圈foreach(){$stu[$i] = new student($_POST['陣列'][$i],$_POST['陣列'][$i],$_POST['陣列'][$i]);

 

3.如何更新畫面上最新的input text 數學,英文的輸入數值:在
<input type="text" name="math[]" value="<?php if(isset($_POST['stuname'])){echo $_POST['math'][0];}else echo 85;?>">

 

範例結果

範例12-6:雲端主機計算陣列,計算各科全班平均成績

<?php
class student{
var $name;
var $math;
var $english;
function __construct($a1="",$a2=0,$a3=0){
$this->name = $a1;
$this->math = $a2;
$this->english = $a3;
}
}// end class
// 設定 stu物件變數陣列/////////////////////////////////////////////////////
$avgmath =0;
$avgenglish =0;

if(isset($_POST['stuname'])){
foreach($_POST['stuname'] as $i=>$v){
$stu[$i] = new student($_POST['stuname'][$i],$_POST['math'][$i],$_POST['english'][$i]);
}// end foreach

//////計算全班數學,英文平均//////////////////////////////////
$temp1=0;
$temp2=0;
foreach($stu as $i=>$v){
$temp1 += $stu[$i]->math;
$temp2 += $stu[$i]->english;
}
$avgmath =$temp1/count($stu);
$avgenglish =$temp2/count($stu);

//////更新最新的input text 數學,英文輸入數值////////////////////////////////

}// end if(isset())

?>

<input type="text" size="6" maxlength="3 class="form-control" name="math[]" value="<?php if(isset($_POST['stuname'])){echo $_POST['math'][0];}else echo 85;?>">

 

<div class='row'>
<label class='col-sm-offset-1 col-sm-3 bg-info text-center'>全班平均成績</label>
<label class='col-sm-3 bg-danger text-center'><?php echo $avgmath; ?></label>
<label class='col-sm-3 bg-success text-center'><?php echo $avgenglish; ?></label></div>

☎成果範例:結果範例

☎程式碼:程式碼

7

範例12-7物件陣列(把陣列當作物件來操作):ArrayObject(陣列)

範例結果

物件陣列(把陣列當作物件來操作):ArrayObject(陣列)
物件陣列:$a=new ArrayObject()
印出物件陣列:print_r($a)
印出物件陣列:var_dump($a)

取出值:->offsetGet:$objay->offsetGet(2)

非編號指標物件陣列取出值,offsetGet:$objay->offsetGet('李大同')

計算物件陣列ArrayObject的數目:$a->count()

foreach迴圈印出物件陣列ArrayObject: foreach($arrayObj as $i=>$v){)

新增一個元素到ArrayObject陣列最後:->append(元素1)

新增二個元素以上到ArrayObject陣列最後:->append(陣列),或是->append(array(元素1,元素2))

檢查某個指標(文字或編號)是否存在:->offsetExists(編號)

修改某個指標(文字或編號)的內容:->offsetSet(編號,數值)

前往某個指標(編號):$iterator->seek(編號)

到下一筆:$iterator->next()
到第一筆:$iterator->rewind()
目前指標:$iterator->key()
目前內容:$iterator->current()

 

範例結果

 

ArrayObject物件陣列若要用->取出值,則宣告時必須:
= new ArrayObject($data, ArrayObject::ARRAY_AS_PROPS)

若是宣告成$arrayObj = new ArrayObject($data);,
不能用->,必須用->offsetGET()

ArrayObject物件陣列= new ArrayObject($data, ArrayObject::ARRAY_AS_PROPS)

計算物件陣列ArrayObject的數目:count(陣列)


印出全部:物件陣列ArrayObject的數目:var_dump(陣列)

印出全部物件陣列1
foreach($arrayObj as $i=>$v){)

ArrayObject物件陣列,不能使用二維陣列

範例12-7物件陣列(把陣列當作物件來操作):ArrayObject(陣列)

<?php

$fruit = array(1=>"Orange","Banana","Grape","Apple","Flower");

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//取出值:->offsetGet:\$objay->offsetGet(2)<br/>";
echo "<br/>offsetGet印出第2個".$objay->offsetGet(2);
echo "<br/>offsetGet印出第2個:\$objay->2 出現錯誤";

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//非編號指標物件陣列取出值,offsetGet:\$objay->offsetGet('李大同')<br/>";
$score["李大同"] = 90;
$score["張花花"] = 85;
$score["林美美"] = 60;
$score["宋妮妮"] = 99;
$score["吳盼盼"] = 75;
$objary2 = new ArrayObject($score);
echo "<br/>offsetGet印出李大同分數".$objary2->offsetGet('李大同');

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "物件陣列的數目有".$objay->count();
echo "<br/>物件陣列的數目有".count($objay);

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//foreach迴圈印出物件陣列ArrayObject: foreach(\$arrayObj as \$i=>\$v){)<br/>";
foreach($objay as $i=>$v){
echo $i.':'.$v."<br/>";
}

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//新增一個元素到ArrayObject陣列最後:->append(元素1)<br/>";
$objay->append("mango");
print_r($objay);

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//新增二個元素以上到ArrayObject陣列最後:->append(陣列),或是->append(array(元素1,元素2))<br/>";
$objay->append(array("lemon","papaya"));
print_r($objay);

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//檢查某個指標(文字或編號)是否存在:->offsetExists(編號) <br/>";
$data = array('name'=>'張花花','email'=>'huahua@domain.com','score'=>70);
$objay = new ArrayObject($data);
echo '檢查:score指標是否存在?:'. $objay->offsetExists('score')."<br/>";

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//修改某個指標(文字或編號)的內容:->offsetSet(編號,數值) <br/>";
$objay = new ArrayObject($score);
$objay->offsetSet('李大同','0');
echo '李大同最新的分數:'. $objay->offsetGet('李大同')."<br/>";

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//前往某個指標(編號):\$iterator->seek(編號) <br/>";
$objay = new ArrayObject($score);
$iterator = $objay->getIterator();
if($iterator->valid()){

$iterator->seek(3);
echo '宋妮妮最新的分數:'.$iterator->current();
}

echo "////////////////////////////////////////////////////////////////////<br/>";
echo '到下一筆'."<br/>";;
$iterator->next();
echo '目前指標:'.$iterator->key()."<br/>";;
echo '目前內容:'.$iterator->current()."<br/>";;
echo '到第一筆'."<br/>";;
$iterator->rewind();
echo '目前指標:'.$iterator->key()."<br/>";;
echo '目前內容:'.$iterator->current()."<br/>";;

 

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "////////////////////////////////////////////////////////////////////<br/>";
$data = array('name'=>'張花花','email'=>'huahua@domain.com','score'=>70);
$arrayObj = new ArrayObject($data, ArrayObject::ARRAY_AS_PROPS);

echo "//計算物件陣列ArrayObject的數目:count(陣列)<br/>";
echo "物件陣列的數目有".count($arrayObj);

echo "印出全部物件陣列".var_dump($arrayObj);
echo "<br/><br/>印出全部物件陣列".print_r($arrayObj);

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//foreach迴圈印出物件陣列ArrayObject
foreach($arrayObj as $i=>$v){
echo $i.':'.$v."<br/>";
}

echo "////////////////////////////////////////////////////////////////////<br/>";
echo "//ArrayObject物件陣列,不能使用二維陣列 <br/>";

☎成果範例:結果範例

☎程式碼:程式碼

 

 
Chp20. 讀取資料庫前要先學習SQL語法
目錄 1.w3school的SQL語法教學(英文) 2.w3school的SQL語法教學(中文)
  w3school的SQL語法教學

1.w3school的SQL語法教學(英文)

2.w3school的SQL語法教學(中文)

下載資料庫

     
 
 
Chp13. PHP讀取資料庫方法一:程序導向的介面:mysqli_connect(),mysqli_query(), mysqli_fetch_array()
練習範例 13-1讀取第1,2筆記錄,計算筆數 13-2讀取資料庫全部記錄 13-3讀取記錄分頁顯示 13-4印出所有資料,分頁顯示(首頁,上頁,下頁,尾頁)
  13-5點按標題,自動排序 13-6SQL 語法:函數計算筆數,計算最大值,計算最低值,計算總和,計算平均值 13-7新增一筆記錄到資料表 13-8刪除一筆記錄
  13-9修改一筆記錄 13-10新增一筆記錄(避免SQL Injection,輸入一些特殊字元而逃過檢查,而造成正常登入)) 13-11留言板card
關鍵程式碼(頭尾連線物件) mysql.inc.php mysqlclose.inc.php    
關鍵程式碼(一般) 查詢所有記錄 查詢關鍵字 查詢根據某欄位排序
  新增一筆記錄 刪除一筆記錄 修改一筆記錄  
  總共幾筆記錄 總共幾個欄位 查詢結果一次給定陣列 查詢結果迴圈給定陣列
關鍵程式碼(SQL Injection ) 查詢所有記錄 新增一筆記錄 刪除一筆記錄 修改一筆記錄
關鍵程式碼(表格呈現) 查詢顯示全部(1)不分頁,bootstrap,沒排序 查詢顯示顯示分頁-沒排序-沒刪除修改 查詢顯示顯示分頁-有排序-沒刪除修改  
  查詢顯示顯示分頁-有排序-有刪除修改      
關鍵程式碼(輸入文字按鈕) 一組輸入文字方塊+按鈕(1)按鈕後,文字會不見 一組輸入文字方塊+按鈕(2)按鈕後,文字保留 兩組輸入文字方塊,一個按鈕(在同一行)  
關鍵程式碼(留言板card) 留言板card顯示全部(1) 留言板card顯示全部(2) 留言板card顯示分頁  
關鍵程式碼(其它) 查詢資料表,顯示全部(不分頁,bootstrap) 查詢資料表,顯示全部(分頁,排序,bootstrap)    
  新增刪除修改一筆(分頁,bootstrap)      
下載練習mySQL資料庫 下載資料庫      
 

關鍵程式碼(mysql.inc.php)

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

<?php
//資料庫設定
$dbServer = "localhost";
$dbUser = "root";
$dbPass = "密碼";
$dbName = "資料庫";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");
?>

 

關鍵程式碼(mysql.inc.php)

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

<?php
////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接

?>

 

關鍵程式碼

//引入資料庫設定檔案
require_once("mysql.inc.php");
//include mysql.inc.php

 

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

<?php
header('Content-Type: text/html; charset=utf-8');

//引入資料庫設定檔案
require_once("mysql.inc.php");

// 【書籍】欄位
$sql = "SELECT 書籍名稱,價格 FROM books WHERE 價格 > 400";
$result = mysqli_query($conn, $sql);

//使用表格顯示資料
echo '以下是價格大於 400 的書籍<br />
<table border="1"><tr><th>書籍名稱</th><th>價格</th></tr>';

//使用迴圈逐筆讀取記錄
while ($row = mysqli_fetch_array($result)) {
echo "<tr><td> $row[0] </td><td> $row[1] </td></tr>";
}

echo '</table>';

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");
?>

 

總共幾筆記錄

$num = mysqli_num_rows($result);

<?php
$sql="SELECT * FROM books";
$result=mysqli_query($conn, $sql);
//取得查詢結果的筆數
$num = mysqli_num_rows($result);

?>

 

總共幾個欄位

$num = mysqli_num_fields($result);

<?php
$sql="SELECT * FROM books";
$result=mysqli_query($conn, $sql);
//欄位數目
$num = mysqli_num_fields($result);

?>

 

查詢結果一次給定陣列

$rowall
= mysqli_fetch_all($result,MYSQLI_ASSOC);

<?php
$sql="SELECT * FROM books";
$result=mysqli_query($conn, $sql);
//查詢結果一次給定陣列
$rowall = mysqli_fetch_all($result,MYSQLI_ASSOC);

?>

MYSQLI_ASSOC:文字欄位
MYSQLI_NUM:數字欄位
MYSQLI_BOTH:兩者都有

 

查詢結果迴圈給定陣列

$row[]=
mysqli_fetch_array($result,MYSQLI_ASSOC)

<?php
$sql="SELECT * FROM books";
$result=mysqli_query($conn, $sql);
//查詢結果迴圈給定陣列
while($row[]=mysqli_fetch_array($result,MYSQLI_ASSOC)){
$str =$row['書籍名稱'];
}

?>

$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
MYSQLI_ASSOC:文字欄位
MYSQLI_NUM:數字欄位
MYSQLI_BOTH:兩者都有

1

 

PHP讀取資料庫三種方法:

方法一:程序導向的介面():mysqli_connect(),mysqli_query(), mysqli_fetch_array()
方法二:物件導向的介面():mysqli::__construct(),mysqli::query(), mysqli_result::fetch_array()
方法三:物件導向的介面()-PDO:PDO::__construct(),PDO::query(), PDOStatement::fetch()


方法一:程序導向的介面(

將查詢回傳的陣列設定為 $row 陣列:
$row = mysqli_fetch_array($result);
第1筆記錄的欄位:$row['姓名']
第1筆記錄的欄位:$row[0]

 

//第2筆記錄
再執行一次 $row 陣列:
$row = mysqli_fetch_array($result);
第2筆記錄的欄位:$row['姓名']

 

//最後一筆記錄
重複執行 $row 陣列:
$row = mysqli_fetch_array($result);

最後一筆記錄,上述這個執行會傳回false(沒有資料庫記錄值)
也就是($row = mysqli_fetch_array($result))=false;

應用:所以把所有資料迴圈一次,可以用while($row = mysqli_fetch_array($result)){.....};

因為一旦false就不會再執行迴圈while了

 

總共幾筆記錄
總共幾筆記錄 =

$num = mysqli_num_rows($result);

判別是否查到資料
if(mysqli_num_rows(\$result)>0){...}

兩種查詢的指令,都可以
(1)使用 mysqli_fetch_row() 讀取一筆記錄,
(2).使用 mysqli_fetch_array() 讀取一筆記錄,

將查詢回傳的陣列設定為 $row 陣列:
$row = mysqli_fetch_row($result);

 

範例結果

 

<?php
header('Content-Type: text/html; charset=utf-8');

//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫名稱";
$dbUser = "root";
$dbPass = "密碼";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT * FROM 員工");

//--------- 讀取第 1 筆記錄 ---------------
//使用 mysqli_fetch_array() 讀取一筆記錄,
$row = mysqli_fetch_array($result);
//以數字索引取得欄位資料
echo "<p>第 1 筆記錄的第 1 個欄位:$row[0]";
echo "<br>第 1 筆記錄的第 2 個欄位:$row[1]";
echo "<br>第 1 筆記錄的第 2 個欄位:$row[2]";
echo "<br>第 1 筆記錄的第 2 個欄位:$row[3]";

//以欄位名稱字串為索引取得資料
echo "<br>第 1 筆記錄的【姓名】欄位:". $row['姓名'];
echo "<br>第 1 筆記錄的【地址】欄位:".$row['地址']."</p>";

echo "//////第2筆記錄//////////////////////////////////////////////// <br/>";
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
echo "第 2 筆記錄的【姓名】欄位:". $row['姓名'];
echo "<br>第 2 筆記錄的【地址】欄位:".$row['地址']."</p>";


echo "/////總共幾筆記錄/// <br/>";
/////////////////////////////////////
$num = mysqli_num_rows($result);
echo "總共幾筆記錄:". $num;

echo "/////判別是否查到資料//////////////////////////////////// <br/>";
echo "//if(mysqli_num_rows(\$result)>0){...}; <br/>";

////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接

?>

2

印出所有查詢的資料


讀取第全部記錄
應用,所以把所有資料迴圈一次,可以用
while($row = mysqli_fetch_array($result)){.....};

因為一旦false就不會再執行迴圈while了

注意:SQL語法:其中的分隔必須是,不能說中文,

 

範例結果

<?php
header('Content-Type: text/html; charset=utf-8');

//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫名稱";
$dbUser = "root";
$dbPass = "密碼";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT 姓名,職稱,出生日期,地址,電話號碼 FROM 員工");

echo "<table border=1><tr><th>姓名</th><th>職稱</th><th>出生日期</th><th>地址</th><th>電話號碼</th></tr>";
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
echo "<tr><td>".$row['姓名']."</td><td>".$row['職稱']."</td><td>".$row['出生日期']."</td><td>".$row['地址']."</td><td>".$row['電話號碼']."</td></tr>";
}
echo "</table>";
////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接


?>

3

 

印出所有資料,分頁顯示(數字頁數超連結)

1.關鍵一:設定一個二維陣列,在迴圈內儲存所有資料表記錄$rowpage[]=mysqli_fetch_array($result

第二位同學的三個欄位:、$rowpage[1][0],$rowpage[1][1],$rowpage[1][2]

2.關鍵二:分頁顯示要設定幾個參數:
//每頁顯示筆數:$numperpage
//全部筆數:$totalnum
//最多頁數:$totalpage
//目前頁數 :$nowpage
//每頁顯示編號的min,max

3.關鍵三:點按頁數的超連結,用$_GET['pagenum']來讀取

 

範例結果

<?php
header('Content-Type: text/html; charset=utf-8');

///////////////////////////////////////////////////
//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫名稱";
$dbUser = "root";
$dbPass = "密碼";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT * FROM books");

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=mysqli_fetch_array($result,MYSQLI_ASSOC)){
}
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = mysqli_num_rows($result); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數

//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pangenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;

if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<br/><br/>";
echo "<table border=1><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr>";
for($i=$min;$i<$max;$i++){
//二維陣列無法用字串連接,要用sprint才行
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);

}
echo "</table>";


echo "前往頁數:";
///顯示頁數//////////////////////////////////////////////
for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo $i." ";
else echo "<a href='exp13-3.php?pangenum=".$i."'>".$i."</a> ";
}
////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接


?>

4

印出所有資料,分頁顯示(首頁,上頁,下頁,尾頁)

1.關鍵一:判斷$nowpage=1不顯示上一頁,$nowpage=最後頁,不顯示下一頁

2.關鍵二:下一頁:"<a href='exp13-4.php?pagenum=".($nowpage+1)

3.關鍵三:若要用按鈕button跳網頁,onclick="javascript:location.href=
'https://tw.yahoo.com/'"

3.關鍵四:但是若button連結網頁要傳遞其它input-text的數值,就要到javascript function內,才能取值
function gopage(){
location.href = "exp13-4.php?pagenum=" + mynum.value;}

4.關鍵五:超連結的單引號內不可再有單引號(必須用雙引號,且前面必須加上\
例如:onclick='javascript:location.href=\"exp13-4.php?pagenum=".($mynum.value).\""'

 

範例結果

<script type="text/javascript">
function gopage(){
location.href = "exp13-4.php?pagenum=" + mynum.value;
}

</script>

<style>
table {border:1px solid black; width:450px;
text-align:center}
.grey {background-color:lightgrey}

.narrow {width:20%}
</style>

</head>

<body>
<?php
header('Content-Type: text/html; charset=utf-8');

/////////////////////////////////////////////////////////
//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫名稱";
$dbUser = "root";
$dbPass = "密碼";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT * FROM books");

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=mysqli_fetch_array($result,MYSQLI_ASSOC)){
}
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = mysqli_num_rows($result); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<br/><br/>";
echo "<table border=1><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr>";
//foreach($rowpage as $i=>$v){
for($i=$min;$i<$max;$i++){
//二維陣列無法用字串連接,要用sprint才行
// echo "<tr><td>“.$rowpage[$i][0]."</td><td>".$rowpage[$i][1]."</td><td>".$rowpage[$i][2]."</td></tr>";
/// 偶數欄位灰色背景//////////////////////////
if($i%2==0){
echo sprintf("<tr class='grey'><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}else{
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}// end if

}
echo "</table>";

///顯示頁數//////////////////////////////////////////////

echo "<a href='exp13-4.php?pagenum=1'>首頁</a> ";

if($nowpage>1)echo "<a href='exp13-4.php?pagenum=".($nowpage-1)."'>上一頁</a> ";

if($nowpage<$totalpage)echo "<a href='exp13-4.php?pagenum=".($nowpage+1)."'>下一頁 </a> ";

echo "<a href='exp13-4.php?pagenum=".$totalpage."'>尾頁</a> ";

echo " 跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' />";

echo "<input type='button' onclick='gopage()' value='前往' />";

////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接

?>

5

 

點按標題,自動排序
1.由小到大:select * from 資料表 order by 欄位 asc

2.由大到小:select * from 資料表 order by 欄位 desc

3.點按標題排序:在表格標題,加上超連結:<th><a href='exp13-5.php?sortcolumn=書籍編號'>書籍編號
然後在讀取$_GET['變數']判讀是否存在:
if(isset($_GET['sortcolumn'])){...}

 

範例結果

//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫名稱";
$dbUser = "root";
$dbPass = "密碼";

//連線資料庫伺服器
$conn = @mysqli_connect($dbServer, $dbUser, $dbPass, $dbName);

if (mysqli_connect_errno($conn))
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
mysqli_set_charset($conn, "utf8");

///讀取要排序的欄位//////////////////
if(isset($_GET['sortcolumn'])){
$sortcolumn = $_GET['sortcolumn'];
}else{
$sortcolumn = "書籍編號";
}

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT * FROM books order by ".$sortcolumn);

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=mysqli_fetch_array($result,MYSQLI_ASSOC)){
}
.........
.........

//顯示表格///////////////////////////////////////////
echo "<br/><br/>";
echo "<table border=1><tr><th><a href='exp13-5.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp13-5.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp13-5.php?sortcolumn=價格'>價格</a></th></tr>";
for($i=$min;$i<$max;$i++){
//二維陣列無法用字串連接,要用sprint才行
/// 偶數欄位灰色背景//////////////////////////
if($i%2==0){
echo sprintf("<tr class='grey'><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}else{
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}// end if

}
echo "</table>";

......................
...................
////釋放記憶體////////////////////////////
mysqli_free_result($result); // 釋放result物件佔用的記憶體
mysqli_close($conn); //關閉資料庫連接


?>

6

 

SQL 語法:函數

1.計算筆數: count(欄位) as 書籍數量

2.計算最大值: max(欄位) as 最高價

3.計算最低值: min(價格) as 最低價

4.計算總和: sum(價格) as 總和價

5.計算平均值: avg(價格) as 平均價

 

範例結果

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT count(書籍編號) as 書籍數量, max(價格) as 最高價, min(價格) as 最低價, sum(價格) as 總和價, avg(價格) as 平均價 FROM books");
7

 

新增一筆記錄到資料表

1.$sql="INSERT 資料表 (書籍名稱, 數量) VALUES ('{$_POST['name']}','{$_POST['qty']}')";
mysqli_query($conn, $sql);

2.SQL 語法字串內若要加入:$_POST['bookname'],只要前後用大括弧即可{$_POST['bookname']}

 

範例結果

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

//新增欄位////

if(isset($_POST['bookname'])){
$sql="INSERT books (書籍名稱, 價格) VALUES ('{$_POST['bookname']}','{$_POST['bookprice']}')";
mysqli_query($conn, $sql);

}

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

8

 

1.刪除一筆記錄:$sql="delete from 資料表 where 欄位=10";

2.判別是否刪除一筆記錄: if(mysqli_affected_rows($conn)>0){....}

3.SQL 語法字串內若要加入:$_POST['bookname'],只要前後用大括弧即可{$_POST['bookname']}

 

範例結果

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

//刪除欄位/////////
if(isset($_GET['delnum'])){
$sql="delete from books where 書籍編號=".$_GET['delnum'];
mysqli_query($conn, $sql);

if(mysqli_affected_rows($conn)>0)
echo "已經刪除了".mysqli_affected_rows($conn)."筆記錄";
else
echo "刪除失敗";
}

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

9

 

1.修改一筆記錄:"update資料表 set 文字欄位='..',數字欄位=5 where 欄位=10

2.判別是否修改一筆記錄: if(mysqli_affected_rows($conn)>0){....}

 

exp13-9.php
exp13-9a.php

 

範例結果

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

//修改欄位///////////
if(isset($_POST['editnum'])){
$sql="update books set 書籍名稱='".$_POST['editname']."',價格=".$_POST['editprice']." where 書籍編號=".$_POST['editnum'];
mysqli_query($conn, $sql);

if(mysqli_affected_rows($conn)>0)
echo "已經修改了".mysqli_affected_rows($conn)."筆記錄";
else
echo "修改失敗";
}

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");
//最後轉換到主網頁
header("Location:exp16-12.html");

10

 

避免SQL Injection
(輸入一些特殊字元而逃過檢查,而造成正常登入)

1.讀取$_POST['..'],$_GET['..']前要先過濾特殊字元:

$sql="INSERT books (書籍名稱, 價格) VALUES (?,?)";

$stmt =
mysqli_prepare($conn,$sql);

// 繫結參數
mysqli_stmt_bind_param($stmt, 'sd',$_POST['bookname'], $_POST['bookprice']);

// 寫入資料庫
mysqli_stmt_execute($stmt);

if (mysqli_affected_rows($conn) > 0){echo '已成功新增一筆記錄';}

 

範例結果

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

//新增欄位////////////////////

if(isset($_POST['bookname'])){
$sql="INSERT books (書籍名稱, 價格) VALUES (?,?)";

$stmt = mysqli_prepare($conn,$sql);

// 繫結參數
mysqli_stmt_bind_param($stmt, 'sd',$_POST['bookname'], $_POST['bookprice']);

// 寫入資料庫
mysqli_stmt_execute($stmt);

if (mysqli_affected_rows($conn) > 0){
echo '已成功新增一筆記錄<br>';
}else {
echo '無法新增<br>';
}// end if
}

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

11

 

留言板card

exp13-11.php
exp13-11a.php
exp13-11b.php

 

留言板新增留言注意:
1.預設可以顯示html標籤
2.但是無法顯示換行,除非htmlspecialchars,nl2br,str_replace轉換
例如:
$message = htmlspecialchars($_POST['message'],ENT_QUOTES);

$message=
str_replace(' ', '&nbsp;&nbsp;', nl2br($message));

 

範例結果

//引入資料庫設定檔案
//include("mysql.inc.php");
require_once("mysql.inc.php");

//查詢【員工】資料表的的資料--過濾特殊字元
$result=mysqli_query($conn, "SELECT * FROM guestbook order by 日期時間 desc");

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=mysqli_fetch_array($result,MYSQLI_ASSOC)){
}

///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=5; //每頁顯示筆數
$totalnum = mysqli_num_rows($result); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
// echo $_GET['pagenum']."<br/>";
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;

$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<button type='button' onClick='javascript:location.href=\"exp13-11a.php\"' class='btn btn-danger float-right'>新增留言</button>";
echo "<h4 class='text-left'>共有<span class='badge badge-success'>".$totalnum."</span>筆留言</h4>";
echo "<hr/>";

for($i=$min;$i<$max;$i++){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$rowpage[$i]['留言編號']."】".$rowpage[$i]['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$rowpage[$i]['日期時間']."</h5>";
echo "<p class='card-text'>".$rowpage[$i]['留言']."</p>";
echo "</div></div>";
}

echo "<br/>";

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp13-11.php?pagenum=1'>首頁</a></li>";
if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp13-11.php?pagenum=".($nowpage-1)."'>上一頁</a></li>";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp13-11.php?pagenum=".$i."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp13-11.php?pagenum=".($nowpage+1)."'>下一頁</a></li>";
echo "<li class='page-item'><a class='page-link' href='exp13-11.php?pagenum=".$totalpage."'>尾頁</a></li>";

echo "<li class='page-item'>&nbsp;&nbsp;跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li>";
echo "</ul> ";
echo "</nav> ";

////釋放記憶體////////////////////////////
require_once("mysqlclose.inc.php");

 

exp13-11b.php
/引入資料庫設定檔案
include("mysql.inc.php");


//新增欄位///////////////////////////////////////////
$date = new DateTime('now',new DateTimeZone('Asia/Taipei'));
$strnowtime = $date->format('Y-m-d H:i:s');

////////////////////////
if(isset($_POST['name'])){
///預設可以顯示html標籤///////
///但是無法顯示換行,除非htmlspecialchars,nl2br,str_replace轉換/////
$name = htmlspecialchars($_POST['name'],ENT_QUOTES);
$message = htmlspecialchars($_POST['message'],ENT_QUOTES);
$message=str_replace(' ', '&nbsp;&nbsp;', nl2br($message));
$sql="INSERT guestbook (姓名,留言,日期時間) VALUES (?,?,?)";
$stmt = mysqli_prepare($conn,$sql);
//mysqli_query($conn, $sql);
// 繫結參數
mysqli_stmt_bind_param($stmt, 'sss',$name, $message,$strnowtime);

// 寫入資料庫
mysqli_stmt_execute($stmt);
if (mysqli_affected_rows($conn) > 0){
echo '已成功新增一筆記錄<br>';
}else {
echo '無法新增<br>';
}// end if
}

/////前往留言板瀏覽全部留言/////////////////////////
header("Location:exp13-11.php");

 

12

 

查詢資料表,顯示全部

(不分頁,bootstrap)

範例結果

//查詢【員工】資料表的的資料
$result=mysqli_query($conn, "SELECT FROM 資料表");
echo "<table border=1><tr><th>姓名</th><th>職稱</th><th>出生日期</th><th>地址</th><th>電話號碼</th></tr>";
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th><th></th></tr></thead><tbody>";
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
echo "<tr><td>".$row['姓名']."</td><td>".$row['職稱']."</td><td>".$row['出生日期']."</td><td>".$row['地址']."</td><td>".$row['電話號碼']."</td></tr>";
}
echo "</table>";

12

 

查詢資料表,顯示全部

(分頁,標題排序,bootstrap)

範例結果

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp13-9.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp13-9.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp13-9.php?sortcolumn=價格'>價格</a></th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

12

 

分頁區

(沒有數字頁,只有頁首,上頁,跳頁)

範例結果

///顯示頁數//////////////////////////////////////////////
echo "<a href='exp13-8.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a> ";
if($nowpage>1)echo "<a href='exp13-8.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a> ";
if($nowpage<$totalpage)echo "<a href='exp13-8.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁 </a> ";
echo "<a href='exp13-8.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a> ";
echo " 跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' />";
//echo "<input type='button' onclick='javascript:location.href=\"exp13-8.php?pagenum=".($mynum.value)."\"' value='前往' />";
echo "<input type='button' onclick='gopage()' value='前往' />";

 

12

 

分頁+bootstrap

(有數字頁,只有頁首,上頁,跳頁)

範例結果

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp13-9.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a></li> ";

if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp13-9.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a></li> ";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp13-9.php?pagenum=".$i."&sortcolumn=".$sortcolumn."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp13-9.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁</a></li> ";
echo "<li class='page-item'><a class='page-link' href='exp13-9.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a></li> ";

echo "<li class='page-item'>跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li> ";
echo "</ul> ";
echo "</nav> ";

12

 

輸入:書名,價格,兩個欄位+一個按鈕

(在同一行)

範例結果

<form class="form-inline" method="post" action="exp13-9.php">
<div class="form-group">
<label for="bookname" >書名:</label>
<input type="text" class="form-control" name="bookname" placeholder="輸入書名">
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="bookprice" >價格:</label>
<input type="text" class="form-control" name="bookprice" placeholder="1">
</div>
<button type="submit" class="btn btn-primary mb-2">新增</button>
</form>

13

 

顯示表格+bootstrap+可刪除+可修改+可排序

範例結果

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp13-9.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp13-9.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp13-9.php?sortcolumn=價格'>價格</a></th><th></th><th></th></tr></thead><tbody>";
//foreach($rowpage as $i=>$v){
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td><a href='exp13-9.php?delnum=%s'>刪除</a></td><td><a href='exp13-9a.php?editnum=%s&editname=%s&editprice=%s'>修改</a></td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

14

 

留言板card顯示面板

範例結果

for($i=$min;$i<$max;$i++){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$rowpage[$i]['留言編號']."】".$rowpage[$i]['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$rowpage[$i]['日期時間']."</h5>";
echo "<p class='card-text'>".$rowpage[$i]['留言']."</p>";
echo "</div></div>";
}

 

 

 
Chp14. PHP讀取資料庫方法二:物件導向的介面:$mysqli->query($sql), $result->fetch_array()
上課範例 14-1使用w3cschool的PHP連線mySQL模板測試連線 14-2使用w3cschool的PHP連線mySQL模板讀取資料表 14-3單筆方式讀取資料庫 14-4迴圈輸出全部資料(while)
14-5迴圈輸出全部資料(foreach) 14-6以表格方式顯示資料庫(while) 14-7以表格方式顯示資料庫(foreach) 14-8關鍵字查詢(foreach)
14-9新增資料(insert into) 14-10刪除資料(delete from) 14-11查詢單筆資料 14-12修改單筆資料
觀摩範例 14-1讀取第1,2筆記錄,計算筆數 14-2讀取資料庫全部記錄 14-3讀取記錄分頁顯示 14-4印出所有資料,分頁顯示(首頁,上頁,下頁,尾頁)
14-5點按標題,自動排序 14-6SQL 語法:函數計算筆數,計算最大值,計算最低值,計算總和,計算平均值 14-7新增一筆記錄到資料表 14-8刪除一筆記錄
14-9修改一筆記錄 14-10新增一筆記錄(避免SQL Injection,輸入一些特殊字元而逃過檢查,而造成正常登入)) 14-11留言板card
關鍵程式碼(頭尾連線物件) mysqlobj.inc.php mysqlobjclose.inc.php    
下載練習mySQL資料庫 下載資料庫      
關鍵程式碼(一般) 查詢所有記錄 查詢關鍵字 查詢根據某欄位排序 新增一筆記錄
  刪除一筆記錄 修改一筆記錄    
  總共幾筆記錄 總共幾個欄位 查詢結果一次給定陣列 查詢結果迴圈給定陣列
關鍵程式碼(SQL Injection ) 查詢所有記錄 新增一筆記錄 刪除一筆記錄 修改一筆記錄
關鍵程式碼(表格呈現) 查詢顯示全部(1)不分頁,bootstrap,沒排序 查詢顯示顯示分頁-沒排序-沒刪除修改 查詢顯示顯示分頁-有排序-沒刪除修改  
  查詢顯示顯示分頁-有排序-有刪除修改      
關鍵程式碼(輸入文字按鈕) 一組輸入文字方塊+按鈕(1)按鈕後,文字會不見 一組輸入文字方塊+按鈕(2)按鈕後,文字保留 兩組輸入文字方塊,一個按鈕(在同一行)  
關鍵程式碼(留言板card) 留言板card顯示全部(1) 留言板card顯示分頁  
下載練習mySQL資料庫 下載資料庫      
1

14-1使用w3cschool的PHP連線mySQL模板測試連線

範例14-1使用w3cschool的PHP連線mySQL模板測試連線

1.下載資料庫

2.安裝資料庫到mySQL

3.複製w3cschool的PHP連線mySQL模板

1.w3cschool的PHP連線mySQL模板(英文)

2.w3cschool的PHP連線mySQL模板(中文)

4.注意:若是資料庫有中文,要加上編碼charset設定:$conn->set_charset("utf8");

5.測試連線

☎成果範例1:結果範例
☎程式碼:程式碼

1

14-2使用w3cschool的PHP連線mySQL模板讀取資料表

14-2使用w3cschool的PHP連線mySQL模板讀取資料表

1.下載資料庫

2.安裝資料庫到mySQL

3.複製w3cschool的PHP連線mySQL模板

1.w3cschool的PHP連線mySQL模板(英文)

2.w3cschool的PHP連線mySQL模板(中文)

4.注意:若是資料庫有中文,要加上編碼charset設定:$conn->set_charset("utf8");

5.測試連線

☎成果範例1:結果範例
☎程式碼:程式碼

1

14-3單筆方式讀取資料庫

14-3單筆方式讀取資料庫

1.下載資料庫

2.安裝資料庫到mySQL

3.讀取資料庫的四個步驟:

//步驟1.連線資料庫(ch09)
$conn = new mysqli("localhost","root","","ch09");
$conn->set_charset('utf8');

//步驟2.查詢資料表(books)
$result = $conn->query("select * from books");

//步驟3.輸出資料,有四種方法
(1)fetch_row() (2)fetch_assoc() (3)fetch_array() (4)fetch_all();

//步驟4.close connect
$conn->close();

注意:若是資料庫有中文,要加上編碼charset設定:$conn->set_charset("utf8");


5.取得資料的方法(函數)有 4 種:

(1).fetch_row():取得一列資料
(2).fetch_assoc():取得一列資料
(3).fetch_array():取得一列資料
(4).fetch_all():取得全部資料

fetch_assoc():將讀出的資料Key值設定為該欄位的欄位名稱。

fetch_array():將讀出的資料同時以數字與欄位名稱各自存一次在陣列之中,相當於同一個值會出現兩次。

https://richarlin.tw/blog/php-mysql-fetch/

https://richarlin.tw/blog/php-mysql-fetch/

https://www.php.net/manual/en/mysqli-result.fetch-all.php




☎最常用的方式:fetch_array(),最通用的使用方式
☎若是資料太多太累贅,就用:fetch_assoc(),較精簡

6.讀取全部資料的方法:fetch_all()

範例:$rows = $result->fetch_all(參數);
fetch_all(參數),有三種參數:
(1)MYSQLI_ASSOC:會輸出 the 欄位名稱index
(2)MYSQLI_NUM:會輸出 the 欄位編號num index
(3)MYSQLI_BOTH:兩個都會輸出(欄位名稱,編號)

7.輸出json文字格式的方法:json_encode()

☎輸出全部資料(用json格式):echo json_encode($rows);
☎若輸出資料有中文會產生亂碼,解決方法:echo json_encode($rows,JSON_UNESCAPED_UNICODE);
否則作文會是亂碼


☎成果範例1:結果範例
☎程式碼:程式碼
☎成果範例2:結果範例
☎程式碼:程式碼
1

14-4迴圈輸出全部資料(while)

14-4迴圈輸出全部資料(while)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)


4.第一種方法:while($row = $result->fetch_assoc())
while($row = $result->fetch_assoc())
{
echo $row['書籍編號'].','.$row['書籍名稱'].','.$row['價格'];
}
☎成果範例1:結果範例
☎程式碼:程式碼
1

14-5迴圈輸出全部資料(foreach)

14-5迴圈輸出全部資料(foreach)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)

4.第二種方法:foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)

$rowall = $result->fetch_all(MYSQLI_ASSOC);
//fetch_all(參數),有三種參數:
(1)MYSQLI_ASSOC:會輸出 the 欄位名稱index
(2)MYSQLI_NUM:會輸出 the 欄位編號num index
(3)MYSQLI_BOTH:兩個都會輸出(欄位名稱,編號)
foreach($rowall as $item)
{
echo $item["書籍編號"].','.$item["書籍名稱"].','.$item["價格"];
}

☎成果範例:結果範例
☎程式碼:程式碼
1

14-6以表格方式顯示資料庫(while)

14-6以表格方式顯示資料庫(while)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)


4.第一種方法:while($row = $result->fetch_assoc())
while($row = $result->fetch_assoc())
{
echo $row['書籍編號'].','.$row['書籍名稱'].','.$row['價格'];
}
☎成果範例:結果範例
☎程式碼:程式碼
1

14-7以表格方式顯示資料庫(foreach)

14-7以表格方式顯示資料庫(foreach)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)

foreach($rowall as $item)
{
echo $item["書籍編號"].','.$item["書籍名稱"].','.$item["價格"];
}

☎成果範例:結果範例
☎程式碼:程式碼
1

14-8關鍵字查詢(foreach)

14-8關鍵字查詢(foreach)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)

foreach($rowall as $item)
{
echo $item["書籍編號"].','.$item["書籍名稱"].','.$item["價格"];
}

☎成果範例:結果範例
☎程式碼:程式碼
1

14-9新增資料(insert into)

14-9新增資料(insert into)

1.下載資料庫

2.安裝資料庫到mySQL

3.迴圈,全部輸出,有二種方法:

(1)while():while($row = $result->fetch_assoc())

(2)foreach():fetch_all(MYSQLI_ASSOC);再結合 foreach($rowall as $item)

foreach($rowall as $item)
{
echo $item["書籍編號"].','.$item["書籍名稱"].','.$item["價格"];
}

☎成果範例:結果範例
☎程式碼:程式碼
1

14-10刪除資料(delete from)

14-10刪除資料(delete from)

1.下載資料庫

2.刪除記錄

$str = "";
if(isset($_POST['t1']))$str = $_POST['t1'];
if($conn->query("delete from books where 書籍編號=".$str))
echo "成功刪除";
else
echo "無法刪除";


☎成果範例:結果範例
☎程式碼:程式碼
1

範例14-11查詢單筆資料

範例14-11查詢單筆資料

1.下載資料庫

2.查詢單筆資料

$id = 0;
if(isset($_POST['t1']))$id=$_POST['t1'];
$result = $conn->query("select * from books where 書籍編號=".$id);


☎成果範例:結果範例
☎程式碼:程式碼
1

範例14-12修改單筆資料

範例14-12修改單筆資料

1.下載資料庫

2.修改單筆資料

//2.修改資料
$n1 = 0;
if(isset($_POST['n1']))$n1=$_POST['n1'];
$n2 = "";
if(isset($_POST['n2']))$n2=$_POST['n2'];
$n3 = 0;
if(isset($_POST['n3']))$n3=$_POST['n3'];
$n4 = 0;
if(isset($_POST['n4']))$n4=$_POST['n4'];
$conn->query("update books set 書籍名稱='".$n2."',價格=".$n3.",負責員工編號=".$n4." where 書籍編號=".$n1);


☎成果範例:結果範例
☎程式碼:程式碼
 

關鍵程式碼(mysqlobj.inc.php)

//引入資料庫設定檔案
//include("mysqlobj.inc.php");
require_once("mysqlobj.inc.php");

<?php
//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫";
$dbUser = "root";
$dbPass = "密碼";

//建構物件: 連線資料庫伺服器
$mysqli = @new mysqli($dbServer, $dbUser, $dbPass, $dbName);

if ($mysqli->connect_errno) // 存取成員
die("無法連線資料庫伺服器");

//設定連線的字元集為 UTF8 編碼
$mysqli->set_charset("utf8");

?>

 

釋放記憶體

require_once("mysqlobjclose.inc.php");

<?php
////釋放記憶體////////////////////////////
$mysqli->close(); // 關閉資料庫連接

?>

 

總共幾筆記錄

$num = $result->num_rows;

<?php
$sql="SELECT * FROM books";
$result = $mysqli->query($sql);
//取得查詢結果的筆數
$num = $result->num_rows;

?>

 

總共幾個欄位

$num = $result->field_count;

<?php
$sql="SELECT * FROM books";
$result = $mysqli->query($sql);
//欄位數目
$num = $result->field_count;

?>

 

查詢結果一次給定陣列

mysqli_fetch_all($result,MYSQLI_BOTH)

這個指令,在現在版本的php不能用了

<?php
$sql="SELECT * FROM books";
$result = $mysqli->query($sql);
//查詢結果一次給定陣列
mysqli_fetch_all($result,MYSQLI_BOTH)

?>

 

查詢結果迴圈給定陣列

$row[]=$result->fetch_array()

<?php
$sql="SELECT * FROM books";
$result = $mysqli->query($sql);
//查詢結果迴圈給定陣列
while($row[]=$result->fetch_array(MYSQLI_ASSOC)){
$str =$row['書籍名稱'];
}

?>

$row = $result->fetch_array(MYSQLI_NUM);
$row = $result->fetch_array(MYSQLI_ASSOC);
$row = $result->fetch_array(MYSQLI_BOTH);
MYSQLI_ASSOC:文字欄位
MYSQLI_NUM:數字欄位
MYSQLI_BOTH:兩者都有

 

查詢所有資料表記錄

<?php
//引入資料庫設定檔案;
require_once("mysqlobj.inc.php");

//查詢【員工】資料表的的資料
$sql="SELECT * FROM 資料表";
$result = $mysqli->query($sql);

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=$result->fetch_array(MYSQLI_ASSOC)){
}

....

////釋放記憶體////////////////////////////
$result->close();
require_once("mysqlobjclose.inc.php");

?>

 

關鍵字查詢資料表記錄

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//關鍵字查詢資料表的的資料
if(isset($_POST['輸入查詢欄位name']))
$sql="SELECT * FROM 資料表 where 欄位名稱 like '%".$_POST['輸入查詢欄位name']."%'";
else
$sql="SELECT * FROM 資料表";

$result = $mysqli->query($sql);

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=$result->fetch_array(MYSQLI_ASSOC)){
}

....

////釋放記憶體////////////////////////////
$result->close();
require_once("mysqlobjclose.inc.php");

?>

 

根據某欄位排序

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

///讀取要排序的欄位//////////////////////////
if(isset($_GET['sortcolumn'])){
$sortcolumn = $_GET['sortcolumn'];
}else{
$sortcolumn = "預設欄位名稱";
}

//查詢資料表的的資料
$sql="SELECT * FROM 資料表 order by ".$sortcolumn." desc";
$result = $mysqli->query($sql);

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=$result->fetch_array(MYSQLI_ASSOC)){
}

....

////釋放記憶體////////////////////////////
$result->close();
require_once("mysqlobjclose.inc.php");

?>

 

查詢所有資料表記錄(尚待確認??)

SQL Injection 方式

bind_param資料形態
i:整數
d:double浮點數
s:字串
b:blob變數

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

$sql="SELECT * FROM 資料表 where 欄位 =?";
$stmt = $mysqli->prepare($sql);
// 繫結參數
$stmt->bind_param('s',$_POST['bookname']);
$stmt->execute();

//給定$rowpage[][]二維陣列//////////////////////////////////////////////////////
while($rowpage[]=$stmt->fetch_array(MYSQLI_ASSOC)){
}

....

////釋放記憶體////////////////////////////
$stmt->close();
require_once("mysqlobjclose.inc.php");

?>

 

新增一筆記錄

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//新增欄位///////////////////////////////////////////
if(isset($_POST['bookname'])){
$sql="INSERT 資料表 (書籍名稱, 價格) VALUES ('{$_POST['bookname']}','{$_POST['bookprice']}')";

if ( $mysqli->query($sql) ) // 執行SQL指令
echo "資料庫新增記錄成功, 影響記錄數: ".
$mysqli->affected_rows . "<br/>";
else
die("資料庫新增記錄失敗<br/>");
}

....

////釋放記憶體////////////////////////////
require_once("mysqlobjclose.inc.php");

?>

 

新增一筆記錄

SQL Injection 方式

bind_param資料形態
i:整數
d:double浮點數
s:字串
b:blob變數

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

$sql="INSERT 資料表 (書籍名稱, 價格) VALUES (?,?)";

$stmt = $mysqli->prepare($sql);
// 繫結參數
$stmt->bind_param('sd',$_POST['bookname'], $_POST['bookprice']);
// 寫入資料庫
//$stmt->execute();

if ( $stmt->execute() ) // 執行SQL指令
echo "資料庫新增記錄成功, 影響記錄數: ".
$stmt->affected_rows . "<br/>";
else
die("資料庫新增記錄失敗<br/>");

....

////釋放記憶體////////////////////////////
$stmt->close();
require_once("mysqlobjclose.inc.php");

?>

 

刪除一筆記錄

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//刪除欄位/////
if(isset($_GET['delnum'])){
$sql="delete from books where 書籍編號=".$_GET['delnum'];
if ( $mysqli->query($sql) ) // 執行SQL指令
echo "資料庫刪除記錄成功, 影響記錄數: ".
$mysqli->affected_rows . "<br/>";
else
die("資料庫刪除記錄失敗<br/>");
}
....

////釋放記憶體////////////////////////////
require_once("mysqlobjclose.inc.php");

?>

 

刪除一筆記錄

SQL Injection 方式

bind_param資料形態
i:整數
d:double浮點數
s:字串
b:blob變數

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//刪除欄位/////
if(isset($_GET['delnum'])){
$sql="delete from 資料表 書籍編號=?";

$stmt = $mysqli->prepare($sql);
// 繫結參數
$stmt->bind_param('i',$_GET['delnum']);
// 寫入資料庫
//$stmt->execute();

if ( $stmt->execute() ) // 執行SQL指令
echo "資料庫刪除記錄成功, 影響記錄數: ".
$stmt->affected_rows . "<br/>";
else
die("資料庫新增記錄失敗<br/>");
}
....

////釋放記憶體////////////////////////////
$stmt->close();
require_once("mysqlobjclose.inc.php");

?>

 

修改一筆記錄

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//修改欄位///
if(isset($_POST['editnum'])){
$sql="update 資料表 set 書籍名稱='".$_POST['editname']."',價格=".$_POST['editprice']." where 書籍編號=".$_POST['editnum'];
if ( $mysqli->query($sql) ) // 執行SQL指令
echo "資料庫更新記錄成功, 影響記錄數: ".
$mysqli->affected_rows . "<br/>";
else
die("資料庫更新記錄失敗<br/>");
}
....

////釋放記憶體////////////////////////////
require_once("mysqlobjclose.inc.ph

//最後轉換到主網頁
header("Location:exp16-12.html");

?>

 

修改一筆記錄

SQL Injection 方式

bind_param資料形態
i:整數
d:double浮點數
s:字串
b:blob變數

<?php
//引入資料庫設定檔案
require_once("mysqlobj.inc.php");

//修改欄位/////
if(isset($_POST['editnum'])){
$sql="update 資料表 set 書籍名稱=?,價格=? where 書籍編號=?";
$stmt = $mysqli->prepare($sql);
// 繫結參數
$stmt->bind_param('s',$_POST['editname']);
$stmt->bind_param('d',$_POST['editprice']);
$stmt->bind_param('i',$_POST['editnum']);

// 寫入資料庫
//$stmt->execute();
if ( $stmt->execute() ) // 執行SQL指令
echo "資料庫更新記錄成功, 影響記錄數: ".
$stmt->affected_rows . "<br/>";
else
die("資料庫新增記錄失敗<br/>");
}

....

////釋放記憶體////////////////////////////
$stmt->close();
require_once("mysqlobjclose.inc.php");

//最後轉換到主網頁
header("Location:exp16-12.html");

?>

 

 

查詢結果

顯示全部(方法一)

(不分頁,bootstrap,沒排序)

範例結果

$sql= "SELECT 姓名,職稱,出生日期,地址,電話號碼 FROM 資料表";
$result=$mysqli->query($sql);

echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><th>姓名</th><th>職稱</th><th>出生日期</th><th>地址</th><th>電話號碼</th></tr></thead><tbody>";
while($rowpage[]=$result->fetch_array(MYSQLI_ASSOC)){
}

foreach($rowpage as $i=>$v){

echo "<tr><td>".$v['姓名']."</td><td>".$v['職稱']."</td><td>".$v['出生日期']."</td><td>".$v['地址']."</td><td>".$v['電話號碼']."</td></tr>";
}
echo "</table>";

 

查詢結果

顯示表格與分頁

(沒有標題排序)

(沒有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp15-10.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp15-10.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp15-10.php?sortcolumn=價格'>價格</a></th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

echo "<br/>";

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a></li> ";

if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a></li> ";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$i."&sortcolumn=".$sortcolumn."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁</a></li> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a></li> ";

echo "<li class='page-item'>跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li> ";
echo "</ul> ";
echo "</nav> ";

?>

 

查詢結果

顯示表格與分頁

(有標題排序)

(沒有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<br/><br/>";
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);

}
echo "</table>";

?>

 

查詢結果

顯示表格與分頁

(有標題排序)

(有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp15-10.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp15-10.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp15-10.php?sortcolumn=價格'>價格</a></th><th></th><th></th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td><a href='exp15-10.php?delnum=%s'>刪除</a></td><td><a href='exp15-10a.php?editnum=%s&editname=%s&editprice=%s'>修改</a></td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

echo "<br/>";

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a></li> ";

if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a></li> ";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$i."&sortcolumn=".$sortcolumn."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁</a></li> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a></li> ";

echo "<li class='page-item'>跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li> ";
echo "</ul> ";
echo "</nav> ";

?>

 

一組輸入文字方塊,按鈕

(但是按按鈕後,輸入文字會不見)

 

<form class="form-inline" method="post" action="exp15-4.php">
<div class="form-group mb-2">
<label for="bookname" >輸入書名關鍵字:</label>
<input type="text" class="form-control" name="bookname" placeholder="輸入書名">
</div>
<button type="submit" class="btn btn-primary mb-2">查詢</button>
</form>

 

一組輸入文字方塊,按鈕

(按按鈕後,輸入文字還會繼續顯示)

 

<form class="form-inline" method="post" action="exp15-6.php">
<div class="form-group mb-2">
<label for="bookname" >輸入書名關鍵字:</label>
<input type="text" class="form-control" name="bookname" value="<?php
if(isset($_POST['bookname']))echo $_POST['bookname'];

?>">
</div>
<button type="submit" class="btn btn-primary mb-2">查詢</button>
</form>

 

兩組輸入文字方塊,一個按鈕

(在同一行)

(但是按按鈕後,輸入文字會不見)

 

<form class="form-inline" method="post" action="exp15-10.php">
<div class="form-group">
<label for="bookname" >書名:</label>
<input type="text" class="form-control" name="bookname" placeholder="輸入書名">
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="bookprice" > 價格:</label>
<input type="text" class="form-control" name="bookprice" placeholder="1">
</div>
<button type="submit" class="btn btn-primary mb-2">新增</button>
</form>

     
1

 

留言板card顯示面板

(全部顯示)(方法一)

範例結果

while($row=$result->fetch_array(MYSQLI_ASSOC)){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$row['留言編號']."】".$row['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$row['日期時間']."</h5>";
echo "<p class='card-text'>".$row['留言']."</p>";
echo "</div></div>";
}

2

 

留言板card顯示面板

(分頁顯示)

範例結果

//給定$rowpage[][]二維陣列///////
while($rowpage[]=$result->fetch_array()){
}

.........

for($i=$min;$i<$max;$i++){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$rowpage['留言編號']."】".$rowpage['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$rowpage['日期時間']."</h5>";
echo "<p class='card-text'>".$rowpage['留言']."</p>";
echo "</div></div>";
}

 

 

 
Chp15. PHP讀取資料庫方法三:物件PDO:$result=$conn->query($sql)
練習範例 15-1讀取第1,2筆記錄,計算筆數 15-2讀取資料表全部記錄(兩種方法) 15-3讀取記錄分頁顯示 15-4關鍵字查詢
15-5記錄剛剛查詢關鍵字(I):較麻煩方法(都用session) 15-6記錄剛剛查詢關鍵字(II):最省事的法(不斷向主機查詢換頁排序) 15-7新增一筆記錄到資料表 15-8刪除一筆記錄
15-9修改一筆記錄 15-10新增一筆記錄(避免SQL Injection,輸入一些特殊字元而逃過檢查,而造成正常登入)) 15-11留言板card
關鍵程式碼(頭尾連線物件) mysqlpdo.inc.php      
關鍵程式碼(一般) 查詢所有記錄 查詢關鍵字 查詢根據某欄位排序 新增一筆記錄
  刪除一筆記錄 修改一筆記錄    
  總共幾筆記錄 總共幾個欄位 查詢結果一次給定陣列 查詢結果迴圈給定陣列
關鍵程式碼(SQL Injection ) 查詢所有記錄 新增一筆記錄 刪除一筆記錄 修改一筆記錄
關鍵程式碼(表格呈現) 查詢顯示全部(1)不分頁,bootstrap,沒排序 查詢顯示全部(2)不分頁,bootstrap,沒排序 查詢顯示顯示分頁-沒排序-沒刪除修改 查詢顯示顯示分頁-有排序-沒刪除修改
  查詢顯示顯示分頁-有排序-有刪除修改      
關鍵程式碼(輸入文字按鈕) 一組輸入文字方塊+按鈕(1)按鈕後,文字會不見 一組輸入文字方塊+按鈕(2)按鈕後,文字保留 兩組輸入文字方塊,一個按鈕(在同一行)  
關鍵程式碼(留言板card) 留言板card顯示全部(1) 留言板card顯示全部(2) 留言板card顯示分頁  
下載練習mySQL資料庫 下載資料庫      
  如何在資料表欄位新增{"types":{"1":"蘋果","2":"柳丁","3":"葡萄"}}

如何在資料表欄位新增{"types":{"1":"蘋果","2":"柳丁","3":"葡萄"}}
(1).關鍵:這是(文字indx)陣列,外面再包個陣列(編號為types),再轉成json

_(A).分析:這個是php的(文字indx)陣列寫法:
語法:$arr['apple'] = '蘋果';
語法:$arr['555'] = '測試';
語法:$arr['415'] = '公告';
語法:$arr['870'] = '投票';

_(B).外面再包個陣列(編號為types)
$arr2 = array("types" => $arr);

_(C).然後再把陣列轉成json
$arr3 = json_encode($arr2, JSON_UNESCAPED_UNICODE);

(2).範例:include/action/editForum.php
$threadtypes_arr = json_decode($threadtypes, true);
foreach($threadtypes_arr as $i=>$list)
{
$types[$list[0]] = $list[1];
}
$threadtypes01 = array("types" => $types);
$threadtypes01 = json_encode($threadtypes01, JSON_UNESCAPED_UNICODE);

  如何印出sql資料表變數二維陣列的指定某個tid的subject

如何印出sql資料表變數二維陣列的指定某個tid的subject
(1).關鍵:兩個方法都可以
_(A).傳統方法,乃是用index號碼,缺點:無法直接定位$tid
$info = $res->fetchAll(PDO::FETCH_ASSOC);
印出陣列:echo $info[0]['id'];

_(B).fdz方法,乃是使用唯一主鍵key的欄位,例如:$tid
$info = $res->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE);
印出陣列:echo $info[$tid]['id'];

(2).方法一(fdz的方法):建議的方法
重點2:$uuid = $thread_info[$tid]["authorid"]
重點1:二維陣列不用index編號,而是綁定唯一主鍵key欄位
範例:
$res = $db->query("select * from `pre_forum_thread` where `tid` in ( $tids )");
$thread_info = $res->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE);
foreach($tid_arr as $i=>$tid)
{
$uuid = $thread_info[$tid]["authorid"];
}

(3).方法二(我的方法):但是沒有fdz方法好
$res = $db->query("select * from `pre_forum_thread` where `tid` in ( $tids )");
$thread_info = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($tid_arr as $i=>$tid)
{
$uuid = $thread_info[$i]["authorid"];
}

  sql 的排序:如何依照多個欄位,兩個欄位來排序

sql 的排序:如何依照多個欄位,兩個欄位來排序
重點:ORDER BY "欄位一" [ASC, DESC], "欄位二" [ASC, DESC]
範例:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

  php select查詢的標準寫法,要加上判別是否有值:if($res->rowCount())

php select查詢的標準寫法,要加上判別是否有值:if($res->rowCount())
(1).正確完整寫法:
$res = $db->query("select * from `pre_common_member` where `username` = '$moderator'");
if ($res->rowCount())
{
$info = $res->fetch();
$uuid = $info["uuid"];
}
else
{
die(json_encode(array('status' => 'pre_common_member_username')));
}

(2).簡易但卻容易出現錯誤寫法:(若沒有此資料,就會出現error)
$res = $db->query("select * from `pre_common_member` where `username` = '$moderator'");
$info = $res->fetch();
$uuid = $info["uuid"];

  select查詢用fetch(),fetchAll()所取出的欄位寫法不同:$info["fup"],$info[0]["fup"]

select查詢用fetch(),fetchAll()所取出的欄位寫法不同:$info["fup"],$info[0]["fup"]
例如:
$res = $db->query("select * from `pre_forum_forum` where `fid` = '$fid'");
if ($res->rowCount())
{
$info = $res->fetch();
$fup = $info["fup"];

$info = $res->fetchAll();
$fup = $info[0]["fup"];

  使用left join 在最後的where部分,要用全名查詢

使用left join 在最後的where部分,要用全名查詢{
例如:where `pre_forum_forum`.`fid` = '$fid'{
正確範例:
$res = $db->query("select * from `pre_forum_forum` left join `pre_forum_forumfield` on `pre_forum_forum`.fid = `pre_forum_forumfield`.fid where `pre_forum_forum`.`fid` = '$fid'");

錯誤範例(無法顯示):where `fid` = '$fid'
$res = $db->query("select * from `pre_forum_forum` left join `pre_forum_forumfield` on `pre_forum_forum`.fid = `pre_forum_forumfield`.fid where `fid` = '$fid'");

  如何刪除mysql資料庫所有具有uuid欄位的資料表:

如何把查詢後的資料表陣列,轉換成字串:
注意:不能用join(',',陣列)
注意:陣列的取值式:$info[0]['TABLE_NAME'])
注意:陣列必須用迴圈取值:foreach($info as $i=>$v)

範例:
$res = $db->query("SELECT distinct TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name like 'uuid' and TABLE_SCHEMA = 'fdz'");
if($res->rowCount())
{
$info = $res->fetchAll(PDO::FETCH_ASSOC);
// die(json_encode(array('status' => $info[0]['TABLE_NAME'])));
$TABLE_NAME_uuid = '';
foreach($info as $i=>$v)
{
$TABLE_NAME_uuid .= "`".$v["TABLE_NAME"]."`,";
}
$sql_del_uuid = '';
foreach($info as $i=>$v
) {
$sql_del_uuid .= "delete from `".$v['TABLE_NAME']."` where `uuid` in ('$all_member_ids_new');";
}
}

  如何刪除mysql資料庫所有具有uuid欄位的資料表:

如何刪除mysql資料庫所有具有uuid欄位的資料表:
語法:SELECT distinct TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name like 'uuid' and TABLE_SCHEMA = 'fdz'
志豪:用這個sql 可以查出包含uuid的table名稱

例如:
//查詢所有fdz資料庫中,含有uuid欄位的資料表
$res = $db->query("SELECT distinct TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name like 'uuid' and TABLE_SCHEMA = 'fdz'");
if($res->rowCount())
{
$info = $res->fetchAll(PDO::FETCH_ASSOC);
$sql_del_uuid = '';
foreach($info as $i=>$v)
{
$sql_del_uuid .= "delete from `".$v['TABLE_NAME']."` where `uuid` in ('$all_member_ids_new');";
}
}
//刪除最後的,
$sql_del_uuid = substr($sql_del_uuid,0,strlen($sql_del_uuid)-1);

  小心容易犯錯的sql語法:不可delete *(必須select *)

小心容易犯錯的sql語法:不可delete *(必須select *)

(1).sql刪除語法,特別注意不可delete *
錯誤寫法:delete * from `pre_common_member` where `uuid` in ('$all_member_ids_new');
正確寫法:delete from `pre_common_member` where `uuid` in ('$all_member_ids_new');

應用:其它新增,修改,刪除,都不可以寫*
Insert Into
INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES ("值1", "值2", ...);

Update
UPDATE "表格名" SET "欄位1" = [新值] WHERE "條件";

Delete From
DELETE FROM "表格名" WHERE "條件";

(2).sql查詢語法,特別注意一定必須select *
錯誤寫法:$res = $db->query("SELECT from `pre_forum_post` where `authorid` in ('$all_member_ids_new')");
正確寫法:$res = $db->query("SELECT * from `pre_forum_post` where `authorid` in ('$all_member_ids_new')");

  養成習慣:刪除前,一定要先查詢是否有值才能刪除,否則會出現錯誤

養成習慣:刪除前,一定要先查詢是否有值才能刪除,否則會出現錯誤
(1).範例:include/action/editForum.php
//刪除pre_forum_threadclass,該fid的所有資料
$res = $db->query("select * from `pre_forum_threadclass` where `fid` = '$fid'");
if($res->rowCount())
{
$sql = "delete from `pre_forum_threadclass` where `fid` = '$fid'";
if(!$db->exec($sql))
{
die(json_encode(array('status' => $sql)));
}
}

// 新增所有的表格分類版塊資料
foreach($threadtypes_arr as $i=>$list)
{
$typeid = $list[0];
$classname = $list[1];
$icon = $list[2];
$moderators = $list[3];
$displayorder = $list[4];
//新增 pre_forum_threadclass
$sql = "insert into `pre_forum_threadclass`(`typeid`, `fid`, `name`, `displayorder`, `icon`, `moderators`) values ";
$sql .= "('$typeid', '$fid', '$classname', $displayorder, '$icon', $moderators)";
if(!$db->exec($sql))
{
die(json_encode(array("status" => $sql)));
}
}

  解決php先刪除某個資料表的某個fid,但是若沒有該值,就會發現錯誤

解決php先刪除某個資料表的某個fid,但是若沒有該值,就會發現錯誤
(1).範例:include/action/editForum.php
在fid=39,要新增一個分類,會先刪除
出現錯誤:delete from `pre_forum_threadclass` where `fid` = '39'

(2).fdz刪除資料表某一筆的寫法,必須要先判別是否有值:
注意:要先判別是否有此筆,若有才可以刪除,否則會出現錯誤訊息
範例:
$res = $db->query("select * from `pre_forum_access` where `uuid` = '$uuid'");
if($res->rowCount())
{
$sql_del_pre_forum_access = "delete from `pre_forum_access` where `uuid` = '$uuid'";
if(!$db->exec($sql_del_pre_forum_access))
{
die(json_encode(array('status' => 'sql_del_pre_forum_access')));
}
die(json_encode(array("status" => "OK_clearForumPermission")));
}

  fdz刪除資料表某一筆的寫法,必須要先判別是否有值

fdz刪除資料表某一筆的寫法,必須要先判別是否有值:
注意:要先判別是否有此筆,若有才可以刪除,否則會出現錯誤訊息
範例:
$res = $db->query("select * from `pre_forum_access` where `uuid` = '$uuid'");
if($res->rowCount())
{
$sql_del_pre_forum_access = "delete from `pre_forum_access` where `uuid` = '$uuid'";
if(!$db->exec($sql_del_pre_forum_access))
{
die(json_encode(array('status' => 'sql_del_pre_forum_access')));
}
die(json_encode(array("status" => "OK_clearForumPermission")));
}

  fdz修改資料表某一筆的寫法,必須要先判別是否有值

fdz修改資料表某一筆的寫法,必須要先判別是否有值:
注意:要先判別是否有此筆,若有才可以修改,否則會出現錯誤訊息
範例:

//先判別是否已經該用戶,在某版,已經有值
$res = $db->query("select * from `pre_forum_access` where `fid` = '$fid' && `uuid` = '$uuid'");
if($res->rowCount())
{
$sql_edit_forum_access ="update `pre_forum_access` set `allowview` = $allowview, `allowpost` = $allowpost, `allowreply` = $allowreply, `allowgetattach` = $allowgetattach, `allowgetimage` = $allowgetimage, `allowpostattach` = $allowpostattach, `allowpostimage` = $allowpostimage where `fid` = '$fid' && `uuid` = '$uuid'";
//檢查是否錯誤:
if(!($db->exec($sql_edit_forum_access) !== false))
{
die(json_encode(array("status" => "sql_edit_forum_access")));
}
}

  如何查詢資料表的陣列,轉換成字串

如何查詢資料表的陣列,轉換成字串:
方法:
$info_forum = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($info_forum as $i=>$v)
{
$txt .= '<option value="'.$v["fid"].'">'.$v["name"].'</option>';
}

範例:
$res = $db->query("select * from `pre_forum_forum` where `type` = 'forum'");
$info_forum = $res->fetchAll(PDO::FETCH_ASSOC);
$option_forum = '<option value="0">請選擇</option>';
foreach($info_forum as $i=>$v)
{
$option_forum .= '<option value="'.$v["fid"].'">'.$v["name"].'</option>';
}

  一,合併資料表,一對多

一,合併資料表,一對多:
例如:pre_common_member的adminid,對應到pre_common_admincp_group的管理組名稱(cpgroupname):

(1).include/action/memberList.php
方法:使用left join(資料表A left join 資料表B on A.adminid = B.cpgroupid)
結果:就可以把資料表B的管理員名稱,顯示出來

$res = $db->query("select * from `pre_common_member` left join `pre_common_admincp_group` on `pre_common_member`.`adminid` = `pre_common_admincp_group`.`cpgroupid`");
$member_data = $res->fetchAll(PDO::FETCH_ASSOC);
$smarty->assign("member_data", $member_data);

(2).在網頁模板assign管理員名稱值(adminid=1,門戶管理員):<!--{$member["cpgroupname"]}-->
<!--{foreach from=$member_data item=member}-->
<li class="member-list row">
<div class="col-md-2 col-sm-2 col-xs-3 px0 text-center">
<div>
<!--{if $member["cpgroupname"]}-->
<button class="btn btn-warning dropdown-toggle" type="button" data-toggle="dropdown"><!--{$member["cpgroupname"]}--></button>
<!--{/if}-->
</div>
</div>
</li>
<!--{/foreach}-->

  二,合併資料表,一對多,統計總數量(感謝)

二,合併資料表,一對多,統計總數量(感謝):
例如:pre_common_member的adminid,對應到pre_common_admincp_group的管理組名稱(cpgroupname):

(1).include/action/memberList.php
方法:select *,(select count(資料表B.欄位) from 資料表B where 資料表B.欄位 = 資料表A.欄位) as 新欄位名稱 from 資料表A
結果:就可以把資料表B的計算總量(感謝總數量),顯示出來

$res = $db->query("select *,(select count(pre_plugin_thanks_log.touuid) from pre_plugin_thanks_log where pre_plugin_thanks_log.touuid = pre_common_member.uuid) as thanksNum from `pre_common_member`");
$member_data = $res->fetchAll(PDO::FETCH_ASSOC);
$smarty->assign("member_data", $member_data);

(2).在網頁模板assign感謝資料表的感謝總數量(thanksNum):<!--{$member["thanksNum"]}-->
<!--{foreach from=$member_data item=member}-->
<li class="member-list row">
<div class="col-md-1 col-sm-1 hidden-xs px0 text-center">
<font color="#FF3333"><!--{$member["thanksNum"]}--></font>
</div>
</li>
<!--{/foreach}-->

  如何將mySql讀取資料表的資料,轉成陣列

如何將mySql讀取資料表的資料,轉成陣列:
(1).將mySql讀取資料表的資料,轉成陣列:
方法1:一維陣列
$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetch(PDO::FETCH_ASSOC);
印出陣列:echo $info['id'];
結果:97f410c7-eca7-4af6-b1a1-2dd4a3b85f3c
注意:因為只有一維陣列,所以是$info['id']

方法2:二維陣列
$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetchAll(PDO::FETCH_ASSOC);
印出陣列:echo $info[0]['id'];
結果:97f410c7-eca7-4af6-b1a1-2dd4a3b85f3c
注意:這個二維陣列與傳統不同(不是$info['id'][0])

(2).如何將資料表二維陣列,轉成:'陣列1','陣列2','陣列3','陣列4'
方法:foreach($info as $list){..$list['欄位']..}

$res = $db->query("select `id` from `pre_home_favorite` where `favid` in('$id_arr')");
$info = $res->fetchAll(PDO::FETCH_ASSOC);
$uuid_str = '';
foreach($info as $list)
{
$uuid_str .= "'" . $list['id'] . "',";
}
$uuid_str = substr($uuid_str, 0, -1);

  vcenter,fdz關鍵字查詢的方法

(1).vcenter,fdz關鍵字查詢的方法:
語法:select from 資料表 where 欄位 like '%'

(2).切換查詢寫法:查詢關鍵字與查詢特定字
//如果沒有給定idtype值(或是=all),就給%,查關鍵字,顯示全部
//若不是all(是tid,fid),且有數值,則設定原值
$idtype = ($idtype!='all' && $idtype) ? $idtype : "%";
$res = $db->query("select count(*) as `total_favorite` from `pre_home_favorite` where `uuid` = '$uuid' and `idtype` like '$idtype'");
$fav_info = $res->fetch();
$total_favorite = $fav_info["total_favorite"];

  取得資料表的筆數(可以用在pagy)

(1).取得資料表的筆數(可以用在pagy):
$res = $db->query("select count(*) as `total_favorite` from `pre_home_favorite` where `uuid` = '$uuid' and `idtype` like '$idtype'");
$fav_info = $res->fetch();
$total_favorite = $fav_info["total_favorite"];

  php刪除多筆記錄,刪除多個傳來的ids字串的Final標準寫法)

php刪除多筆記錄,刪除多個傳來的ids字串的Final標準寫法:
//刪除pre_forum_moderator的版主
$all_uuid_arr = explode(",",$all_uuid);
$all_uuid_str = join("','",$all_uuid_arr);
$sql_del_forum_moderator = "delete from `pre_forum_moderator` where `uuid` in ('$all_uuid_str') and `fid` = '$fid'";
if(!$db->exec($sql_del_forum_moderator))
{
die(json_encode(array("status" => $sql_del_forum_moderator)));
}

  操作多筆記錄的各種寫法,有兩種方法:簡便法,完整法

操作多筆記錄的各種寫法,有兩種方法:簡便法,完整法:
一,簡便法:剛好可以使用 where 欄位 in (值1,值2) (1).一次更新update多筆資料:pid值在某陣列裡面的都要更新
方法:where `pid` in ( '$pid' )";
$pid = join("','", $pid_arr);
$sql = "update `pre_forum_post` set `status` = '$block' where `tid` = '$tid' and `pid` in ( '$pid' )";

Update Products Set ProductName = 'Shoes' WHERE ProductID IN (1,2,3,4,5,6,7,8)

(2).一次新增多筆資料:不能夠用where in (),所以只能夠用insert member()values(),value()...
方法:where `pid` in ( '$pid' )";

(3).一次刪除delete多筆資料:pid值在某陣列裡面的都要更新
方法:where `pid` in ( '$pid' )";

(4).一次查詢select多筆資料:pid值在某陣列裡面的都要更新
方法:where `pid` in ( '$pid' )";
SELECT * FROM Store_Information WHERE Store_Name IN ('Los Angeles', 'San Diego');

二,完整法:參數太複雜,只能用串接(用;或,)
(1).一次修改多筆資料
$id = explode(",",$_GET['all_product_ids']);
$sql="";
foreach($id as $i=>$v)
{
$sql.="update product set enable=1,uploaddate='".$uploaddate."' where productid='".$v."';";
}
//刪除最後的;
$sql = substr($sql,0,strlen($sql)-1);
if(!($db->exec($sql_member) !== false))
{
die(json_encode(array("status" => "member")));
}
else
{
die(json_encode(array("status" => "OK")));
}

(2).一次新增多筆記錄的寫法
$arr_tags = explode(",",$tags);
$sql ="insert into pre_common_tag (`tagid`,`tagname`,`status`) values ";
foreach($arr_tags as $i=>$v)
{
$sql .="(".($max_tagid+$i+1).",'".$v."',0),";
}
//刪除最後的','
$sql = substr($sql,0,strlen($sql)-1);
$db->exec($sql);

(3).一次刪除多筆資料
$id = explode(",",$_GET['del_product_ids']);
$sql="";
foreach($id as $i=>$v)
{
$sql.="delete from product where productid='".$v."';";
}
//刪除最後的;
$sql = substr($sql,0,strlen($sql)-1);
$db->exec($sql)

  如何在資料表欄位累加上去新的值

如何在資料表欄位累加上去新的值
標籤最後會寫入在 pre_forum_thread 的 relatebytag 欄位裡
原理公式:
(1).文字串接:update t set data = concat(data, 'a');
(2).數字相加:update t set data = data + 3;

(2).寫法:
//更正到pre_forum_thread的relatebytag欄位
$sql="update `pre_forum_thread` set relatebytag = concat(relatebytag,'$tags') where tid = '$tid'";
$db->exec($sql);

//update要特別注意:避免update和舊值一樣會報錯:if(!($db->exec($sql_member) !== false))
$sql_member ="update `pre_common_member` set `groupid` = '10', `groupexpiry` = 0 where `uuid` = '$authorid'";
//檢查是否錯誤:
if(!($db->exec($sql_member) !== false))
{
die(json_encode(array("status" => "member")));
}
//檢查是否正確:
if($db->exec($sql) !== false)
{
die(json_encode(array("status" => "OK")));
}

  中文亂碼的處理

//echo 中文,不顯示亂碼
header('Content-Type: text/html; charset=utf-8');

//json_encode,顯示中文(不顯示亂碼)
echo json_encode($rowall,JSON_UNESCAPED_UNICODE);

  日期時間儲存到資料庫,要先轉換成字串string

//將datetime轉成string,才能儲存到mySql,以24小時制
$t1 = new DateTime('now',new DateTimeZone('Asia/Taipei'));
$strnowtime = $t1 -> format('Y-m-d H:i:s');

 

關鍵程式碼(mysqlpdo.inc.php)

//引入資料庫設定檔案
//include("mysqlpdo.inc.php");
require_once("mysqlpdo.inc.php");

<?php
//資料庫設定
$dbServer = "localhost";
$dbName = "資料庫";
$dbUser = "root";
$dbPass = "密碼";

// 建立 dsn 字串
$dsn = 'mysql:host='.$dbServer.';dbname='.$dbName.';charset=utf8';

try{ // 嘗試連線
$conn = new PDO($dsn, $dbUser, $dbPass);
} catch (PDOException $e) {
if ($e->getCode() == '1045') // 連線失敗
die("連線失敗"); // 即結束程式
}
?>

 

釋放記憶體

<?php
////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

計算查詢結果總共幾筆(筆數),有兩種寫法

$result->rowCount();

計算查詢結果總共幾筆(筆數),有兩種寫法:
(1).筆數 = $result->rowCount()
$sql="SELECT * FROM books";
$result=$conn->query($sql);
//取得查詢結果的筆數
$num = $result->rowCount();

(2).筆數 = select count(*) as `total_member` from 資料表

$res = $db->query("select count(*) as `total_member` from `pre_common_member` where `username` like '%$username%'");
$rep_info = $res->fetch();
$total_member = $rep_info["total_member"];

 

總共幾個欄位

$result->columnCount();

<?php
$sql="SELECT * FROM books";
$result=$conn->query($sql);
//欄位數目
$num = $result->columnCount();

?>

 

查詢結果一次給定陣列

$row = $result->fetchAll();

<?php
$sql="SELECT * FROM books";
$result=$conn->query($sql);
//查詢結果一次給定陣列
$row = $result->fetchAll(PDO::FETCH_ASSOC);

?>

輸出文字欄位:$row = $result->fetchAll(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetchAll(PDO::FETCH_NUM);
輸出Both:$row = $result->fetchAll();

 

查詢結果迴圈給定陣列

$row = $result->fetch(PDO::FETCH_BOTH

<?php
$sql="SELECT * FROM books";
$result=$conn->query($sql);
//查詢結果迴圈給定陣列
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
$str =$row['書籍名稱'];
}

?>

輸出文字欄位:$row = $result->fetch(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetch(PDO::FETCH_NUM);
輸出Both:$row = $result->fetch(fetch(PDO::FETCH_BOTH);

 

查詢所有資料表記錄

PDO::FETCH_ASSOC:
PDO::FETCH_BOTH (default):
PDO::FETCH_BOUND:
PDO::FETCH_CLASS:
PDO::FETCH_INTO:
PDO::FETCH_LAZY:
PDO::FETCH_NAMED:
PDO::FETCH_NUM:
PDO::FETCH_OBJ:
PDO::FETCH_PROPS_LATE:

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//查詢【員工】資料表的的資料
$sql="SELECT * FROM 資料表";
$result=$conn->query($sql); // 執行查詢

//給定$row[][]二維陣列-文字欄位////////////////////////////
$row = $result->fetchAll(PDO::FETCH_ASSOC);

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

輸出文字欄位:$row = $result->fetchAll(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetchAll(PDO::FETCH_NUM);
輸出Both:$row = $result->fetchAll();

 

關鍵字查詢資料表記錄

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//關鍵字查詢資料表的的資料
if(isset($_POST['輸入查詢欄位name']))
$sql="SELECT * FROM 資料表 where 欄位名稱 like '%".$_POST['輸入查詢欄位name']."%'";
else
$sql="SELECT * FROM 資料表";

$result=$conn->query($sql); // 執行查詢

//給定$row[][]二維陣列-文字欄位////////////////////////////
$row = $result->fetchAll(PDO::FETCH_ASSOC);

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

輸出文字欄位:$row = $result->fetchAll(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetchAll(PDO::FETCH_NUM);
輸出Both:$row = $result->fetchAll();

 

根據某欄位排序

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

///讀取要排序的欄位//////////////////////////
if(isset($_GET['sortcolumn'])){
$sortcolumn = $_GET['sortcolumn'];
}else{
$sortcolumn = "預設欄位名稱";
}

//查詢資料表的的資料
$sql="SELECT * FROM 資料表 order by ".$sortcolumn." desc";
$result=$conn->query($sql); // 執行查詢

//給定$row[][]二維陣列-文字欄位////////////////////////////
$row = $result->fetchAll(PDO::FETCH_ASSOC);

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

輸出文字欄位:$row = $result->fetchAll(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetchAll(PDO::FETCH_NUM);
輸出Both:$row = $result->fetchAll();

 

查詢所有資料表記錄(尚待確認??)

SQL Injection 方式

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

$sql="SELECT * FROM 資料表 where 欄位 ='李大同'";
$stmt = $conn->prepare($sql);
// 繫結參數
$stmt->bindParam(1,$sortcolumn,PDO::PARAM_STR);
$stmt=$conn->query($sql); // 執行查詢
$stmt->execute();

//給定$row[][]二維陣列-文字欄位////////////////////////////
$row = $result->fetchAll(PDO::FETCH_ASSOC);

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

輸出文字欄位:$row = $result->fetchAll(PDO::FETCH_ASSOC);
輸出數字欄位:$rowe = $result->fetchAll(PDO::FETCH_NUM);
輸出Both:$row = $result->fetchAll();

 

新增一筆記錄

<?php
//引入資料庫設定檔案
(1).觀念:一個資料表,若有5個欄位,但是新增資料時,只insert3個欄位,就會報錯。
除非:某些欄位有預設值,或是自動新增Increment
(1).觀念:所以insert時,(A).要全部欄位都新增寫上。(B).或是某些資料表已經設定預設值。
(2).require_once("mysqlpdo.inc.php");

//新增欄位///////////////////////////////////////////
if(isset($_POST['bookname'])){
$sql="INSERT 資料表 (書籍名稱, 價格) VALUES ('{$_POST['bookname']}','{$_POST['bookprice']}')";

if ($conn->exec($sql)) // 執行SQL指令
echo "資料庫新增記錄成功 <br/>";
else
die("資料庫新增記錄失敗<br/>");

}

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

新增一筆記錄

SQL Injection 方式

PDO::PARAM_BOOL (integer)
PDO::PARAM_NULL (integer)
PDO::PARAM_INT (integer)
PDO::PARAM_STR (integer)

PDO::PARAM_STR_NATL (integer)
PDO::PARAM_STR_CHAR (integer)
PDO::PARAM_LOB (integer)
PDO::PARAM_STMT (integer)
PDO::PARAM_INPUT_OUTPUT PDO::PARAM_* data type.

(1).沒有浮點數floattype,小數的decimals ,用PDO::PARAM_STR取代,而且要轉換變數(string) $floa

(2).沒有日期時間,用PDO::PARAM_STR取代。

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

$sql="INSERT 資料表 (姓名,留言,日期時間) VALUES (?,?,?)";
$stmt = $db->prepare($sql);

// 繫結參數
$stmt->bindParam(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$message,PDO::PARAM_STR);
$stmt->bindParam(3,$strnowtime,PDO::PARAM_STR);

// 寫入資料庫
//$stmt->execute();
if ( $stmt->execute() ) // 執行SQL指令
echo "資料庫新增記錄<br/>";
else
die("資料庫新增記錄失敗<br/>");

....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

刪除一筆記錄

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//刪除欄位/////
if(isset($_GET['delnum'])){
$sql="delete from books 資料表 書籍編號=".$_GET['delnum'];
if ($conn->exec($sql)) // 執行SQL指令
echo "資料庫刪除記錄成功。<br/>";
else
die("資料庫刪除記錄失敗<br/>");
}
....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

刪除一筆記錄

SQL Injection 方式

PDO::PARAM_BOOL (integer)
PDO::PARAM_NULL (integer)
PDO::PARAM_INT (integer)
PDO::PARAM_STR (integer)

PDO::PARAM_STR_NATL (integer)
PDO::PARAM_STR_CHAR (integer)
PDO::PARAM_LOB (integer)
PDO::PARAM_STMT (integer)
PDO::PARAM_INPUT_OUTPUT PDO::PARAM_* data type.

(1).沒有浮點數floattype,小數的decimals ,用PDO::PARAM_STR取代,而且要轉換變數(string) $floa

(2).沒有日期時間,用PDO::PARAM_STR取代。

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//刪除欄位////
if(isset($_GET['delnum'])){
$sql="delete from 資料表 where 書籍編號=?";
$stmt = $conn->prepare($sql);
// 繫結參數
$stmt->bindParam(1,$_GET['delnum'],PDO::PARAM_INT);
if ($stmt->execute()) // 執行SQL指令
echo "資料庫刪除記錄成功。<br/>";
else
die("資料庫刪除記錄失敗<br/>");
}....

////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

修改一筆記錄

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//修改欄位///
if(isset($_POST['editnum'])){
$sql="update 資料表 set 書籍名稱='".$_POST['editname']."',價格=".$_POST['editprice']." where 書籍編號=".$_POST['editnum'];
if ( $conn->exec($sql) ) // 執行SQL指令
echo "資料庫更新記錄成功<br/>";
else
die("資料庫更新記錄失敗<br/>");
}
....

////釋放記憶體////////////////////////////
$conn = NULL;
//最後轉換到主網頁
header("Location:exp16-12.html");

?>

 

修改一筆記錄(再累加值)

修改一筆記錄(再累加值)
$modwork = "update `pre_forum_modwork` set `count` = `count` + 1, `posts` = `posts` + 1 where `uuid` = '$operatorid'";
if(!($db->exec($modwork) !== false))
{
die(json_encode(array("status" => "modwork")));
}

//update要特別注意:避免update和舊值一樣會報錯:if(!($db->exec($sql_member) !== false))
$sql_member ="update `pre_common_member` set `groupid` = '10', `groupexpiry` = 0 where `uuid` = '$authorid'";
//檢查是否錯誤:
if(!($db->exec($sql_member) !== false))
{
die(json_encode(array("status" => "member")));
}
//檢查是否正確:
if($db->exec($sql) !== false)
{
die(json_encode(array("status" => "OK")));
}

 

修改一筆記錄

SQL Injection 方式

PDO::PARAM_BOOL (integer)
PDO::PARAM_NULL (integer)
PDO::PARAM_INT (integer)
PDO::PARAM_STR (integer)

PDO::PARAM_STR_NATL (integer)
PDO::PARAM_STR_CHAR (integer)
PDO::PARAM_LOB (integer)
PDO::PARAM_STMT (integer)
PDO::PARAM_INPUT_OUTPUT PDO::PARAM_* data type.

(1).沒有浮點數floattype,小數的decimals ,用PDO::PARAM_STR取代,而且要轉換變數(string) $floa

(2).沒有日期時間,用PDO::PARAM_STR取代。

<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//修改欄位/////
if(isset($_POST['editnum'])){
$sql="update 資料表 set 書籍名稱=?,價格=? where 書籍編號=?";
$stmt = $conn->prepare($sql);
// 繫結參數
$stmt->bindParam(1,$_POST['editname'],PDO::PARAM_STR);
$stmt->bindParam(2,$_POST['editprice'],PDO::PARAM_STR);
$stmt->bindParam(3,$_POST['editnum'],PDO::PARAM_INT);
if ($stmt->execute()) // 執行SQL指令
echo "資料庫更新記錄成功<br/>";
else
die("資料庫更新記錄失敗<br/>");
}

....

////釋放記憶體////////////////////////////
$conn = NULL;
//最後轉換到主網頁
header("Location:exp16-12.html");

?>

 

 

查詢結果

顯示全部(方法一)

(不分頁,bootstrap,沒排序)

範例結果

$sql= "SELECT 姓名,職稱,出生日期,地址,電話號碼 FROM 資料表";
$result=$conn->query($sql);

echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><th>姓名</th><th>職稱</th><th>出生日期</th><th>地址</th><th>電話號碼</th></tr></thead><tbody>";
$mydata =$result->fetchAll(PDO::FETCH_ASSOC);

foreach($mydata as $i=>$v){

echo "<tr><td>".$v['姓名']."</td><td>".$v['職稱']."</td><td>".$v['出生日期']."</td><td>".$v['地址']."</td><td>".$v['電話號碼']."</td></tr>";
}
echo "</table>";

 

 

查詢結果

顯示全部(方法二)

(不分頁,bootstrap,沒排序)

範例結果

$sql= "SELECT 姓名,職稱,出生日期,地址,電話號碼 FROM 資料表";
$result=$conn->query($sql);

echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><th>姓名</th><th>職稱</th><th>出生日期</th><th>地址</th><th>電話號碼</th></tr></thead><tbody>";

while ($row=$result->fetch(PDO::FETCH_ASSOC)) {
echo "<tr><td>".$row['姓名']."</td><td>".$row['職稱']."</td><td>".$row['出生日期']."</td><td>".$row['地址']."</td><td>".$row['電話號碼']."</td></tr>";
}
echo "</table>";

 

查詢結果

顯示表格與分頁

(沒有標題排序)

(沒有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp15-10.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp15-10.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp15-10.php?sortcolumn=價格'>價格</a></th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

echo "<br/>";

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a></li> ";

if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a></li> ";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$i."&sortcolumn=".$sortcolumn."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁</a></li> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a></li> ";

echo "<li class='page-item'>跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li> ";
echo "</ul> ";
echo "</nav> ";

?>

 

查詢結果

顯示表格與分頁

(有標題排序)

(沒有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<br/><br/>";
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);

}
echo "</table>";

?>

 

查詢結果

顯示表格與分頁

(有標題排序)

(有刪除修改)

<?php
///計算顯示的編號~幾號/////////////////////////////////////////////////////
//設定參數
$numperpage=8; //每頁顯示筆數
$totalnum = $result->rowCount(); //全部筆數
$totalpage = ceil($totalnum/$numperpage); //最多頁數
//目前頁數 :$nowpage
if(isset($_GET['pagenum'])){
$nowpage =$_GET['pagenum'];
}else{
$nowpage =1;
}
//每頁顯示編號的min,max
$min=($nowpage-1)*$numperpage;
$max=($nowpage-1)*$numperpage+$numperpage;
if($max>$totalnum){
$max = $totalnum;
}

//顯示表格///////////////////////////////////////////
echo "<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='exp15-10.php?sortcolumn=書籍編號'>書籍編號</a></th><th><a href='exp15-10.php?sortcolumn=書籍名稱'>書籍名稱</a></th><th><a href='exp15-10.php?sortcolumn=價格'>價格</a></th><th></th><th></th></tr></thead><tbody>";
for($i=$min;$i<$max;$i++){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td><a href='exp15-10.php?delnum=%s'>刪除</a></td><td><a href='exp15-10a.php?editnum=%s&editname=%s&editprice=%s'>修改</a></td></tr>",$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍編號'],$rowpage[$i]['書籍名稱'],$rowpage[$i]['價格']);
}
echo "</tbody></table>";

echo "<br/>";

///顯示頁數//////////////////////////////////////////////
echo "<nav aria-label='Page navigation example'> ";
echo "<ul class='pagination'> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=1&sortcolumn=".$sortcolumn."'>首頁</a></li> ";

if($nowpage>1)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage-1)."&sortcolumn=".$sortcolumn."'>上一頁</a></li> ";

for($i=1;$i<=$totalpage;$i++){
if($i==$nowpage)echo "<li class='page-item'><a class='page-link'>".$i."</a></li>";
else echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$i."&sortcolumn=".$sortcolumn."'>".$i."</a></li>";
}

if($nowpage<$totalpage)echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".($nowpage+1)."&sortcolumn=".$sortcolumn."'>下一頁</a></li> ";
echo "<li class='page-item'><a class='page-link' href='exp15-10.php?pagenum=".$totalpage."&sortcolumn=".$sortcolumn."'>尾頁</a></li> ";

echo "<li class='page-item'>跳到:<input type='text' id='mynum' size=3 value='".$nowpage."' /></li> ";
echo "<li class='page-item'><a class='page-link' href='javascript:gopage()'>前往</a></li> ";
echo "</ul> ";
echo "</nav> ";

?>

 

一組輸入文字方塊,按鈕

(但是按按鈕後,輸入文字會不見)

 

<form class="form-inline" method="post" action="exp15-4.php">
<div class="form-group mb-2">
<label for="bookname" >輸入書名關鍵字:</label>
<input type="text" class="form-control" name="bookname" placeholder="輸入書名">
</div>
<button type="submit" class="btn btn-primary mb-2">查詢</button>
</form>

 

一組輸入文字方塊,按鈕

(按按鈕後,輸入文字還會繼續顯示)

 

<form class="form-inline" method="post" action="exp15-6.php">
<div class="form-group mb-2">
<label for="bookname" >輸入書名關鍵字:</label>
<input type="text" class="form-control" name="bookname" value="<?php
if(isset($_POST['bookname']))echo $_POST['bookname'];

?>">
</div>
<button type="submit" class="btn btn-primary mb-2">查詢</button>
</form>

 

兩組輸入文字方塊,一個按鈕

(在同一行)

(但是按按鈕後,輸入文字會不見)

 

<form class="form-inline" method="post" action="exp15-10.php">
<div class="form-group">
<label for="bookname" >書名:</label>
<input type="text" class="form-control" name="bookname" placeholder="輸入書名">
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="bookprice" > 價格:</label>
<input type="text" class="form-control" name="bookprice" placeholder="1">
</div>
<button type="submit" class="btn btn-primary mb-2">新增</button>
</form>

     
1

 

留言板card顯示面板

(全部顯示)(方法一)

範例結果

foreach($mydata as $i=>$v){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$v['留言編號']."】".$v['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$v['日期時間']."</h5>";
echo "<p class='card-text'>".$v['留言']."</p>";
echo "</div></div>";
}

1

 

留言板card顯示面板

(全部顯示)(方法二)

範例結果

foreach($mydata as $i=>$v){

for($i=$min;$i<$max;$i++){
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$rowpage[$i]['留言編號']."】".$rowpage[$i]['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$rowpage[$i]['日期時間']."</h5>";
echo "<p class='card-text'>".$rowpage[$i]['留言']."</p>";
echo "</div></div>";
}

2

 

留言板card顯示面板

(分頁顯示)

範例結果

while($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo "<div class='card'>";
echo "<h5 class='card-header'>【".$row['留言編號']."】".$row['姓名']."</h5>";
echo "<div class='card-body'>";
echo "<h5 class='card-title'>".$row['日期時間']."</h5>";
echo "<p class='card-text'>".$row['留言']."</p>";
echo "</div></div>";
}

 

 

 
**Chp16. ajax非同步http請求
上課範例 16-1使用ajax傳遞php的文字 16-2使用ajax傳遞php的一維陣列 16-3使用ajax讀取local電腦的json檔案 16-4使用ajax傳遞php的mysql資料表
16-5使用ajax關鍵字查詢php的mysql資料
觀摩範例 16-1檢查註冊名(XHR請求) 16-2檢查註冊名(jQuery $.ajax(),dataType=text) 16-3.檢查註冊名(jQuery $.ajax(),dataType=jsonp 16-4.檢查註冊名(jQuery $.ajax(),dataType=jsonp,建立function callBackdata
16-5-1XHR讀取php一維陣列 16-5-2XHR讀取php二維陣列(失敗) 16-5-3XHR讀取php物件陣列 16-5-4XHR讀取mySQL查詢物件陣列
16-6-1jQuery $.ajax讀取php一維陣列 16-6-2jQuery $.ajax讀取php二維陣列(失敗) 16-6-3jQuery $.ajax讀取php物件陣列 16-6-4jQuery $.ajax讀取json檔案
16-6-5jQuery $.ajax讀取mySQL查詢物件陣列 16-6-6jQuery $.ajax傳回mySQL兩組數據陣列  
16-7jQuery $.ajax讀取mySQL,Diy自行建立的json 16-8jQuery $.ajax讀取mySQL,Diy自行建立的json,success接收  
16-9.陽春ajax分頁(用javascript-DOM事件) 16-10.Bootstrap分頁(用jQuery 的DOM事件) 16-11.Bootstrap分頁排序(用jQuery 的DOM事件) 16-12.Bootstrap刪除(用jQuery 的DOM事件)
15-9修改一筆記錄 15-10新增一筆記錄(避免SQL Injection,輸入一些特殊字元而逃過檢查,而造成正常登入)) 15-11留言板card
  下載json檔案 book.json school.json personnel.json  
    zipcode01.json zipcode02.json    
關鍵程式碼(XHR讀取主機資料) XHR讀取純文字 XHR讀取陣列,物件陣列 XHR讀取json檔案 XHR讀取mySQL查詢物件
關鍵程式碼(jQuery ajax讀取主機資料) $.ajax讀取純文字 $.ajax讀取陣列,二維陣列,物件陣列 $.ajax讀取json檔案
  **$.ajax讀取mySQL查詢物件 **$.ajax傳回mySQL兩組數據陣列 $.ajax讀取jsonp,再由callBackdata函數接收 $.ajax讀取jsonp,callBackdata,但在success接收
  $.ajax讀取自己建立的jsonp,再由callBackdata函數接收      
  關鍵字查詢的ajax寫法 查詢陽春分頁的DOM
(javascript)寫法
查詢bootstrap分頁的DOM
(jQuery)寫法
查詢bootstrap分頁+表格排序的DOM
(jQuery)寫法
  虛擬產生ul-li之DOM元件的$.ajax寫法 虛擬產生table-th之DOM元件的$.ajax寫法    
關鍵程式碼(一般) 查詢所有記錄 查詢關鍵字 查詢根據某欄位排序 新增一筆記錄
  刪除一筆記錄 修改一筆記錄    
  總共幾筆記錄 總共幾個欄位 查詢結果一次給定陣列 查詢結果迴圈給定陣列
關鍵程式碼(SQL Injection ) 查詢所有記錄 新增一筆記錄 刪除一筆記錄 修改一筆記錄
關鍵程式碼(表格呈現) 查詢顯示全部(1)不分頁,bootstrap,沒排序 查詢顯示全部(2)不分頁,bootstrap,沒排序 查詢顯示顯示分頁-沒排序-沒刪除修改 查詢顯示顯示分頁-有排序-沒刪除修改
  查詢顯示顯示分頁-有排序-有刪除修改      
關鍵程式碼(輸入文字按鈕) 一組輸入文字方塊+按鈕(1)按鈕後,文字會不見 一組輸入文字方塊+按鈕(2)按鈕後,文字保留 兩組輸入文字方塊,一個按鈕(在同一行)  
關鍵程式碼(留言板card) 留言板card顯示全部(1) 留言板card顯示全部(2) 留言板card顯示分頁  
下載練習mySQL資料庫 下載資料庫      
1

16-1使用ajax傳遞php的文字

範例16-1使用ajax傳遞php的文字

1.jquery的ajax程式:

<script>
function show(v1)
{
$.get("p16-1.php?a1="+v1,function(data,status)
{
$('#t1').text(data);
});
}
</script>

<body>
<input type="text" onkeyup="show(this.value)" />
<txt id='t1'></txt>

2.php程式:

<?php
if($_GET['a1']=='john')
{
echo "你不能夠使用這個名稱".$_GET['a1'];
}
else
{
echo "你可以使用這個名稱".$_GET['a1'];
}
?>

☎成果範例:結果範例
☎程式碼(html):程式碼(html)
☎程式碼(php):程式碼(php)
1

16-2使用ajax傳遞php的一維陣列

範例16-2使用ajax傳遞php的一維陣列

1.jquery的ajax程式:

<script>
$(document).ready(function()
{
$('#b1').click(function()
{
$.get("p16-2.php",function(data,status)
{
a1 = JSON.parse(data);
//document.getElementById('sp1').innerHTML = data;
$('#sp1').text(a1[0]).append("<br>"+a1[1]).append("<br>"+a1[2]);
}); }); }); </script>

<body>
<input id="b1" type="button" value="查询主機php的陣列" />
<span id="sp1"></span>

2.php程式:

<?php
$a1[0] = 'john';
$a1[1] = 'tom';
$a1[2] = 'jane';
echo json_encode($a1);
?>

☎成果範例:結果範例
☎程式碼(html):程式碼(html)
☎程式碼(php):程式碼(php)
1

16-3使用ajax讀取local電腦的json檔案

範例16-3使用ajax讀取local電腦的json檔案

1.下載json檔案

1.jquery的ajax程式:

<script>
$(document).ready(function()
{
$('#b1').click(function()
{
$.get("book.json",function(data,status)
{
//ajax讀取josn檔案後,直接就轉成object array, 不需要再用JSON.parse()轉換了
//alert(data[0].id + ',' + data[0].title)
str = '<table class="table table-striped" border=1 style="width:100%"> <tr class="thead-dark"> <th>title</th> <th>author</th> <th>pub date</th> </tr>';
for(i in data)
{
str += '<tr><td>'+ data[i].title +'</td><td>'+ data[i].author +'</td><td>'+ data[i].pubdate +'</td></tr>';
}
str += '</table>';
//$('#txt1').text(str);
document.getElementById('txt1').innerHTML = str;
});
});
});
</script>

☎成果範例:結果範例
☎程式碼(html):程式碼(html)
1

16-4使用ajax傳遞php的mysql資料表

範例16-4使用ajax傳遞php的mysql資料表

1.下載資料庫

1.jquery的ajax程式:

<script>
$(document).ready(function()
{
$('#b1').click(function()
{
//ajax request to server
$.get("p16-4.php",function(data,status)
{
//1.把json純文字pure text(data)轉成物件陣列a1(object + array)
a1 = JSON.parse(data);

//2.第一筆資料(a1[0])的書籍名稱欄位 = a1[0].書籍名稱
//alert(a1[0].書籍名稱);
//$("#t1").text(a1[0].書籍名稱);

//3.把表格table分成三部分:txt1,txt2,txt3
txt1 = '<table class="table table-striped"> <tr class="table-primary"> <td>書籍編號</td> <td>書籍名稱</td> <td>價格</td> </tr>';
txt2 = "";
for(i in a1)
{
txt2 += '<tr> <td>' + a1[i].書籍編號 + '</td> <td>' + a1[i].書籍名稱 + '</td> <td>' + a1[i].價格 + '</td> </tr> ';
}
txt3 = '</table>';

//4.output有兩種方式:
//(1)在id='t1'處顯示文字:$("#t1").text(...);
//(2)在id='t1'處顯示html:$("#t1").html(...);
$("#t1").html(txt1+txt2+txt3);
});
});
});
</script>

<body>
查詢主機php:<input type="button" id="b1" class="btn btn-warning" value="ajax search mysql data" />
<div id="t1"></div>

2.php程式:

<?php
//echo "good luck";
//1.conect to database
$conn = new mysqli("localhost","root","","ch09");
$conn->set_charset('utf8');

//2.search the data table(books)
$result = $conn->query("select * from books");

//3.get the 1st row
//there are 4 method to get data
//(1)fetch_row(), only number index like $row[1]: $row = $result->fetch_row(); echo $row[1] = 'php程式教學';
//(2)fetch_assoc(), only column nmae like $row["書籍名稱"]: $row = $result->fetch_assoc(); echo $row["書籍名稱"] = 'php程式教學';
//(3)fetch_array(), both index & column nmae like $row[1],$row["書籍名稱"]: $row = $result->fetch_array(); echo $row["書籍名稱"] = 'php程式教學';
//(4)fetch_all();
//$row = $result->fetch_assoc();
//echo $row['書籍名稱'];

//get 2nd row;
//echo "<br>";
//$row = $result->fetch_row();
//echo $row[1];

//get 3rd row;
//echo "<br>";
//$row = $result->fetch_array();
//echo $row[0].", ".$row["書籍名稱"];

//get all data
$rowall = $result->fetch_all(MYSQLI_ASSOC);
//fetch_all(參數),有三種參數:
//(1)MYSQLI_ASSOC:會輸出 the 欄位名稱index
//(2)MYSQLI_NUM:會輸出 the 欄位編號num index
//(3)MYSQLI_BOTH:兩個都會輸出(欄位名稱,編號)
//若輸出資料有中文會產生亂碼,解決方法:echo json_encode($rows,JSON_UNESCAPED_UNICODE);
echo json_encode($rowall,JSON_UNESCAPED_UNICODE);

//4.close connect
$conn->close();
?>

☎成果範例:結果範例
☎程式碼(html):程式碼(html)
☎程式碼(php):程式碼(php)
1

16-5使用ajax關鍵字查詢php的mysql資料

範例16-5使用ajax關鍵字查詢php的mysql資料

1.下載資料庫

1.jquery的ajax程式:

<script>
$(document).ready(function()
{
$("#t1").keyup(function()
{
//alert(this.value);
//use ajax and request to php
$.get("p16-5.php?a1="+this.value,function(data,status)
{
alert(data);
});
});
});
</script>

<body>
<div class="container">
Use keyword to search books
<input type="text" id="t1" />
</div>

2.php程式:

<?php
//purpose: get the data from mysql database ch09/books
//1.connect to database ch09
$conn = new mysqli("localhost","root","","ch09");
$conn->set_charset("utf8");

//2.search for datatable: books
$a1 = $_GET['a1'];
$result = $conn->query("select * from books where 書籍名稱 like '%".$a1."%'");

//3.output all the data
$alldata = $result->fetch_all(MYSQLI_BOTH);
//echo $alldata[0][1];

//4.output to json text from 2d array
//若輸出資料有中文會產生亂碼,解決方法:echo json_encode($rows,JSON_UNESCAPED_UNICODE);
echo json_encode($alldata,JSON_UNESCAPED_UNICODE);

//5.close connection
$conn->close();
?>

☎成果範例:結果範例
☎程式碼(html):程式碼(html)
☎程式碼(php):程式碼(php)
  如何從javascript經由ajax傳送二維陣列到php

如何從javascript經由ajax傳送二維陣列到php
重點1:在ajax要先把陣列轉成json
ajax把陣列轉成json方法 = JSON.stringify(forum_arr);

重點2:在php再把接收來的json轉成陣列
把json轉成陣列方法:json_decode(stripslashes($_G['json']))

範例:
(1).manageForum.js
//二維陣列
var forum_arr = new Array();
var i=0;
$('.row.forum-list.show').each(function()
{
forum_arr[i] = new Array();
forum_arr[i][0] = $(this).prop('id');
forum_arr[i][1] = $('#displayorder_'+$(this).prop('id')).val();
forum_arr[i][2] = $('#name_'+$(this).prop('id')).val();
i++;
});
var jsonString_forum_arr = JSON.stringify(forum_arr);
$.ajax({
type: "POST",
url: "./?sub=action&type=forum_edit",
data: data_string + "&hash_string=" + hash_string,
cache: false,
dataType: "json",
success: function(data)
{

(2).forum_edit.php
//把json轉成陣列(json_decode())
$forum_arr = json_decode(stripslashes($_G['forum_arr']));
$a1 = $forum_arr[0][2];

  ajax如何讀取傳回的陣列

10.ajax如何讀取傳回的陣列(json)
一維陣列:
name = data[0].書籍名稱;
二維陣列:
name = data.data[0].書籍名稱;
陣列長度:
num = data.data.length }

  ajax讀取php的json陣列的兩種格式 32.javascript用ajax讀取php的jsong陣列
兩種格式都可以
success: function(data){
(1). alert(data['parameter']['type'])
(2). alert(data.parameter.type)

php:
$myJSON = array("status" => "OK", "content" => $content,"rowcount"=>$result->rowCount(),'parameter'=>$memberstatus);
 

 

$.ajax傳回純文字

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
//發出 ajax call
var data = $.ajax({
type: "get",
async: true,
url: target,
error: function(){
alert("連線主機發生錯誤!");
},
success: function(data){
document.getElementById('result').innerHTML = data;
}
});
}
</script>

//#########################

<?php

$txt = "$name 這個姓名沒有人註冊過,可以使用";

echo $txt;
?>

 

 

$.ajax讀取陣列,二維陣列,物件陣列

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
//發出 ajax call
var data = $.ajax({
type: "GET",
async: true,
url: target,
dataType: "json",
success: function(jsonObj){
str ="";

/////////////////////////////////////////////////////////
//data本身就是陣列
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-dark'><tr><th>英文教學</th></tr></thead><tbody>";
for(i in jsonObj){
str += "<tr><td>" + jsonObj[i] + "</td></tr>";
}
str +="</tbody></table>"
document.getElementById("result").innerHTML += str;
///////////////////////////////////////////
},
error: function(){
alert("連線出現錯誤");
}
});
}
</script>

//####################################
<?php
//php陣列,物件
$a[0] = "Did you lose weight intentionally?妳有故意在減肥嗎?";
$a[1] = "I've got missed calls. 我有未接來電耶~";
$a[2] = "I wonder which shoes to put on. 該穿那雙鞋呢?";

$myJSON = json_encode($a);

echo $myJSON;

 

 

$.ajax讀取json檔案

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(){
$.ajax({
type: 'GET',
async: true,
url: 'json/book.json',
dataType: "json",
success: function(jsonObj){
str ="";
/////////////////////////////////////////////////////////
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-dark'><tr><th>書名</th><th>作者</th><th>出版日</th></tr></thead><tbody>";
for(i in jsonObj){
str += "<tr><td>" + jsonObj[i].title + "</td><td>" + jsonObj[i].author + "</td><td>" + jsonObj[i].pubdate + "</td></tr>";
}
str +="</tbody></table>"
document.getElementById("result").innerHTML += str;
/////////////////////////////////////////////////////////
},
error: function(){
console.log(result);
alert("連線出現錯誤");
}
});
}
</script>

 

 

**實用

$.ajax讀取mySQL查詢物件

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
//發出 ajax call
$.ajax({
type: 'GET',
async: true,
url: target,
dataType: "json",
success: function(jsonObj){
str ="";
///////////////////////////////////////
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-dark'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead><tbody>";
for(i in jsonObj){
str += "<tr><td>" + jsonObj[i].書籍編號 + "</td><td>" + jsonObj[i].書籍名稱 + "</td><td>" + jsonObj[i].價格 + "</td></tr>";
}
str +="</tbody></table>"
document.getElementById("result").innerHTML += str;
//////////////////////////////////////
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log("XMLHttpRequest", XMLHttpRequest);
console.log("textStatus", textStatus);
console.log("errorThrown", errorThrown);
}
});
}
</script>

//########################################
<?php
header("Content-Type: application/json; charset=UTF-8");

//查詢資料表
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//關鍵字查詢資料表的的資料
$sql="SELECT * FROM books";
$result=$conn->query($sql); // 執行查詢

//給定$rowpage[][]二維陣列///////////////////
//$row = $result->fetchAll();//不可以用both,否則json格式不對,只能傳回文字欄位 FETCH_ASSO
$row = $result->fetchAll(PDO::FETCH_ASSOC);

/////傳回將物件轉換成json的物件////////////////////
//解決問題一:PHP json_encode() MySQL抓取中文字資料亂碼問題:json_encode($row,JSON_UNESCAPED_UNICODE)
$myJSON = json_encode($row,JSON_UNESCAPED_UNICODE);

echo $myJSON;

////釋放記憶體////////////////
$conn = NULL;

?>

 

 

**實用

**$.ajax傳回mySQL兩組數據陣列

 

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
$.ajax({
type: 'GET',
async: true,
url: target,
dataType: "json",
success: function(jsonObj){
str ="";
/////////////////////////////////////////////////////////
//jsonObj本身就是陣列,不須要再轉換

str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-dark'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead><tbody>";
for(i in jsonObj.data){
str += "<tr><td>" + jsonObj.data[i].書籍編號 + "</td><td>" + jsonObj.data[i].書籍名稱 + "</td><td>" + jsonObj.data[i].價格 + "</td></tr>";
}
str +="</tbody></table>"
document.getElementById("result").innerHTML += str;

},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log("XMLHttpRequest", XMLHttpRequest);
console.log("textStatus", textStatus);
console.log("errorThrown", errorThrown);
}

});
}
</script>

//#########################################
<?php
header('Content-type: application/json');

//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//關鍵字查詢資料表的的資料
$sql="SELECT * FROM books";
$result=$conn->query($sql);

$row = $result->fetchAll(PDO::FETCH_ASSOC);

//取得查詢結果的筆數
$rowCount = $result->rowCount();

//目前頁數
$nowpage= 2;

//輸出兩組數據,一個為資料表數據data,一個為參數parameter
$myJSON = array('data'=>$row,'parameter'=>array("rowCount"=>$rowCount,"nowpage"=>$nowpage));

/////傳回將物件轉換成json的物件////////////////////
//解決問題一:PHP json_encode() MySQL抓取中文字資料亂碼問題:json_encode($row,JSON_UNESCAPED_UNICODE)
$myJSON = json_encode($myJSON,JSON_UNESCAPED_UNICODE);

echo $myJSON;

////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

 

**實用

$.ajax讀取自己建立的jsonp,再由callBackdata函數接收

 

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
var data = $.ajax({
type: "get",
async: true,
url: target,
dataType: "jsonp",
jsonpCallback:"callBackdata",
});
}

function callBackdata(txt) {
//轉換字串變成json物件變數
var jsonObj = JSON.parse(txt);
str ="";
//////////////////////////////
//在這裡,顯示表格
///////////////////////////
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><th>書籍編號</th><th>書籍名稱</th><th>價格</th></thead<tbody>";
for(i in jsonObj)
{
str += "<tr><td>" + jsonObj[i].id + "</td><td>" + jsonObj[i].name + "</td><td>" + jsonObj[i].price + "</td></tr>";
}
str +="</table>"
document.getElementById("result").innerHTML = str;
}
</script>

//############################
<?php
//引入資料庫設定檔案
require_once("mysqlpdo.inc.php");

//關鍵字查詢資料表的的資料
if(isset($_GET['bookname']))
$sql="SELECT * FROM books where 書籍名稱 like '%".$_GET['bookname']."%'";
else
$sql="SELECT * FROM books";
$result=$conn->query($sql); // 執行查詢

//將查詢結果,輸出成json物件變數
$str="callBackdata(JSON.stringify([";
$i=0;
while($row = $result->fetch(PDO::FETCH_BOTH)) {
$str .="{\"id\":\"".$row['書籍編號']."\",";
$str .="\"name\":\"".$row['書籍名稱']."\",";
$str .="\"price\":\"".$row['價格']."\"}";
$i +=1;
if ($i != $result->rowCount())$str .=",";
}//end of while

$str .="]));";

echo $str;
////釋放記憶體////////////////////////////
$conn = NULL;

?>

 

 

**實用

已經存在html元件的呼叫$.ajax寫法

 

例如:textboxk查詢關鍵字

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
$.ajax({
type: 'GET',
async: true,
url: target,
dataType: "json",
success: function(jsonObj){
str ="";
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-dark'><tr><th>書籍編號</th><th>書籍名稱</th><th>價格</th></tr></thead><tbody>";
for(i=min;i<max;i++){
str += "<tr><td>" + jsonObj.data[i].書籍編號 + "</td><td>" + jsonObj.data[i].書籍名稱 + "</td><td>" + jsonObj.data[i].價格 + "</td></tr>";
}
str +="</tbody></table>"
document.getElementById("result").innerHTML = str;
},
error: function(XMLHttpRequest, textStatus, errorThrown) {}
});
}
</script>

//###########################

<form class="form-inline" method="" action="">
<div class="form-group mb-2">
<label for="bookname" >輸入書名關鍵字:</label>
<input type="text" class="form-control" name="bookname" id="bookname"
onkeyup="ajaxCall('exp16-9-keyword.php?name='+this.value)" placeholder="輸入書名">
</div>

</form>

<div id="result"></div>

 

 

**實用

自己虛擬製造的DOM元件之呼叫$.ajax寫法

 

例如:
虛擬產生的ul-li項目

1.先刪除所有舊的的Dom
$('.page-item').remove();

 

2.再append你要放入的bootstrap的語法(一定要頭尾標籤同時放入,可用str累加)

$('#ul01').append("<li id='litop' class='page-item'><a class='page-link' href='#' id='1'>首頁</a></li>");

 

3.再$('li a').bind('click', function() {...},
**利用$(this).html()取得按到元件的innerHtml文字
**利用$(this).attr('id')取得被按到的元件的id值
**所以,可先把數值儲存到id或innerHtml

$('li a').bind('click', function() {
ajaxCall("exp.php?num="+
$(this).attr('id'));
});

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
$.ajax({
type: 'GET',
async: true,
url: target,
dataType: "json",
success: function(jsonObj){

//先刪除所有舊的 page-item 的Dom ////////////
$('.page-item').remove();
/////////////////////////////////
$('#ul01').append("<li id='litop' class='page-item'><a class='page-link' href='#' id='1'>首頁</a></li>");

//////////////////////////////
//雖然用迴圈輸出的多個元件,但沒關係,只要用$('li a').bind('click', function() {。。。。就可以知道那個超連結a被按到了,
///$(this)代表這個被按到的元件
//$(this).html()代表這個被按到的元件的innerHtml文字
//$(this).attr('id')代表這個被按到的元件的id值,我們先把頁數放到每個li的id,然後被按到時就到這個id的頁數
//這樣的根據id到頁數的好處是,只要一個偵測按鈕click的事件函數即可,不須要寫很多偵測事件
/// 偵測目前被點按的element,呼叫其innerhtml內數字的頁數的ajaxCall()
// 注意不可以選li元素$('li'),因為li裡面還有a,所以必須選$('a'),或是$('li a')
//只有會處理DOM事件,才能做到類似google的全純網頁的ajax即時無痕傳遞
$('li a').bind('click', function() {
ajaxCall("exp16-10-keyword.php?pagenum="+
$(this).attr('id')+"&name="+bookname.value);
});

</script>

//########################################

<div id="paging">
<nav aria-label="Page navigation example">
<ul class="pagination" id="ul01">

</ul>
</nav>
</div>

 

 

**實用

自己虛擬製造的DOM元件之呼叫$.ajax寫法

 

例如:
虛擬產生的table-th項目

1.先刪除所有舊的的Dom
$('#result').empty();

 

2.再append你要放入的bootstrap的語法(一定要頭尾標籤同時放入,可用str累加)

$('#result').append(str);

 

3.再$('li a').bind('click', function() {...},
**利用$(this).html()取得按到元件的innerHtml文字
**利用$(this).attr('id')取得被按到的元件的id值
**所以,可先把數值儲存到id或innerHtml

$('th a').bind('click', function() {
ajaxCall("exp.php?num="+
$(this).attr('id'));
});

<script src="jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
function ajaxCall(target){
$.ajax({
type: 'GET',
async: true,
url: target,
dataType: "json",
success: function(jsonObj){

// 表格及排序 /////////////////
// 先把result裡面所有的Dom元件都清除 //////////////////////
// 觀念:append DOM注意事項:若沒有把結尾標籤加上,它會自動加上結尾標籤,例如: $('#result').append("<table>"),它會自動加上</table>
// 解決方法1:要在append(裡面),把所有頭中尾標籤,都寫上
// 解決方法2:但若是這個標籤很複雜,還要加上迴圈來產生的話,解決法:先儲存在str +=..,最後再一次append(str),即可
$('#result').empty();
str="<table class='table table-striped table-bordered table-condensed'><thead class='thead-light'><tr><th><a href='#'>書籍編號</a></th><th><a href='#'>書籍名稱</a></th><th><a href='#'>價格</a></th></tr></thead><tbody>";

for(i=min;i<max;i++){
str+="<tr><td>" + jsonObj.data[i].書籍編號 + "</td><td>" + jsonObj.data[i].書籍名稱 + "</td><td>" + jsonObj.data[i].價格 + "</td></tr>";
}
str+="</tbody></table>";
$('#result').append(str);
// document.getElementById("result").innerHTML = str;
////////////////////////////

///////////////////////////
//雖然這是用迴圈輸出的多個元件,但沒關係,只要用$('li a').bind('click', function() {。。。。就可以知道那個超連結a被按到了,
///$(this)代表這個被按到的元件
//$(this).html()代表這個被按到的元件的innerHtml文字
//$(this).attr('id')代表這個被按到的元件的id值,我們先把頁數放到每個li的id,然後被按到時就到這個id的頁數
//這樣的根據id到頁數的好處是,只要一個偵測按鈕click的事件函數即可,不須要寫很多偵測事件
/// 偵測目前被點按的element,呼叫其innerhtml內數字的頁數的ajaxCall()
// 注意不可以選li元素$('li'),因為li裡面還有a,所以必須選$('a'),或是$('li a')
//只有會處理DOM事件,才能做到類似google的全純網頁的ajax即時無痕傳遞

$('th a').bind('click', function() {
ajaxCall("exp16-11-sort-keyword.php?sortcolumn="+$(this).html()+"&name="+bookname.value);
});

</script>

//######################

<div id="result"></div>

     
     
 

 

 
Chp17. 無限捲頁功能(infinite scroll)(ajax)求
練習範例 17-1.jQuery寫法無限捲頁到底 17-2.javaScript寫法無限捲頁到底 17-3.javaScript-關鍵字查詢,無限捲頁 17-4.javaScript-捲頁時提示讀取中,讀取完畢
17-5.javaScript-是否more,按鈕再捲頁 17-6.javaScript-捲頁時提示讀取中,讀取完畢 17-7避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次  
練習範例 toastr訊息1 toastr訊息2 toastr訊息3 常用toastr訊息指令自己整理
關鍵程式碼(jQuery) jQuery寫法無限捲頁      
關鍵程式碼(javascript) javascript無限捲頁 javaScript關鍵字查詢,無限捲頁 javaScript-捲頁時提示讀取中,讀取完畢 javaScript-是否more,按鈕再捲頁
  javaScript-捲頁時提示讀取中,讀取完畢 避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次    
下載練習mySQL資料庫 下載資料庫      
  避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次

7.避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次
var loading=false;
function onReachScrollLimit(){
if(loading){return;}
loading=true;
load_new_posts();
}
function load_new_posts(){
//insert the posts
loading=false;
}

 

 

jQuery v.s javascript

起始值事件

jQuery:
$(document ).ready(function() {
alert(111);
});

/////////////////////////

javascript:
<body onLoad="ajaxCall()">

 

 

jQuery v.s javascript

捲頁事件

jQuery:
$(window ).scroll(function() {
alert(111);
});

/////////////////////////

javascript:
<body onscroll="showscroll()">

 

 

表格若要不斷新增累加

在p2處累加

<table id="p1" class='table table-striped table-bordered table-condensed'>
<thead class='thead-dark'>
<tr>
<th>書籍編號</th><th>書籍名稱</th><th>價格</th>
</tr>
</thead>
<tbody id='p2'>
</tbody>
</table>

 

 

捲頁超過超過視窗底部的判別

function showscroll(){
if($(window).scrollTop() >= $(document).height() - $(window).height()-10) {

 

}
}

 

 

**實用

$.ajax讀取時傳遞變數data

 

在PHP讀取資料庫,讀取筆數

'offset' =起始編號(由0開始

'limit' = 一次讀取幾個

var data = $.ajax({
type: "get",
async: true,
url: "test17-2.php",
dataType:"json",
data: {
'offset':flag,
'limit':10
},
error: function(){
alert("連線主機發生錯誤!");
},
success: function(jsonObj){
//////////////////////////////////
str="";
for(i in jsonObj){
str += "<tr><td>" + jsonObj[i].書籍編號 + "</td><td>" + jsonObj[i].書籍名稱 + "</td><td>" + jsonObj[i].價格 + "</td></tr>";
}
document.getElementById('p2').innerHTML += str;

flag +=10;
}
});

 

 

**實用

SQL語法,一次讀取限制幾個

 

 

(1).select * from 資料表 offset recNum limit recCnt

offset:起始值

limit:讀取幾個

 

(2).在PHP的SQL,若要加入php變數

$sql="SELECT * FROM 資料表 LIMIT {$limit} OFFSET {$offset}";

  避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次

//pauseajax=true不可再做ajax請求,除非已經接受到資料了,才將pauseajax=false變成可ajax請求狀態///
var pauseajax=false;

function showscroll(){
///pauseajax == true,不可 就離開function////////////////
if(pauseajax){return;}

if($(window).scrollTop() >= $(document).height() - $(window).height()-10) {
///pauseajax=true不可再做ajax請求,除非已經接受到資料了,才將pauseajax=false變成可ajax請求狀態///
pauseajax = true;

var data = $.ajax({
type: "get",
async: true,
url: "exp17-6.php",
dataType:"json",
data: {
'offset':flag,
'limit':12
},
error: function(){
///pauseajax=true就離開function,pauseajax=false就讀取資料////////////////
pauseajax = false;
},
success: function(jsonObj){
///pauseajax=true就離開function,pauseajax=false就讀取資料////////////////
pauseajax = false;
/////輸出結果/////////////////////////////////

flag +=12;
}//end of if(jsonObj == '')

}
});
}//end if($(window).scrollTop(
}// end function

  8.bootstrap pagy分頁套件 pagy
8.bootstrap pagy分頁套件 pagy
Demo
http://medihack.github.io/bootstrap-pagy/demo/
https://github.com/medihack/bootstrap-pagy
  7.避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次 7.避免捲頁時瞬間兩次ajax請求而造成傳回同樣資料兩次
var loading=false;
function onReachScrollLimit(){
if(loading){return;}
loading=true;
load_new_posts();
}
function load_new_posts(){
//insert the posts
loading=false;
}
  6.jquery alert訊息插件
toastr.error

6.jquery alert訊息插件
(0).下載css,js
toastr.min.css
toastr.min.js

(1).先載入css,js
<link href="css/toastr.min.css?<!--{$jshash}-->" rel="stylesheet">
<script src="js/toastr.min.js?<!--{$jshash}-->"></script>

(2).
toastr.error("&nbsp; &nbsp; 伺服器忙碌中請稍候!!");

https://github.com/CodeSeven/toastr
Demo
Demo can be found at http://codeseven.github.io/toastr/demo.html
Demo using FontAwesome icons with toastr

  toastr常用訊息指令

toastr常用訊息指令: 範例: (0).下載css,js
toastr.min.css
toastr.min.js

(1).先載入css,js
<link href="css/toastr.min.css?<!--{$jshash}-->" rel="stylesheet">
<script src="js/toastr.min.js?<!--{$jshash}-->"></script>

(2).可以直接顯示信息,但是都是偏右方顯示(沒有closeButton,時間過長)
綠色(success)成功訊息
toastr.success('    操作成功');
黃色(warning)警告訊息
toastr.warning('    操作成功');
綠色(error)錯誤訊息
toastr.error('    操作錯誤');

(3).要再加上toastr.options.xxx = xxx, 才能控制顯示訊息的參數
_(A).水平置中,垂直靠頂:
toastr.options.positionClass = "toast-top-center";

_(B).水平置中,垂直置中:
toastr.options.positionClass = "toast-middle-center";

_(C).顯示關閉按鈕:
toastr.options.closeButton = true;

_(D).只顯示1秒:
toastr.options.timeOut = 1000;

_(E).顯示警告訊息,並且只有1秒,然後就重新刷新網頁:
toastr.success('    操作成功');
setTimeout(function()
{
window.location.reload(true);
},1000);

_(F).點按訊息,會呼叫函數:
toastr.options.onclick = function(){alert('say hi...')};
toastr.error("  操作失敗!");

  toastr訊息視窗

Link to toastr.css,toastr.js
// Display an info toast with no title
toastr.info('Are you the 6 fingered man?')

// Display a warning toast, with no title
toastr.warning('My name is Inigo Montoya. You killed my father, prepare to die!')

// Display a success toast, with a title
toastr.success('Have fun storming the castle!', 'Miracle Max Says')

// Display an error toast, with a title
toastr.error('I do not think that word means what you think it means.', 'Inconceivable!')

// Immediately remove current toasts without using animation
toastr.remove()

// Remove current toasts using animation
toastr.clear()

// Override global options
toastr.success('We do have the Kapua suite available.', 'Turtle Bay Resort', {timeOut: 5000})

  toastr設定參數

//Optionally enable a close button
toastr.options.closeButton = true;

//Optionally override the close button's HTML.
toastr.options.closeHtml = '<button><i class="icon-off"></i></button>';

//Optionally override the hide animation when the close button is clicked (falls back to hide configuration).
toastr.options.closeMethod = 'fadeOut';
toastr.options.closeDuration = 300;
toastr.options.closeEasing = 'swing';

//設定慢慢消失,顯示在中央
toastr.options.fadeOut = 500;
toastr.options.positionClass = "toast-middle-center";

//Show newest toast at bottom (top is default)
toastr.options.newestOnTop = false;

//Callbacks
// Define a callback for when the toast is shown/hidden/clicked
toastr.options.onShown = function() { console.log('hello'); }
toastr.options.onHidden = function() { console.log('goodbye'); }
toastr.options.onclick = function() { console.log('clicked'); }
toastr.options.onCloseClick = function() { console.log('close button clicked'); }

//Easings
//Optionally override the animation easing to show or hide the toasts. Default is swing. swing and linear are built into jQuery.
toastr.options.showEasing = 'swing';
toastr.options.hideEasing = 'linear';
toastr.options.closeEasing = 'linear';

//Animation Method
toastr.options.showMethod = 'slideDown';
toastr.options.hideMethod = 'slideUp';
toastr.options.closeMethod = 'slideUp';

//Timeouts
// How long the toast will display without user interaction
toastr.options.timeOut = 30;
// How long the toast will display after a user hovers over it
toastr.options.extendedTimeOut = 60;

//Progress Bar
//Visually indicate how long before a toast expires.
toastr.options.progressBar = true;

  toastr.error('')訊息窗

(0).下載css,js
toastr.min.css
toastr.min.js

(1).先載入css,js
<link href="css/toastr.min.css?<!--{$jshash}-->" rel="stylesheet">
<script src="js/toastr.min.js?<!--{$jshash}-->"></script>

(2).toastr訊息窗
toastr.error("    伺服器忙碌中請稍候!!");

(3).訊息只顯示0.5秒
toastr.options.fadeOut = 500;
toastr.error("    操作失敗");

 

5.jquery 幻燈片插件

bxSlider

5.jquery 幻燈片插件
https://bxslider.com/examples/auto-show-start-stop-controls/

$(".bxslider").bxSlider();

     
     
 

 

 
Chp18 : 申請免費的php網站空間
目錄 1.byethost免費網站空間 2.0fees免費網站空間 3.AwardSpace老牌高速免費網站空間
  (1)byethost免費網站空間

(1) byethost登入教學檔案
(2)Byethost介紹:
月流量:50GB
網站空間:1GB
綁定域名:可(5組)
支援服務:PHP、MySQL、FTP
後台管理:Cpanel
是PHP 資料庫MySQL與bytehost免費架站
優點:能建立多個資料庫,是其它免費空間的母網站,行之多年,沒有關閉
缺點:網絡不穩,常常斷線
缺點:php支援5版本,印出json,text會加上很多<>tag(造成appinventor的讀取錯誤)
(3)申請網址
線上申請完畢後,要到你的email信箱啟動帳號(被放在垃圾郵件區),啟動後它會給你Control panel username(登入帳號)
圖式:
(4)登入cpanel網址
(5)上傳檔案:在file manager直接拖曵上傳
(6)範例:http://acupun.byethost7.com/appinventor/personnel.xml

  (2)0fees免費網站空間

(1)0fees介紹:
月流量:10GB
網站空間:300M
支援服務:PHP、MySQL、FTP
後台管理:Cpanel
0fees提供300M的免費空間,月流量10GB,1個FTP帳號,最多可綁定5個功能變數名稱。最多可以創建7個MySql資料庫,容量跟Byethost一樣也僅有50M
功能與byethost一樣,它是向byethost購買的二包
優點:網絡穩,不太會斷線
缺點:php支援5版本,印出json,text會加上很多<>tag(造成appinventor的讀取錯誤)
(2)申請網址
線上申請完畢後,要到你的email信箱啟動帳號(被放在垃圾郵件區),啟動後它會給你Control panel username(登入帳號)
(3)登入cpanel網址
(4)上傳檔案:在file manager直接拖曵上傳

  (3)AwardSpace老牌高速免費網站空間

(1)AwardSpace介紹:
優點1:php支援7.2版本,印出json,text沒有加上很多<>tag
優點2:所以若要結合app inventor,就要用awardSpace
優點3:網絡穩,不太會斷線
缺點:只能建立一個資料庫,第二個要收錢
使用教學

(2)申請網址
線上申請完畢後,要到你的email信箱啟動帳號(被放在垃圾郵件區),啟動後它會給你Control panel username(登入帳號)
(3)登入cpanel網址
(4)上傳檔案:在file manager直接拖曵上傳