星期四, 8月 26, 2010

20100826 PHP-MySQL-CLASS 12

20100826  PHP-MySQL-CLASS 12

CSV 檔案匯出及匯入 [ 使用 class 講義 ]

匯出
  • 以 mysql 指令加上 select 語法
  • 匯出檔案位於資料庫所在的目錄內
    • Windows ( Appserv ):  Appserv\MySQL\data\資料庫
    • Linux:   /var/mysql/data


Q: 為何 uploadcsv.php 在 IE 是空白的?
A:
  • 缺少 < meta >  標籤
  • < meta >標籤在 < title > 之後
    • 請調整順序
  • 以上 2 點只在 IE 下發生, 其他瀏覽器不會發生


透過表單匯入 CSV 檔案
  • CSV  檔案為資料表資料, 分隔符號為,
    • phpmyadmin 匯出資料的分隔符號為 ; php 網頁內自訂分隔符號為 ,  且 excel 設定為 , 所以請留意 CSV 的分隔符號
  • 檔案上傳後, 使用 fopen(  ) 開啟檔案, 最後以 fclose(  ) 關閉檔案, 開啟檔案時, 逐列讀取 ( Q: 如何知道 欄位如何分隔 ?)
  • 由練習可知, MySQL 允許一次新增多筆資料 ( 請將 $sql echo 出來查看 )


CSV  下載
  • 因為不需在瀏覽器顯示,  所以不需 html 標籤, 使用  header(  )  函數指定檔案類型
  • show columns from student1 是 MySQL 的指令, 指 "顯示 student1 資料表攔位資訊"


MyISAM 與 Innodb 差別
  • 兩者均是 MySQL 資料庫引擎
  • Innodb 的功能為 "交易”, 資料更改時,其他人不能更改
  • Innodb 較耗資源, MySQL預設關閉
  • 資料庫若為 Innodb, 資料庫存取語法亦要增改, 不是引擎改了就有交易功能.


my.ini [ Linux 內可能是 my.cnf ] 設定
  • 若要使用 innodb,  請取消 skip_innodb
  • read_buffer_size 若太小,  讀取資料可能會中斷 ( 若MySQL 內有二進位資料 ,建議調大 )


*當 php 網頁以圖形, pdf, CSV 等形式呈現, 不能有網頁輸出, 引用檔案亦不能有 echo 或是空格出現

資料庫網頁建議
  1. 新增
  2. 列表
  3. 更新
  4. 刪除
  5. 列表以下兩個二選一
    1. 加分頁
    2. 加查詢
  6. 列表加分頁及查詢


更新及刪除須確認資料是不是唯一的資料
  • 一般都是以主索引欄位作為 Hyperlink 所攜帶的參數內容

星期二, 8月 24, 2010

20100824 PHP-MySQL-CLASS 11

20100824 PHP-MySQL-CLASS 11

建立一個 Netbean 的PHP 專案 class11
建立新專案
File → New Project
PHP: PHP Application → Next
點選 Browse 按鈕 建立一個 class11 資料夾( source 按鈕調整於 C:\Appserv\www 目錄下 [網站根目錄] )
Finish


mysq 相關函數:
自 php4 支援至今, 現有幾個問題
  • 不能參數化執行 SQL 語法
    • 資安問題
  • 不能一次執行多個 SQL 語法
    • 效能問題
  • 不能檢測 Server 及 資料庫異常原因



mysqli 相關函數:
  • php5 內新增的函數, 解決 mysql 函數的問題
  • 只能在 MySQL 4.1 以上執行


Q: mysql_pconnect( )  與 mysql_connect(  ) ?
A: mysql_pconnect( ) 函數使 MySQL 在網頁中止資料索取後, 仍保持等待服務(如同餐廳服務生在送走客人之後, 不作別的事, 而在等待下一位客人), 恐影響這台主機效能, 建議不要使用.

@mysqli_connect( , , ,  )
  • mysqli_connect 有 4個參數, 第 4個參數為資料庫
  • mysqli_connect( ) 連線資訊要保留, 日後可提供給 mysqli_select_db 及 mysqli_query(  ) 使用



結合多個 SQL 語法:
  1. 每一個 SQL 語法最後要加上 ;
  2. 建議 select 與 其他語法 ( insert into , update, delete) 分開處理
  3. mysqli_multi_query(  mysqli_connect, 多個 SQL 語法 )


mysqli_store_result(  )
  • 執行一個 SQL 語法


mysqli_more_result( )
  • 若仍有下一個 SQL 語法, 傳回 true


mysqli_next_result( )
  • 切換至下一個 SQL 語法




