Làm quen với PHP
II. PHP Căn bản
III. Các tính năng cho ứng dụng Web base
I. Làm việc với Form
II. Các hàm làm việc với MySQL
III. Làm việc với File
IV. Các hàm làm việc với hình ảnh
V. Các hàm trên ngày tháng
VI. Các hàm trên dữ liệu
VII. Cookies và QueryString
VIII. Session
IX. Gỡ lỗi
161 trang |
Chia sẻ: Mr Hưng | Lượt xem: 989 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng: PHP (hypertext preprocessing), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
.1. Sử dụng PHP để kết nối với CSDL
V.2. PEAR DB
V.3. Các chức năng nâng cao với PEAR DB
V.1. Sử dụng PHP để kết nối với
CSDL
Có 2 cách kết nối PHP với CSDL
– Sử dụng các hàm riêng cho từng loại CSDL
Ưu điểm: Tốc độ cao do được thiết kế cho từng CSDL cụ
thể. Tận dụng được ưu điểm của từng loại CSDL
Nhược điểm: Không có tính khả chuyển giữa các CSDL
– Sử dụng các hàm độc lập CSDL (thư viện PEAR
DB)
Ưu điểm: Có thể sử dụng trên nhiều CSDL khác nhau
Nhược điểm: Chậm hơn phương pháp trên, không tận dụng
được ưu điểm của từng CSDL.
V.1. Sử dụng PHP để kết nối với CSDL
(2)
Cài đặt thư viện PEAR
– Yêu cầu: PHP phiên bản 5.0
– Cài đặt PHP
– Chạy go-pear.bat
– Theo các hướng dẫn trong chương trình (các tham số chỉ cần đặt mặc
định)
Nếu không cài đặt PEAR, mà copy từ máy khác, phải thêm vào
C:/Windows/PHP.INI 2 dòng như ở dưới
Cấu hình Zend Studio để làm việc với PEAR DB
– Thêm vào file $Zend_dir/bin/php5/php.ini 2 dòng
include_path=".;C:/php/pear"
extension_dir="c:/php/ext"
– Copy file libMySQL.dll vào $Windows/$System (nếu bạn sử dụng IIS)
Các bước cài đặt kiểu mì ăn liền
Cài IIS, cài Mysql 5.0, cài PHP
Copy $\Mysql\bin\libMysql.dll đến
c:\windows\system32
Copy PHP.rar đè lên thư mục c:/PHP
Sửa nội dung c:\windows\system32\PHP.INI, thêm
vào các dòng sau (để ở cuối file)
include_path=".;C:/php/pear"
extension_dir=" c:/php/ext"
extension=php_mysql.dll
Sau đó, có thể chạy được trên local host (trên Zend
thì phải config thêm, tốt nhất là đừng config)
V.2. PEAR DB
<?php
require("DB.php");
$dsn = "mysql://root:root@localhost/dhxd";
$db = DB::connect($dsn);
if (DB::isError($db)) die($db->getMessage());
$table = $db->query("SELECT * FROM SV");
if (DB::isError($table)) die($table->getMessage());
echo "";
while ($row = $table->fetchRow()) {
echo "
$row[0]
$row[1]
$row[2]
$row[3]
";
}
echo "";
?>
V.2. PEAR DB (2)
V.2.1. Data source name
V.2.2. Kết nối với cơ sở dữ liệu
V.2.3. Kiểm tra lỗi
V.2.4. Thực thi query
V.2.5. Lấy kết quả từ query
V.2.6. Giải phóng bộ nhớ
V.2.1. Data source name
dsn=Data Source Name
type://username:password@protocol+host
spec/database
Ví dụ:
– mysql:///webdb mysql://localhost/webdb
mysql://bondview@localhost/webdb
mysql://bondview@tcp+localhost/webdb
mysql://bondview:007@localhost/webdb
Type Database
Mysql MySQL
Pgsql PostgreSQL
Ibase InterBase
Msql Mini SQL
Mssql Microsoft SQL Server
oci8 Oracle 7/8/8i
Odbc ODBC
Sybase SyBase
Ifx Informix
Fbsql FrontBase
V.2.2. Kết nối với cơ sở dữ liệu
Khi đã có DSN, bạn có thể kết nối bằng hàm
DB::connect với cú pháp sau:
– $db = DB::connect(DSN [, options ]);
– options có thể là 1 giá trị Boolean hoặc 1 mảng
$db = DB::connect($dsn, array('debug' => 1,
'optimize' => 'portability'));
V.2.3. Kiểm tra lỗi
Các phương thức của DB trả về DB_ERROR nếu có lỗi trong
quá trình thực hiện
Bạn có thể kiểm tra 1 kết quả trả về có phải là lỗi không bằng
hàm DB::isError();
Nếu DB::isError() trả về true, kết quả trả về của bạn là lỗi, có
thể xem thông báo lỗi bằng phương thức $tenbien-
>getMessage()
$db = DB::connect($datasource);
if (DB::isError($db)) {
die($db->getMessage( ));
}
V.2.4. Thực thi query
Để thực thi query, sử dụng phương thức query() của Database
Object (đối tượng trả về khi bạn kết nối thành công với CSDL
bằng hàm DB::connect() );
$db = DB::connect($datasource);
$result = $db->query(sql);
Cũng tương tự như DB::connect(), bạn có thể kiểm tra lỗi bằng
DB::isError()
if (DB::iserror($result)) {
die($result->getMessage());
}
V.2.5. Lấy kết quả từ query
$row = $result->fetchRow([ mode ]);
Hàm fetchRow() trả về mảng các giá trị trên dòng hoặc
DB_ERROR (nếu có lỗi)
<?php
$db = DB::connect($datasource);
$result = $db->query(sql);
while ($row = $result->fetchRow( )) {
if (DB::isError($row)) {
die($row->getMessage( ));
}
// do something with the row
}
?>
V.2.5. Lấy kết quả từ query (2)
$row = $result->fetchRow([ mode ]);
mode:
– DB_FETCHMODE_ORDERED: Các cột được liệt
kê trên $row theo thứ tự 0,1,2...
– DB_FETCHMODE_ASSOC : Các cột được liệt kê
với khóa là tên của các cột
– DB_FETCHMODE_OBJECT: Các cột được liệt
kê thành các trường của đối tượng
V.2.5. Lấy kết quả từ query (3)
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$table = $db->query("select * from sv");
$row = $table->fetchRow();
var_dump($row);
$row = $table->fetchRow(DB_FETCHMODE_ASSOC);
var_dump($row);
$row = $table->fetchRow(DB_FETCHMODE_OBJECT);
var_dump($row);
echo "Hoten: {$row->hodem} {$row->ten}, Ngay sinh:
{$row->ngaysinh}";
?>
V.2.6. Giải phóng bộ nhớ
<?php
require("DB.php");
$db =
DB::connect("mysql://root:root@localhost/d
hxd");
$table = $db->query("select * from sv");
$row = $table->fetchRow();
unset($row);
$table->free();
$db->disconnect();
?>
V.3. Các chức năng nâng cao với
PEAR DB
V.3.1. Query template
V.3.2. Prepare/Execute
V.3.3. Các hàm tiện ích
V.3.4. Các thông tin trả về từ query()
V.3.5. Metadata
V.3.1. Query template
Để xây dựng các query, nếu dùng phép nối xâu kí tự rất dễ gây
nhầm lẫn do không nhìn thấy tổng thể của câu lệnh SQL (nhất là với
các trường hợp có sử dụng dấu nháy)
Trong trường hợp này, PHP cung cấp 1 công cụ hoạt động cho
phép truyền tham số trong câu lệnh SQL giống như lệnh printf, trong
đó sử dụng các ký hiệu
– ?: Cho số hoặc string (dấu nháy sẽ được bổ sung khi cần thiết)
– |: Cho số hoặc string (không sử dụng dấu nháy)
– &: Tên file (dùng cho các trường BLOB)
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$row = array("Nguyen Van", "A");
$db->query("INSERT INTO sv (hodem, ten) VALUES(?,?)", $row);
?>
V.3.2. Prepare/Execute
Khi bạn thực hiện nhiều câu lệnh giống nhau, cách tốt nhất là dịch câu lệnh SQL trước khi
thực hiện bằng phương thức prepare()
Sau khi dịch SQL, bạn có thể thực hiện câu lệnh SQL bằng cách dùng 2 lệnh sau:
– $response = $db->execute(compiled, values); (values: mảng 1 chiều các giá trị)
– $responses = $db->executeMultiple(compiled, values); (values: mảng 2 chiều các dòng, mỗi dòng là 1
mảng 1 chiều các giá trị)
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$complied = $db->prepare("INSERT INTO sv (hodem, ten)
VALUES(?,?)");
$rows=array( array("Nguyen Van", "A"),
array("Nguyen Van", "B"),
array("Nguyen Van", "C"),
array("Nguyen Van", "D") );
foreach ($rows as $row) {
$db->execute($complied, $row);
}
$db->executeMultiple($complied, $rows);
?>
V.3.3. Các hàm tiện ích
Ngoài các hàm chung, PEAR DB còn cung cấp các hàm cho phép thực hiện
nhanh 1 số chức năng hay được sử dụng: getOne(), getRow(), getCol(),
getAssoc(), getAll()
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$result = $db->getRow("SELECT * FROM sv");
var_dump($result);
$result = $db->getOne("SELECT count(*) FROM sv");
var_dump($result);
$result = $db->getCol("SELECT * FROM sv", "ten");
var_dump($result);
$result = $db->getAssoc("SELECT * FROM sv");
var_dump($result);
$result = $db->getAll("SELECT * FROM sv");
var_dump($result);
?>
V.3.4. Các thông tin trả về từ query()
Bạn có thể lấy thông tin về các dòng, cột kết quả trả về từ câu lệnh SQL qua
các hàm numRows(), numCols(), tableInfo(), affectedRows()
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$table = $db->query("SELECT * FROM sv");
var_dump($table->numRows());
var_dump($table->numCols());
var_dump($table->tableInfo());
$result = $db->query(
"INSERT INTO sv (hodem, ten) VALUES (?,?)",
array("Nguyen Phu", "Quang"));
var_dump($result);
var_dump($db->affectedRows());
?>
V.3.5. Metadata
Hàm getListOf() sử dụng để lấy thông tin về users, databases, tables, views,
functions (phụ thuộc vào sự hỗ trợ của CSDL mà bạn đang sử dụng)
<?php
require_once("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$result = $db->getListOf("users");
var_dump($result);
$result = $db->getListOf("databases");
var_dump($result);
$result = $db->getListOf("tables");
var_dump($result);
?>
V.3.6. Transaction
Nhiều cơ sở dữ liệu hỗ trợ Transaction safe, để sử dụng
transaction safe trong PHP, bạn sử dụng các lệnh commit(),
rollback()
Để có thể rollback(), bạn phải thiết lập autocommit là false
<?php
require_once("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$db->autocommit = false;
$result = $db->query("DELETE FROM sv;");
$db->rollback();
$db->autocommit = true;
?>
VI. Tổ chức ứng dụng PHP
VI.2. Hệ thống template
VI.3. Quản lý output
VI.4. Quản lý lỗi
VI.5. Tối ưu hóa
VI.2. Hệ thống template
Trang Web có giao diện dễ thay đổi là 1 tiêu chí rất
quan trọng
Nếu kết hợp mã HTML và PHP không tốt thì rất khó cho
người thiết kế giao diện và người lập trình làm việc với
nhau khả năng thay đổi giao diện khó khăn
Một phương pháp hiệu quả là sử dụng các file template
(.HTML – được thiết kế từ các chương trình: DW,
FrontPage...). Các file template này thường không chứa
mã PHP mà chỉ có các thông tin dưới dạng quy ước
(thường là các tên gọi, giá trị được đặt theo 1 quy ước
nhất định, các giá trị này sẽ được thay thế khi chạy
chương trình bằng PHP)
VI.2. Hệ thống template (2)
<?php
$templatePath = "./templates/";
function MakeWebPageFromTemplate($templateName, $params)
{
global $templatePath;
$templateName = $templatePath . $templateName;
if ($f = fopen($templateName, "rt")) {
$templateContent = fread($f, filesize($templateName));
fclose($f);
}
$templateContent = str_replace(
"\"./", "\"" . $templatePath, $templateContent);
foreach ($params as $paramName=>$paramVal) {
$templateContent = str_replace(
$paramName, $paramVal, $templateContent);
}
return $templateContent;
}
?>
VI.3. Quản lý output
Thường thì các hàm ghi thông tin ra browser. Tuy nhiên có nhiều trường hợp
chúng ta không muốn như vậy.
Bạn có thể sử dụng vùng đệm ra (output buffer) để các lệnh ghi thông tin ghi dữ
liệu lên đó
Các hàm với output buffer: ob_start(), ob_get_length(), ob_get_contents(),
ob_flush(), ob_end_flush(); ob_end_clean()
<?php
ob_start();
phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();
if (strpos($phpinfo, "module_pdf") === FALSE) {
echo "You do not have PDF support in your PHP, sorry.";
} else {
echo "Congratulations, you have PDF support!";
}
?>
VI.4. Quản lý lỗi
VI.4.1. Thông báo lỗi
VI.4.2. Giấu lỗi
VI.4.3. Phát sinh lỗi
VI.4.4. Hàm xử lý lỗi
VI.4.1. Thông báo lỗi
Thông thường, khi có lỗi, thông báo lỗi được in ra
output
Có 3 mức độ thông báo: notices, warnings, errors
Mặc định của PHP là các thông báo warning, error
sẽ được in ra browser, bạn có thể thay đổi trong
PHP.INI hoặc trong thời gian chạy bằng hàm
error_reporting() (các tham số E_ERROR |
E_PARSE | E_CORE_ERROR |
E_COMPILE_ERROR | E_USER_ERROR)
VI.4.1. Thông báo lỗi (2)
Value Meaning
E_ERROR Runtime errors
E_WARNING Runtime warnings
E_PARSE Compile-time parse errors
E_NOTICE Runtime notices
E_CORE_ERROR Errors generated internally by PHP
E_CORE_WARNING Warnings generated internally by PHP
E_COMPILE_ERROR Errors generated internally by the Zend scripting engine
E_COMPILE_WARNING Warnings generated internally by the Zend scripting engine
E_USER_ERROR Runtime errors generated by a call to trigger_error( )
E_USER_WARNING Runtime warnings generated by a call to trigger_error( )
E_USER_NOTICE Runtime warnings generated by a call to trigger_error( )
E_ALL All of the above options
VI.4.2. Giấu lỗi
Sử dụng toán tử @ để ngăn không cho output lỗi ra browser
Thiết lập track_errors trong php.ini để bắt được các thông báo lỗi qua biến
$php_errormsg
Để ngăn không cho tất cả các thông báo lỗi trên browser, sử dụng hàm
error_reporting(0)
<?php
ini_set("track_errors", "1");
$value = 2/0;
$value = @(2/0);
echo "$php_errormsg";
ini_restore("track_errors");
?>
<?php
error_reporting(0);
ini_set("track_errors", "1");
$value = 2/0;
echo "$php_errormsg";
ini_restore("track_errors");
?>
VI.4.3. Phát sinh lỗi
Bạn có thể làm phát sinh lỗi người dùng bằng hàm
trigger_error
trigger_error(message [, type]);
type: E_USER_ERROR, E_USER_WARNING,
E_USER_NOTICE (default)
<?php
function divider($a, $b) {
if($b == 0) {
trigger_error('$b cannot be 0', _USER_ERROR);
}
return($a / $b);
}
?>
VI.4.4. Hàm xử lý lỗi
Giấu tất cả các lỗi không phải là một phương án hay, để quản
lý lỗi tốt hơn, bạn nên dùng hàm xử lý lỗi (error handler)
Error handler được thiết lập bằng hàm set_error_handler(), khôi
phục lại bằng hàm restore_error_handler()
<?php
function my_handler($error, $errorstring,
$filename, $line, $symbol)
{
echo "$error|$errorstring|$filename|$line\n";
}
set_error_handler('my_handler');
echo 4/0;
$f = file("linhtinh");
?>
VII. Hình ảnh
VII.1. Yêu cầu phần mềm
VII.2. Tạo và vẽ ảnh
VII.3. Vẽ Text
VII.4. Co dãn ảnh
VII.1. Yêu cầu phần mềm
Với PHP bạn có thể sử dụng các hàm graphic để vẽ
ra các hình ảnh và lưu trữ dưới dạng file (GIF, PNG,
JPG)
Để thực hiện được chức năng này, bạn cần phải cài
đặt bộ thư viện GD ( )
Để biết thư viện GD đã được cài đặt hay chưa, có
thể sử dụng hàm phpinfo() hoặc hàm gd_info()
Đối với bộ PHP full (v5.0) có đầy đủ thư viện PEAR
đi kèm, để chạy GD bạn chỉ việc thiết lập trong file
php.ini: extension=php_gd2.dll
VII.2. Tạo và vẽ ảnh
<?php
$im = imagecreate(30, 30);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00,0x00,0xff);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
imagefilledrectangle($im, 0, 0, 29, 29, $black);
imagefilledrectangle($im, 0,0,15,15,$red);
imagefilledrectangle($im, 15,15,29,29,$blue);
imagejpeg($im);
?>
Day la caro
<?php
$im = imagecreate(30, 30);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00,0x00,0xff);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
imagefilledrectangle($im, 0, 0, 29, 29, $black);
imagefilledrectangle($im, 0,0,15,15,$red);
imagefilledrectangle($im, 15,15,29,29,$blue);
imagejpeg($im, "c:/test.jpg", 100);
?>
Day cung la caro:
VII.2. Tạo và vẽ ảnh (2)
Các hàm thường sử dụng
– resource imagecreate ( int x_size, int y_size ): Tạo ảnh với
kích thước x_size * y_size, ảnh ko phải truecolor
– imagecolorallocate ( resource image, int red, int green, int
blue ): Sử dụng để định nghĩa 1 màu sẽ xuất hiện trong
ảnh. Đối với ảnh sử dụng palette, lần gọi đầu tiên sẽ cho
màu là màu nền của ảnh
– resource imagecreatetruecolor ( int x_size, int y_size ):
Tạo ảnh truecolor
– bool imagejpeg ( resource image [, string filename [, int
quality]] )
– bool imagepng ( resource image [, string filename] )
– bool imagegif ( resource image [, string filename] )
VII.2. Tạo và vẽ ảnh (3)
ImageSetPixel(image, x, y, color);
ImageLine(image, start_x, start_ y, end_x, end_ y, color);
ImageDashedLine(image, start_x, start_ y, end_x, end_ y,
color);
ImageRectangle(image, tlx, tly, brx, bry, color);
ImageFilledRectangle(image, tlx, tly, brx, bry, color);
ImagePolygon(image, points, number, color);
ImageFilledPolygon(image, points, number, color);
ImageArc(image, center_x, center_ y, width, height, start, end,
color);
ImageFill(image, x, y, color);
ImageFillToBorder(image, x, y, border_color, color);
VII.3. Vẽ Text
<?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
imagestring($im, 1, 0, 0, "HUCE", $red);
imagestring($im, 2, 0, 10, "HUCE", $red);
imagestring($im, 3, 0, 20, "HUCE", $red);
imagestring($im, 4, 0, 30, "HUCE", $red);
imagestring($im, 5, 0, 45, "HUCE", $red);
imagestringup($im, 5, 50, 99, "University", $red);
imagegif($im);
?>
VII.3. Vẽ Text (2)
<?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x00, 0xff);
imagettftext($im, 8, 30, 10, 100, $red,
"Times", "HUCE - 46pm1");
imagettftext($im, 10, -30, 10, 10,$blue,
"Arialni","HUCE- 46pm1");
imagegif($im);
?>
VII.4. Co dãn ảnh
<?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x00, 0xff);
imagettftext($im, 8, 30, 10, 100, $red, "Times", "HUCE - 46pm1");
imagettftext($im, 10, -30, 10, 10, $blue, "Arialni", "HUCE - 46pm1");
$im2 = imagecreate(200, 200);
//imagecopyresized($im2, $im, 0, 0, 0, 0, 200, 200, 100, 100);
imagecopyresampled($im2, $im, 0, 0, 0, 0, 200, 200, 100, 100);
imagegif($im2);
?>
VII.5. Màu sắc
VII.5.1. True color & color index
VII.5.2. Kênh alpha
VII.5.1. True color & color index
Ảnh của bạn được tạo bởi các hàm imagecreate() – tạo ảnh sử
dụng colorindex trên palette và imagecreatetruecolor () – tạo
ảnh truecolor (24bit/pixel)
Từ GD2.0 trở lên, ta có thể làm việc với kênh alpha (xem phần
sau)
Để lấy màu của điểm ảnh
– $color = ImageColorAt(image, x, y);
– $values = ImageColorsForIndex(image, index);
Với ảnh truecolor, cấu trúc màu gồm: 7bit alpha, 8bit Red, 8bit
Green, 8bit Blue (từ trái qua phải). Có thể sử dụng công thức
sau
– $a = ($col & 0x7F000000) >> 24;
$r = ($col & 0x00FF0000) >> 16;
$g = ($col & 0x0000FF00) >> 8;
$b = ($col & 0x000000FF);
VII.5.2. Kênh alpha
Kênh alpha trong GD chỉ gồm 7bit (giá trị từ 0 đến 127)
Để sử dụng kênh alpha sử dụng các hàm
– ImageColorResolveAlpha()
– ImageAlphaBlending()
<?php
$im = ImageCreateTrueColor(150,150);
$white = ImageColorAllocate($im,255,255,255);
ImageAlphaBlending($im, true);
ImageFilledRectangle($im,0,0,150,150,$white);
$red = ImageColorResolveAlpha($im,255,50,0,63);
ImageFilledEllipse($im,75,75,80,50,$red);
$gray = ImageColorResolveAlpha($im,70,70,70,63);
ImageAlphaBlending($im, true);
ImageFilledRectangle($im,60,60,120,120,$gray);
header('Content-Type: image/png');
ImagePNG($im);
?>
IX. XML
IX.1. Tạo văn bản XML
IX.2. Đọc XML
IX.1. Tạo văn bản XML
Cách đơn giản nhất để tạo văn bản XML là
đặt lại header của trang PHP
– header('Content-Type: text/xml');
Sau đó đưa thông tin ra browser bằng các
hàm echo, print... như bình thường
IX.2. Đọc XML
<?php
function start_element($inParser, $inName, &$inAttributes)
{
var_dump($inName);
var_dump($inAttributes);
}
function end_element($inParser, $inName) {
var_dump($inName);
}
$xml = xml_parser_create();
xml_set_element_handler($xml, "start_element",
"end_element");
xml_parse($xml, "<row name='row1'
atr='attribute1'/>");
?>
Các file đính kèm theo tài liệu này:
- tai_lieu_bai_giang_lap_trinh_php_807.pdf