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 或是空格出現
資料庫網頁建議- 新增
- 列表
- 更新
- 刪除
- 列表以下兩個二選一
- 加分頁
- 加查詢
- 列表加分頁及查詢
更新及刪除須確認資料是不是唯一的資料- 一般都是以主索引欄位作為 Hyperlink 所攜帶的參數內容
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 語法:- 每一個 SQL 語法最後要加上 ;
- 建議 select 與 其他語法 ( insert into , update, delete) 分開處理
- mysqli_multi_query( mysqli_connect, 多個 SQL 語法 )
mysqli_store_result( )
mysqli_more_result( )
mysqli_next_result( )
Q: 為何 php 無法畫圖 ?
A: 因為 php 的 GD 模組未安裝或是取消功能.- 安裝
- Linux 請進行系統更新將安裝 php-gd
- windows 請至官方網站下載 zip 檔案 www.php.net 解壓縮後將 /ext/ 內的 gd2.dll 檔案 copy 至系統目錄內, 再手動於 php 修改設定
- php.ini 內若有加上 ; 代表該功能取消, 請刪除 ; 後重新啟動 Apache
* 關於 png 圖檔- IE 6 不支援, IE 7 不支援透明背景
- 可全彩, 可設定透明背景
繪製圖片- 網頁本身是 jpg 或是 png 格式 ( gif 因原公司取消網路授權, 建議不要使用)
- 網頁內不可有 html 的輸出
ImageCreate( ) 建立畫布
ImageColorAllocate( ) 產生顏色
ImageFill ( ) 填滿畫布
ImageString( ) 產生文字
generatorPassword( ) 內- $password_len 控制字數, 而$word 代表可出現於圖片內的文字
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 資料庫
分頁網頁設計- 請先確認, 儲存以下資料的變數名稱及變數內容
- 目前頁數
- 每一頁筆數
- 總筆數
- 總頁數
設計頁碼連結時請留意單雙引號, 不要少了或多了
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( ) 函數可作- 開啟網頁前認證
- 下載檔案時,檔名改變
- 開啟 jpg, pdf 等檔案
- 轉換至其他網頁
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. 文字資料
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’]