Q: 為何 php 無法畫圖 ?
A: 因為 php 的 GD 模組未安裝或是取消功能.
  • 安裝
    • Linux 請進行系統更新將安裝 php-gd
    • windows 請至官方網站下載 zip 檔案  www.php.net 解壓縮後將 /ext/ 內的 gd2.dll 檔案 copy 至系統目錄內, 再手動於 php 修改設定
  • php.ini 內若有加上 ; 代表該功能取消, 請刪除 ; 後重新啟動 Apache


* 關於 png 圖檔
  1. IE 6 不支援, IE 7 不支援透明背景
  2. 可全彩, 可設定透明背景



繪製圖片
  1. 網頁本身是 jpg 或是 png 格式 ( gif 因原公司取消網路授權, 建議不要使用)
  2. 網頁內不可有 html 的輸出



ImageCreate(  )  建立畫布
ImageColorAllocate( ) 產生顏色
ImageFill (  )   填滿畫布
ImageString(  ) 產生文字


generatorPassword(  ) 內
  • $password_len 控制字數, 而$word 代表可出現於圖片內的文字

星期四, 8月 19, 2010

20100819 PHP-MySQL-CLASS 10

20100819 PHP-MySQL-CLASS 10

檔案上傳後接收資料的陣列變數名為 $_FILES
move_uploaded_file(  上傳檔案的暫時檔名, 上傳檔案路徑及儲存檔名  )

mb_convert_encoding(  )
  • 將資料作編碼轉換, 例如 Big5 轉 UTF-8
    • 中文檔名資料須作編碼轉換


$_SERVER[‘PHP_AUTH_USER’]
  • 開啟視窗前認證訊息內的帳號


$_SERVER[‘PHP_AUTH_PW’]
  • 開啟視窗前認證訊息內的密碼

若視窗開啟, 認證訊息就無法產生


Lab: ftp1.php

複製一個檔案, 複製到 class 9 的目錄下, 執行 ftp1.php
可以觀察到 可以指定 檔案名稱以及讓用戶端下載的名稱( 名稱不需要相同 )

ftp1.php 檔案如下

<?php
//include("auth1.php"); //可不加上此行
header("Content-type: text/html; charset=utf-8");
$file="./9707.zip"; // 實際檔案的路徑+檔名
$filename="0714.zip"; // 下載的檔名
header("Content-type: ".filetype("$file"));//指定類型
header("Content-Disposition: attachment; filename=".$filename."");
readfile($file);
?>

header(  ) 函數
  • 除了可作網頁切換, 不存暫存檔案等設計外, 也可呼叫網頁的認證訊息, 模擬其他檔案, 更改下載檔案檔名.


ftp1.php 延伸的主題
  • 若希望 user 只能下載 1  次, 該如何設計?
    • 加入資料庫偵測, 若下載一次則 update 資料, 下次就不能下載.



將 record2009.sql 檔案匯入 pcschool 資料庫


分頁網頁設計
  1. 請先確認, 儲存以下資料的變數名稱及變數內容
    1. 目前頁數
    2. 每一頁筆數
    3. 總筆數
    4. 總頁數


設計頁碼連結時請留意單雙引號, 不要少了或多了


Lab: 人數統計分析, 頁碼判斷

display1.php 內容如下

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>人數統計分析</title></head>
<body><?   
include("server.php");  
if( isset($_GET['page']) )
 $page = intval( $_GET['page'] ); // intval( ) 作用回整數
else{$page = 1;}
$page_size = 10;
$sql = "select count(*) as total from record";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$total = $row['total'];
if(isset($total)) //假設有資料
 {
  if( $total < $page_size ) //若總筆數 小於每頁筆數, 總頁數 = 1
      $page_count=1;
  if( $total % $page_size) //假設有餘數, 總頁數 + 1
      $page_count=(int)($total / $page_size) + 1;
  else
      $page_count = $total / $page_size;
 }
else
 $page_count = 0;
$page_number = '';
if( $page == 1 ) //$page_number要填寫什麼呢?
 $page_number .= '[第一頁][上一頁]';
else
 {
  $page_number.='[<a href='.$_SERVER['PHP_SELF'].'?page=1>第一頁</a>]';
  $page_number.='[<a href='.$_SERVER['PHP_SELF'].'?page='.($page-1).'>'."上一頁</a>]";
 }
if(($page == $page_count) || ($page_count == 0))
 $page_number .= '[下一頁][尾頁]';
else
 {
  $page_number.='[<a href='.$_SERVER['PHP_SELF'].'?page='.($page+1).'>'."下一頁</a>]";
  $page_number.='[<a href='.$_SERVER['PHP_SELF'].'?page='.$page_count.'>'."尾頁</a>]";
 }
