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.結果範例
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>) <br/>";
echo "< " 大家好"> ;<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代碼:'&,",',<,> <br/>";
$a = "<'a'>";
//$a = "&,",',<,>";
//$a = "'abc'";
echo $a."<br/>";
echo "htmlentities(5個html代碼)= ".htmlentities($a,ENT_QUOTES);
echo "<br/>htmlspecialchars(5個html代碼)=".htmlspecialchars($a,ENT_QUOTES);
echo "<br/>兩者結果,一樣";
?>
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 __construc t($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)e cho "$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/>";
☎成果範例:結果範例
☎程式碼:程式碼
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(欄位) a s 最高價
3.計算最低值: min(價格) a s 最低價
4.計算總和: sum(價格) as 總和價
5.計算平均值: avg(價格) a s 平均價
範例結果
//查詢【員工】資料表的的資料
$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 (' ', ' ', 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'> 跳到:<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 (' ', ' ', 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(" 伺服器忙碌中請稍候!!");
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();