III. Phạm vi hoạt động của các biến trong và ngoài hàm
3. Kỹ thuật gửi email theo định dạng HTML.
Chú ý rằng ở chế độ mặc định, nội dung thông điệp được truyền tải đi dưới dạng văn bản thuần túy (plain text), và không thể hiện được các cấu trúc HTML thông thường. Để có thể đưa định dạng HTML vào mail, qua đó cho phép hiển thị hình ảnh, định dạng font chữ..., ta phải đưa thêm dòng sau đây vào phần header:
MIME-Version: 1.0
Content-type: text/html; charset=iso-8859-1 Ví dụ:
Code: <?
/* recipients */
$to = "Mary <mary@example.com>" . ", " ; //note the comma $to .= "Kelly <kelly@example.com>";
/* subject */
$subject = "Birthday Reminders for August"; /* message */
<html> <head>
<title>Birthday Reminders for August</title> </head>
<body>
<p>Here are the birthdays upcoming in August!</p> <table> <tr> <th>Person</th><th>Day</th><th>Month</th><th>Year</th> </tr> <tr> <td>Joe</td><td>3rd</td><td>August</td><td>1970</td> </tr> <tr> <td>Sally</td><td>17th</td><td>August</td><td>1973</td> </tr> </table> </body> </html> ';
/* To send HTML mail, you can set the Content-type header. */ $headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; /* additional headers */
$headers .= "From: Birthday Reminder <birthday@example.com>\r\n"; $headers .= "Cc: birthdayarchive@example.com\r\n";
$headers .= "Bcc: birthdaycheck@example.com\r\n"; /* and now mail it */
mail($to, $subject, $message, $headers); ?>
Bài 26: Xử lý XML
PHP5 cung cấp class SimpleXML là một class rất dễ sử dụng, bài này sẽ hướng dẫn các bạn parse file XML trong 7 nốt nhạc.
Đầu tiên, lấy một đoạn XML mẫu để tập tành phân tích: Code:
<?xml version="1.0"?> <books>
<book isbn="978-1594489501">
<title>A Thousand Splendid Suns</title> <author>Khaled Hosseini</author>
<publisher>Riverhead Hardcover</publisher> <amazon_price>14.27</amazon_price> </book>
<book isbn="978-1594489587">
<title>The Brief Wondrous Life of Oscar Wao</title> <author>Junot Diaz</author>
<publisher>Riverhead Hardcover</publisher> <amazon_price>14.97</amazon_price> </book>
<book isbn="978-0545010221">
<title>Harry Potter and the Deathly Hallows</title> <author>J. K. Rowling</author>
<publisher>Arthur A. Levine Books</publisher> <amazon_price>19.24</amazon_price>
</book> </books>
Để tạo ra một đối tượng SimpleXmlElement, cách đơn giản là truyền vào một chuỗi hoặc một file: Code:
// Passing the XML
$books = SimpleXMLElement($XmlData); //---
// Passing a filename
$books = SimpleXMLElement('books.xml', null, true);
Nhìn vào đoạn XML ví dụ, ta sẽ lấy ra tất cả các book hay của Amazon: Code:
<?php
// load SimpleXML
$books = new SimpleXMLElement('books.xml', null, true); echo <<<EOF <table> <tr> <th>Title</th> <th>Author</th> <th>Publisher</th> <th>Price at Amazon.com</th> <th>ISBN</th> </tr> EOF;
foreach($books as $book) // loop through our books { echo <<<EOF <tr> <td>{$book->title}</td> <td>{$book->author}</td> <td>{$book->publisher}</td> <td>${$book->amazon_price}</td> <td>{$book['isbn']}</td> </tr> EOF; } echo '</table>'; ?>
Bạn để ý rằng $books (có chữ 's' nhé) là một Element do khái niệm mỗi một file XML thì phải có root element. Vì thế, đừng mong đợi có đối tượng SimpleXml không nhé Grin. Mỗi element có thể có nhiều element con cùng loại hay khác loại, ví dụ này là cùng loại 'book' và class SimpleXmlElement này cho
phép ta duyệt qua các element con cùng loại như một array như ví dụ foreach() ở trên.
Cuối cùng, nói về cú pháp truy cập child element và attribute. Bác nào chưa biết khái niệm này nữa thì: Code:
<book isbn="978-1594489501">
<title>A Thousand Splendid Suns</title> <author>Khaled Hosseini</author>
<publisher>Riverhead Hardcover</publisher> <amazon_price>14.27</amazon_price> </book>
isbn là một attribute, các giá trị của một attribute phải để trong dấu (") <title>, <author>,... là các child element
Chỉ giải thích tới đây thôi, bác nào có ý định ngâm cứu XML, XML Schema,... thì 5s gợi ý là nên ... từ bỏ ý định ngông cuống thừa thời gian này đi vì có cả năm may ra học mới xong mà học từ tháng 1-12 thì tới tháng 12 sẽ quên tháng 1 Wink. Cứ việc coi nó như khái niểm HTML đã học rồi xài cho thoải mái nhá. Quay về cú pháp, lại coi ví dụ 'simple' trên: $book->title là truy cập child element trong khi $book['isbn'] là truy cập attribute. Done!!!
Đơn giản thế thôi, bạn thấy xử lý XML data có dễ chưa ?
Ví dụ trên, nếu bạn không thích dụng foreach thì có thể dùng biến counter $i, viết lại là $tempBook = $books->book[$i] rồi dùng $tempBook để xử lý.
Giờ thêm vào tí XPath cho nó bằng anh bằng em:
XPath đơn giản là cách chỉ ra đường dẫn "path" trong 1 XML document thông qua các element cha/con theo cú pháp giống như thư mục của linux: /home/user/... Xpath giúp bạn lọc ra các child element trong các element cha cùng loại, gom lại thành mảng và xử lý.
Ví dụ sau giúp bạn lấy ra tất cả các title của book và tất cả các số ISBN: Code: $titles = $books->xpath('book/title'); foreach($titles as $title) { echo $title.PHP_EOL; } ////////////////////////////////////////////// $isbn = $books->xpath('book/@isbn'); foreach($isbn as $isbn) { echo $isbn.PHP_EOL; } Nhớ chú ý cách dùng cú pháp / và /@ nhé. Giờ parse thử RSS của tuổi trẻ coi sao nè Code:
<?php
$rss = new SimpleXMLElement('http://www.tuoitre.com.vn/tianyon/RssView.aspx?ChannelID=16', null, true);
echo "<h1><a href='{$rss->channel->link}'>{$rss->channel->title}</a></h1>".PHP_EOL.'<hr />'.PHP_EOL;
foreach($rss->xpath('channel/item') as $item) {
echo <<<EOF
<h2><a href='{$item->link}'>{$item->title}</a></h2> <div>Posted at: {$item->pubDate}</div>
{$item->description} <hr />
EOF; } ?>
Cuối cùng,một vài thuộc tính của đối tượng SimpleXmlElement các bạn sẽ quan tâm:
$value = trim((string) $element); // Bản thên element nó là XML, bạn lấy giá trị của element thì ép kiểu về string
$attributes = $element->attributes(); // lấy tất cả các attribute $children = $element->children(); // lấy các child element
Bài 27: Thao tác với LDAP
Hiện nay, để xây dựng các hệ thống lớn, điều tối quan trọng là phải làm cách nào để có thể tích hợp dữ liệu để từ đó có thể dùng chung giữa các hệ thống khác nhau. Trong đó, tích hợp tài khoản của người sử dụng là vấn đề cần thiết nhất trong những cái "tối quan trọng" trên.
Hãy tưởng tượng một hệ thống với khoảng 5 - 6 mô đun khác nhau, mỗi mô đun lại được thiết kế trên một nền tảng khác nhau (Có ông thì dùng Oracle + AS Portal, có người thì xài DB2 với WebSphere, lão khác thì MySQL với phpnuke, ông thì xài Wíndow, lão thì cài Linux, có thằng điên lại chỉ thích Unix...hic, cuộc đời thật đúng là bể khổ), do đó cần có một hệ thống người dùng khác nhau. Vậy thì với mỗi mô đun, người sử dụng cần phải có một User Name, một mật khẩu khác nhau, đó là điều không thể chấp nhận được. Người dùng chẳng mấy chốc mà chán ghét hệ thống.
Làm cách nào để có thể tích hợp được người dùng giữa các hệ thống trên? Câu trả lời đó là LDAP.
Vây LDAP là gì?
LDAP - viết tắt của Lightweight Directory Access Protocol, hay dịch ra tiếng Việt có nghĩa là giao thức truy cập nhanh các dịch vụ thư mục.
• Là một giao thức tìm, truy nhập các thông tin dạng thư mục trên server. • Nó là giao thức dạng Client/Server dùng để truy cập dịch vụ thư mục. • LDAP chạy trên TCP/IP hoặc các dịch vụ hướng kết nối khác.
• Là một mô hình thông tin cho phép xác định cấu trúc và đặc điểm của thông tin trong thư mục. • Là một không gian tên cho phép xác định cách các thông tin được tham chiếu và tổ chức • Một mô hình các thao tác cho phép xác định các tham chiếu và phân bố dữ liệu.
• Là một giao thức mở rộng
• Là một mô hình thông tin mở rộng.
Ở đây chúng ta cần tránh hiểu nhầm từ "thư mục" như trên Windows là folder hay directory, đó là thư mục theo nghĩa hẹp để quản lý hệ thống tệp tin. Từ thư mục trong LDAP mang ý nghĩa rộng hơn, nó bao
hàm các cấu trúc dữ liệu dạng liệt kê theo thư mục (hay mục lục) - một "từ khoá" của dân thư viện nhằm ám chỉ cách thức sắp xếp dữ liệu để tiện truy xuất nhất.
Làm việc với LDAP thông qua PHP
Trình tự cơ bản khi có thao tác với LDAP gồm các bước
• Connect (kết nối với LDAP)
• Bind (kiểu kết nối: nặc danh hoặc đăng nhập xác thực) • Search (tìm kiếm)
• Interpret search (xử lý tìm kiếm) • Result (kết quả)
• Close connection (đóng kết nối)
Ldap_connect():
hàm kết nối tới máy chủ LDAP, hàm này có 2 tham số: hostname (tên máy chủ LDAP) và port (cổng kết nối, mặc định là cổng 389)
Ldap_connect(string hostname, int port); Code:
<?php
// LDAP variables
$ldaphost = "ldap.example.com"; // your ldap servers $ldapport = 389; // your ldap server's port number // Connecting to LDAP
$ldapconn = ldap_connect($ldaphost, $ldapport) or die("Không thể kết nối được đến $ldaphost"); ?>
Ldap_bind();
Hàm nối kết với server LDAP để có thể thao tác với LDAP Vd kết nối với LDAP server bằng user và password hợp lệ Code:
<?php
// using ldap bind
$ldaprdn = 'uname'; // ldap rdn or dn
$ldappass = 'password'; // associated password // connect to ldap server
$ldapconn = ldap_connect("ldap.example.com") or die("Could not connect to LDAP server."); if ($ldapconn) {
// binding to ldap server
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); // verify binding
if ($ldapbind) {
echo "LDAP bind successful..."; } else {
echo "LDAP bind failed..."; }
} ?>
Nếu kết nối bằng quyền anonymously
Code: <?php
//using ldap bind anonymously // connect to ldap server
$ldapconn = ldap_connect("ldap.example.com") or die("Could not connect to LDAP server."); if ($ldapconn) {
// binding anonymously
$ldapbind = ldap_bind($ldapconn); if ($ldapbind) {
echo "LDAP bind anonymous successful..."; } else {
echo "LDAP bind anonymous failed..."; }
} ?>
ldap_search();
ldap_search ( resource link_identifier, string base_dn, string filter [, array attributes [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
VD tìm kiếm các thông tin của tất cả mọi người ở trong “My Company” nơi surname hoặc given name chứa trong biến $person. Ví dụ này yêu cầu server tìm ra thông tin của nhiều hơn một thuộc tính cần tìm kiếm.
Code: <?php
// $ds is a valid link identifier for a directory server // $person is all or part of a person's name, eg "Jo" $dn = "o=My Company, c=US";
$filter="(|(sn=$person*)(givenname=$person*))"; $justthese = array("ou", "sn", "givenname", "mail"); $sr=ldap_search($ds, $dn, $filter, $justthese); $info = ldap_get_entries($ds, $sr);
echo $info["count"]." entries returned\n"; ?>
Ldap_close();
Hàm đóng kết nối với LDAP, hàm này tương đương với ldap_unbind(); bool ldap_unbind ( resource link_identifier );
Nếu kết nối đóng thành công sẽ trả về giá trị TRUE, ngược lại là FALSE.
ldap_add();
Hàm thêm các entry vào thư mục LDAP
bool ldap_add ( resource link_identifier, string dn, array entry ) Code:
<?php
$ds = ldap_connect("localhost"); // assuming the LDAP server is on this host if ($ds) {
// bind with appropriate dn to give update access
$r = ldap_bind($ds, "cn=root, o=My Company, c=US", "secret"); // prepare data
$info["cn"] = "John Jones"; $info["sn"] = "Jones";
$info["mail"] = "jonj@example.com"; $info["objectclass"] = "person"; // add data to directory
$r = ldap_add($ds, "cn=John Jones, o=My Company, c=US", $info); ldap_close($ds);
} else {
echo "Unable to connect to LDAP server"; }
?>
dap_delete();
Xóa một entry khỏi thư mục LDAP Code:
bool ldap_delete ( resource link_identifier, string dn )
Hàm trả về giá trị TRUE nếu xóa thành công và FALSE nếu thất bại
ldap_compare();
So sánh giá trị của một thuộc tính
mixed ldap_compare ( resource link_identifier, string dn, string attribute, string value ) VD:
Code: <?php
$ds=ldap_connect("localhost"); // assuming the LDAP server is on this host if ($ds) {
// bind
if (ldap_bind($ds)) { // prepare data
$dn = "cn=Matti Meikku, ou=My Unit, o=My Company, c=FI"; $value = "secretpassword";
$attr = "password"; // compare value
$r=ldap_compare($ds, $dn, $attr, $value); if ($r === -1) {
echo "Error: " . ldap_error($ds); } elseif ($r === true) {
echo "Password correct."; } elseif ($r === false) {
echo "Wrong guess! Password incorrect."; }
} else {
echo "Unable to bind to LDAP server."; }
ldap_close($ds); } else {
echo "Unable to connect to LDAP server."; }
?>
Ldap_count_entries();
Đếm số lượng các entry được tìm thấy từ kết quả của lệnh tìm kiếm.
int ldap_count_entries ( resource link_identifier, resource result_identifier )
ldap_error();
trả lại thông báo lỗi LDAP của lệnh LDAP cuối cùng. string ldap_error ( resource link_identifier )
ldap_first_attribute();
hàm trả lại thuộc tính đầu tiên của entry
string ldap_first_attribute ( resource link_identifier, resource result_entry_identifier,
ldap_first_entry();
trả lại kết quả id đầu tiên của entry
ldap_first_entry ( resource link_identifier, resource result_identifier )
ldap_first_reference();
trả lại tham chiếu đầu tiên
ldap_first_reference ( resource link, resource result )
ldap_free_result();
giải phóng kết quả bộ nhớ
bool ldap_free_result ( resource result_identifier )
Bài 28: Lập trình với socket
Sử dụng Socket với PHP tác giả:Andrew Walsh ngDịch hpnubie
Sockets là một cách thức dùng trong PHP để kết nối với một server khác qua mạng hay internet. function căn bản để mở kết nối đến server là fsocken(). Có thể bạn sẽ thấy ngạc nhiên tại sao bạn lại muốn kết nối đến server khác. Nếu bạn cần thêm thông tin về 3rd party server thì sockets là cái cho bạn cần.
Tutorial này hướng dẫn chúng ta các phương thức sau đây : # Connect To A Server Using Sockets
# Disconnect From a Server%br% # Send a request to a server%br%
# List the number of lines returned by the server on a request%br% # Use sockets in a practical project like a whois look-up script Kết nối qua sử dụng sockets với PHP
Nếu bạn có ý nghĩ nối kết với internet server khác với php rất rắc rối , có lẽ bạn hơi lầm. Bạn chỉ cần nối mạng bằng một dòng code của php. trong phần này sẽ giải thích cách nối và ngắt nối mạng qua sử dụng sockets.
Code: <?php /*
Tham số mà fsockopen cần là:
fsockopen(IP/Hostname, cổng (port), Lỗi ($errno), miêu tả lỗi phát hiện($errdesc) */
$fp = fsockopen( "www.phpvn.org", 80, $errno, $errdesc);
?>
Bạn đã thiết lập một kết nối đến server vd: phpvn.org. Bạn cũng nên làm quen với function fclose() để ngắt nối mạng.
<?php
$errdesc); //establish connection fclose($fp); //close connection ?>
Gởi một Request
Trong phần kế tiếp này bạn sẽ làm quen với cách gởi một request đến server và cho thể hiện một danh sách mà server gởi trả lại cho bạn cũng như cách làm việc của nó. Việc trước tiên cần làm là mở một kết nối đến server với một tên biến $fp, có nghĩa bạn đã gởi một $fp và nhận được một kết quả trả về từ server mà bạn đã gởi đến.
Code: <?php /*
Kết nối đến server vd: www. example.com */
$host = "www.example.com"; $page = "/index.html";
$fp = fsockopen($host, 80, $errno, $errdesc) or die("Connection to $host failed");
/*
Chúng ta xác định thông tin của header để gởi đến cho server
GET, được hiểu chúng ta muốn nhận được thông tin hay trang web từ server đó Bạn cũng có thể sử dụng POST để làm việc này.
*/
$request = "GET $page HTTP/1.0\r\n"; $request .= "Host: $host\r\n";
$request .= "Referer: $host\r\n"; /*
Sử dụng function fput() gởi đòi hỏi(request) đến server và tạo một vòng lập (loop) lấy kết quả được từ mãng, được gọi là $page
*/ fputs($fp, $request); while(!feof($fp)){ $page[] = fgets($fp, 1024); } /*
Đóng mạng đồng thời lấy tổng số trang nhận được */
fclose($fp);
echo "The server returned ".(count($page)). " Lines";
/*
Tạo vòng lập (for) và in dữ liệu. */
for($i=0; $i<count($page); $i++){ echo $page[$i];
} ?>
Tìm kiếm (Searching for a page)
Trong phần này chúng ta sử dụng fsockenopen() để kể nối đến nhiều server và kiểm soát một trang nào đó trong server.
Code: <?php
"www.example.com" => "/index.html", "www.example2.com" => "/index.php" );
/*
Tạo vòng lập cho server array và kết nối đên mạng, Báo lỗi nếu không kết nối được
*/
foreach($servers as $host=> $page){ $fp = fsockopen($host,80,$errno,$errdesc,10); echo "Trying $host<br>\n";
if(!$fp){
echo("couldnt connect to $host");
echo "<br><hr><br>\n"; continue;
} /*
Xác định thông tin, và gởi request đến server */
echo "trying to get $page<br>\n";
$request = "HEAD $page HTTP/1.0\r\n\r\n"; fputs($fp, $request); echo fgets($fp, 1024); echo "<br><br><br>\n"; /* Đóng mạng */ fclose($fp); } ?>
Dòng code trên được diễn như sau: Trying: Example Web Page
Trying to get: /index.html HTTP/1.1 200 OK
Nó chỉ hiện những trang đã tìm được, nếu không sẽ thay thế trang 404 bằng mã số 200. ứng dụng Whois
Bạn đã biết qua ứng dụng kết nối đến một server, tạo vòng lập để in kết quả và cách đóng mạng. chúng ta thực hành thêm một vài thao tác cho ứng dụng whois.
Code: <?php extract($_POST); function whois($domain,$ext){ $url=$domain.$ext; /*
sử dụng switch() để xác định whois server nào là server thích hợp nhất để kết nối domain */ switch($ext){ case ".co.uk": $whois = "whois.nic.uk"; break; case ".com":
$whois = "whois.networksolutions.com"; break; case ".fr": $whois = "whois.nic.fr"; break; case ".biz": $whois = "whois.biz"; break; default: $whois = "whois.networksolutions.com"; } if (trim($url) <> "") { $url = trim($url); /* kết nối đến server */
$f = fsockopen($whois, 43, $errno, $errstr, 30); if (!$f) {
echo "Connection To Server Failed ($errno)"; } else {
/*
Gởi domain đến một server và chờ nhận kết quả */ fputs($f, "$url\r\n"); print "<pre>\r\n"; while (!feof($f)) { echo fread($f,128); } print "</pre>"; /* Đóng mạng */ fclose($f); } }else{
echo "Invalid domain entered"; }
} ?>
Bài 29: Xử lý đồ họa với thư viện GD
tác giả : Dan Radigan Macromedia