if(isset($total)) //假設有資料,依據變數進行檢索
 {
   $sql = "select * from record limit ".($page-1)*$page_size.",$page_size";
   echo $sql;
   $result = mysql_query($sql) or die(mysql_error());
   echo "<table border=1>";
   echo "<tr><td>時間</td><td>ip</td></tr>";
   while($list1=mysql_fetch_array($result))
       {
       echo "<tr><td>".$list1['visitday']."</td>";
       echo   "<td>".$list1['ip']."</td></tr>";  }
       echo "</table>";
       echo $page_number;
 
 }
?></body></html>


Q: 頁碼連結語法很複雜
A: 可以設計 html 語法的頁碼連結. 再將可用 php 語法取代的 html 語法刪除,加上作為字串與變數的連結


Q: 若 SQL 語法有問題?
A:
  • 請在 mysql_query( ) 之後加上 die( mysql_error( ) )
  • 若仍看不懂訊息, 請把 SQL 語法 echo 出來.
  • limit 語法之後要有空格



php 的 header( ) 函數可指定網頁類型為 jpg, 但 IE 啟該網頁可能有問題
  • 建議以 <img src=”x.php”> 方式開啟 php 檔案


Q: 如何不要下載 pdf ?

A: 可使用 header (  ) 函數指定網頁為 pdf , 再以 echo 方式回應 file_get_contents(“pdf檔案”) 內容, 可於 php 內 加入 ip 偵測等語法.

header(  )  函數可作
  1. 開啟網頁前認證
  2. 下載檔案時,檔名改變
  3. 開啟 jpg, pdf 等檔案
  4. 轉換至其他網頁

星期二, 8月 17, 2010

20100817 PHP-MySQL CLASS 9

20100817 PHP-MySQL CLASS 9

建立一個 Netbean 的PHP 專案 class9
建立新專案
File → New Project
PHP: PHP Application → Next
點選 Browse 按鈕 建立一個 class9 資料夾( source 按鈕調整於 C:\Appserv\www 目錄下 [網站根目錄] )
Finish
將相關檔案複製到 class8 資料夾

Notes:
  • 接收表單資料後, 變數建議先作分析再丟給一般變數.不建議直接放入 SQL 語法內
    • 資安考量
    • 語法較複雜


select   欄位名稱  from  資料表  where  ( 條件 );
  • 依條件查詢資料表內的欄位內容


1.數值資料
  • >, <, =, >=, <=

2. 文字資料
  • like %關鍵字%’;
    • 相似
  • = 相同

3.通用 ( 文字, 數字皆可 )
  • in(  ,   )
    • 查固定值的欄位內容
  • not  in(  ,   )
    • 查不是固定值的欄位內容
  • is  null  空值
  • not  is null   不是空值




Lab: where 條件查詢

利用 phpMyAdmin 來下指令練習
選取  pcschool 資料庫



執行結果如下 ( 找出 employeeid 大於等於 3 )

相關查詢指令如下

select employeeid,firstname from employees where (employeeid >= 3);
select employeeid,firstname from employees where (employeeid in(2,4,9));
select employeeid,firstname from employees where (employeeid  not in(2,4,9));
select  country,companyname from customers where (country in('Argentina','Mexico'));
select  region,companyname from customers where (region is null);
select  region,companyname from customers where (region is not null);
select  firstname  from  employees  where (firstname like 'a%');
select  firstname  from  employees  where  (firstname  like  '%a%');
select  firstname  from  employees  where  (firstname  like  '%a');

select companyname,contactname,country  from customers  where (country in('France','Germany') and companyname like 'b%');

select companyname,contactname,country  from customers  where (country in('France','Germany')  or  companyname like 'b%');



若有兩個欄位要作判斷, 請加 and 或 or.
  • and 代表 左右兩邊條件均要成立
  • or 代表  左右兩邊一邊成立即成立


$_SERVER[‘HTTP_REFERER’
  • 從那一個網頁引導到該頁 
  • 如果是由 java script  語法連接, 偵測到的可能是空的


Q: 為何  SQL 語法內 $a 及 $b 不用加上 ' ‘ ?

A: 因為這兩個是數字 ( 如果表單輸入的非數字呢?)

“ select  *  from   orders  where customerID=’$a’ ”;
  • 當customerID 等於 $a 變數內容時, 查詢 orders 資料表所有欄位內容 


limit  起始筆數索引值, 總筆數
  • limit 放在 SQL 語法最後
  • 起始筆數索引值由 0 開始, 0 代表第一筆
  • 若只有一個數字, 代表由第一筆開始, 共幾筆資料


檔案上傳
  • form 必須是 post 方式傳送
  • form 必須設定 enctype
  • <input type> 為 file


php uploaded 檔案不是直接放在指定位置,  而是先放在系統暫存區, upload完成後才移動到指定位置

php.ini 及 表單網頁 ( 隱藏欄位, 名為 MAX_FILE_SIZE) 均可對檔案大小設限制
$_FILE[‘表單file欄位’] [‘name’] [‘size’] [‘type’] [‘error’]