Hiển thị các bài đăng có nhãn PHP. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn PHP. Hiển thị tất cả bài đăng

Thứ Tư

Lấy kết quả tìm kiếm từ Google qua các A

Từ giữa năm 2002 Google đã cung cấp các API cho phép người dùng truy xuất trực tiếp đến các nội dung: search result, suggestion, cached page mà không cần vào trang web. Bạn có thể vào để xem thông tin chi tiết rồi đăng kí 1 tài khoản (sẽ được cung cấp 1 số serial, có nó mới sử dụng các API được). Với tài khoản này bạn có thể thực hiện miễn phí 1000 yêu cầu tìm kiếm trong 1 ngày. Đây là dịch vụ rất ích lợi với các webmaster, thí dụ bạn có thể dùng nó để nghiên cứu về một từ khóa hoặc một trang web chẳng hạn.
Dịch vụ web của Google dựa trên SOAP. Với PHP (Google đã có sẵn thí dụ cho .NET và Java) bạn có thể dùng gói PEAR::SOAP thông qua thí dụ ở hoặc dùng một cài đặt khác là nusoap () như thí dụ ở
Cài đặt 1 (dùng PEAR::SOAP, bạn cần có package này trên server)

PHP Code:
<?php
/* Accessing the Google Web API via PHP
- by Simon Willison (simon@incutio.com)
This code is in the public domain - do whatever you want with it

To use this code you will need both PEAR and the PEAR SOAP package
installed somewhere on your php include path. You can get the SOAP
package from CVS:

cvs -d :pserver:cvsread@cvs.php.net:/repository login
(enter phpfi as the password)
cvs -d :pserver:cvsread@cvs.php.net:/repository co pear/SOAP

You will need a Google license key - see this site:
http://www.google.com/apis/

*/

include("SOAP/Client.php");

// Google search query
$query = 'soap';

// Your google license key
$key = 'xxxxxxxxxxxxxxxxxxxxxxxxx';

$s = new SOAP_Client('http://api.google.com/search/beta2');
$result = $s->call('doGoogleSearch', array(
'key' => $key,
'q' => $q,
'start' => 0,
'maxResults' => 10,
'filter' => false,
'restrict' => '',
'safeSearch' => false,
'lr' => '',
'ie' => '',
'oe' => '',
), 'urn:GoogleSearch');

// Is result a PEAR_Error?
if (get_class($result) == 'pear_error')
{
$message = $result->message;
$output = "An error occured: $message<p>";
}
else
{
// We have proper search results
$num = $result['estimatedTotalResultsCount'];
$elements = $result['resultElements'];
$list = '';
if ($num > 0) {
foreach ($elements as $item) {
$size = $item['cachedSize'];
$title = $item['title'];
$url = $item['URL'];
$snippet = $item['snippet'];
$desc = "<p><b>$title</b> - <a href=\"$url\">$url</a> ";
$desc .= "<small>[Size: $size]</small></p>";
$desc .= "\n<blockquote>$snippet</blockquote>\n\n";
$list .= $desc;
}
}
$output = "$num results returned:\n\n$list";
}
echo $output;
?>
Cài đặt 2 (dùng nusoap ), có chức năng đề nghị lỗi chính tả

PHP Code:
<?php

////////////////////////////////////////////////////////////
// This is example code of how to query the Google API using
// Web Services, SOAP, and PHP.
//
// Author: Geoff Peters, January 6th 2004.
// Updated by Dan Karran, 10th March 2005 to utilise nuSOAP instead of PEAR.


// put your developer's key here:
$key = 'INSERT GOOGLE API DEVELOPERS KEY';



include ('nusoap.php');

$soapclient = new soapclient('http://api.google.com/search/beta2');
$soapoptions = 'urn:GoogleSearch';

// Ensure there is a start value
if (!$start) {
$start = 0;
} else {
$start = intval($start-1);
}


////////////////////////////////////////////////////////////
// Calls the Google API and retrieves the search results in $ret
//
function do_search( $q, $type, $key, $start, &$ret )
{
global $soapclient;
global $soapoptions;


// Note that we pass in an array of parameters into the Google search.
// The parameters array has to be passed by reference.
// The parameters are well documented in the developer's kit on the
// Google site http://www.google.com/apis


// limit searches to this server
$sitequery = "$q site:{$_SERVER['SERVER_NAME']} $restrict";

$params = array(
'key' => $key,
'q' => $sitequery,
'start' => $start,
'maxResults' => 10,
'filter' => false,
'restrict' => '',
'safeSearch' => false,
'lr' => '',
'ie' => '',
'oe' => ''
);

// Here's where we actually call Google using SOAP.
// doGoogleSearch is the name of the remote procedure call.

$ret = $soapclient->call('doGoogleSearch', $params, $soapoptions);

$err = $soapclient->getError();

if ($err)
{
print("<br>An error occurred!<br>");
print(" Error: $err<br>\n");
return false;
}

return true;
}


////////////////////////////////////////////////
// Does Google search with retry.
// Retry is useful because sometimes the connection will
// fail for some reason but will succeed when retried.
function search( $q, $type, $key, $start, &$ret )
{
$result = false;
$max_retries = 5;
$retry_count = 0;

while( !$result && $retry_count < $max_retries )
{
$result = do_search( $q, $type, $key, $start, $ret );
if( !$result )
{
print( "Attempt $retry_count failed.<br>\n");
}
$retry_count++;
}
if( !$result )
{
print("<br>Sorry, connection to Google failed after retrying several times.<br>\n");
}
return $result;
}


////////////////////////////////////////////////////////////
// Calls the Google API and retrieves the suggested spelling correction
//
function do_spell( $q, $key, &$spell )
{
global $soapclient;
global $soapoptions;

$params = array(
'key' => $key,
'phrase' => $q,
);

$spell = $soapclient->call('doSpellingSuggestion', $params, $soapoptions);

$err = $soapclient->getError();

if ($err)
{
print("<br>An error occurred!<br>");
print(" Error: $err<br>\n");
return false;
}

return true;
}


//////////////////////////////////////////////////////////
// The main part of this script


if( $q != "" )
{
// remove the slashes that are automatically added by PHP before each quotation mark
$q = stripslashes($q);

if( do_search( $q, $type, $key, $start, $ret ) )
{

$count = $ret['estimatedTotalResultsCount']; // total number of results
$secs = round($ret['searchTime'],2); // time taken to search (in seconds)
$min = $ret['startIndex']; // first record returned
$max = $ret['endIndex']; // last record returned

if ($max) {

// Truncate query for display
if (strlen($q) > 36) {
$short_q = substr($q,0,33)."...";
} else {
$short_q = $q;
}

// print header with search box and details of search results
print "<form method=\"GET\"><table class=\"search_top\" width=100%><tr><td nowrap style=\"text-align:left;\">";
print "<input type=\"text\" name=\"q\" size=\"30\" value=\"$q\">\n";
print "<input type=\"submit\" value=\"search\">\n";
print "</td><td nowrap> results <b>$min</b> - <b>$max</b> of about <b>$count</b> for <b>$short_q</b> ";
print " (<b>$secs</b> seconds)&nbsp;</td></tr></table></form>";

// list results
foreach($ret['resultElements'] as $result) {

// Make URLs more friendly for user by removing http:// and highlighting where necessary
$friendly_URL = $result['URL'];
$friendly_URL = str_replace("http://","",$friendly_URL);
$friendly_URL = str_replace("$q","<b>$q</b>",$friendly_URL);

print "<p class=\"search_result\">";
if (!$title = $result['title']) {
$title = $result['URL'];
print "<a href=\"".$result['URL']."\">".$friendly_URL."</a>\n";
} else {
print "<a href=\"".$result['URL']."\">".$title."</a><br/>\n";
if ($result['snippet']) {
print $result['snippet']."<br/>\n";
}
print "<span class=\"search_url\">$friendly_URL</a>";
}
print "</p>\n\n";
}
} else {

print "<p>Sorry, no results were found on this site for <b>$q</b>. ";
do_spell($q, $key, $spell);
if ($spell[0]) {
print "Did you mean <b><a href=\"../search/?q=".$spell."\">".$spell."</a></b>? ";
}
print "Occasionally no results will be returned when there are problems with the link between this site and Google. If you believe the information is on the site but it tells you that it's not, please try again.</p>";
}
}
}

// Show forward/backward navigation if there are results
if ($count) {
print "<div class=\"search_bottom\">";
if ($min>1) {
if ($min >10) {
$prevpage = $min-10;
} else {
$prevpage = 1;
}
print " <b><a href=\"../search/?q=".$q."&start=".$prevpage."\">previous page</a></b> | ";
} else {
print " previous page | ";
}
if ($count>$max) {
$nextpage = $max+1;
print " <b><a href=\"../search/?q=".$q."&start=".$nextpage."\">next page</a></b> ";
} else {
print " next page ";
}
print "</div>";
}

print "<form method=\"GET\" class=\"search_main\">";
print "<input type=\"text\" name=\"q\" size=\"32\" value=\"$q\"> <input type=\"submit\" value=\"search\">";
print "</form>";

?>
Theo hainam

Anti PHP & SQL Injection

I - Anti PHP & SQL Injection

1.SQL Injection

- Hầu hết các lỗi SQL Injection đều là do câu lệnh SQL sai hoặc do User làm cho câu lệnh SQL sai , không thực hiện đúng chức năng của nó . Ví dụ như chúng ta có một Script kiểm tra đăng nhập như sau :

Mã lệnh (php)
<?
//Các lệnh Connect vào SQL Database .v.v.
$username = $_POST['username']; //Lấy User và Pass từ Form
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM users WHERE user = \"$username\" AND password = \"$password\"");
if (mysql_num_rows($result) > 0) {
//Đăng nhập thành công
}
else {
//Đăng nhập không đúng Username hay Password
}
//.......
?>

- Đoạn Script trên là một đoạn Script rất đơn giản thực hiện Login thông qua câu SQL kiểm tra username và password . Câu lệnh SQL nguyên thủy là :

SELECT * FROM users WHERE user = "$username" AND password = "$password"

- Tuy nhiên, đây lại là một SQL Injection vô cùng lớn, nếu như User nhập biến User là " OR 1 OR user="

- Khi đó lệnh SQL sẽ trở thành :

SELECT * FROM users WHERE user = "" OR 1 OR user="" AND password = "$password"

- Kết quả trả về sẽ là toàn bộ user trong Database và dĩ nhiên đây là một trường hợp Login không hợp lệ (biến password cũng có thể sữ dụng để tạo SQL Injection) . Thực ra, lỗi trên là do biến $username, có thể fix bằng cách kiểm tra biến user, rồi sau đó mới kiểm tra biến pass, hoặc một cách nhanh hơn, fix được hầu hết tất cả các lỗi SQL Injection mà chỉ cần sữ dụng một hàm có sẵn của PHP, đó là hàm addslashes .

- Xin nói một chút về hàm addslashes: hàm này sẽ trả về một chuỗi với dấu \ trước các ký tự cần trích dẫn trong Database, các ký tự đó là " \ và NUL (\0) .

- Cấu trúc hàm addslashes : string addslashes ( string str)

- Nhờ có hàm addslashes mà câu lệnh SQL của ta sẽ trở thành :

SELECT * FROM users WHERE user = "\" OR 1 OR user=\"" AND password = "$password"

- Như vậy thì câu lệnh SQL sẽ hoạt động đúng như chức năng của nó . Một số lỗi SQL Injection khác cũng có thể khắc phục bằng phương pháp này. Tôi cũng xin nhắc lại là phương pháp này chỉ fix được hầu hết tất cả các lỗi SQL Injection, tức là các lỗi do biến PHP gây ra, còn các lỗi do bản thân câu lệnh SQL thì cách này không có hiệu quả gì. Tuy nhiên nếu dùng phương pháp này và câu lệnh SQL chắc chắn thì tôi tin rằng bạn sẽ không còn lo lắng về SQL Injection.

2.PHP Injection

- Lỗi PHP Injection thường xảy ra với các script đọc File, tương tác hệ thống v.v. . Đây là một điển hình của PHP Injection:

Mã lệnh (php)
<?
//...
readfile($file);
//...
?>

- Thoạt nhìn thì không có lỗi gì, nhưng nếu như vì một lý do gì đó mà biến $file không được khai báo thì đây là một lỗi PHP Injection rất nặng. Nếu như Link đưa đến trang có lỗi như thế này : http://somehost.com/somescript.php?file=somescript.php

- Lúc này thì biến $file lại được khai báo bởi chính PHP, chức năng Regiser-Global và kết quả là sẽ đưa ra nội dung của file somescript.php hay bất cứ File nào trên hệ thống (kể cả File chức Password nếu hacker chịu khó mò và xem như host của chúng ta tiêu luôn).

- Nếu phân tích thì ta sẽ thấy rằng biến $file đã được khai báo do chức năng Register-Global (chức năng tự động đăng ký các biến trong GET, POST , COOKIE v.v...), và được fix một cách đơn giản là tắt chức năng này đi. Việc tắt chức năng này đi cũng không ảnh hưởng gì nhiều đến PHP.

II.Using Header

- Header là một hàm khác hay của PHP, hàm này sẽ send raw HTTP Header. Bạn có thể tìm tài liệu về HTTP Header trên rất nhiều diễn đàn lập trình khác. Trong bài viết này tôi sẽ đề cập đến một số header thông dụng.

1.Location Header

- Location Header có tác dụng chuyển trang yêu cầu đền một trang khác.

Mã lệnh (php)
header("location : http://php.net");
//Chuyển đến trang php.net

2.HTTP Command

- Lệnh Header cũng có thể sử dụng để gửi các lệnh của HTTP như 404 , 500 .v.v.

Mã lệnh (php)
header("HTTP/1.0 404 Not Found"); //Thông báo không tìm thấy của HTTP.

3.Attachment Header

- Header này có tác dụng thay tạo bảng Download, tải File do PHP tạo ra về máy ( UDU - Unlimited Database Upload , một script giúp ghi dữ liệu binary trong Database là một ví dụ về header này)

Mã lệnh (php)
<?
//Dạng File
header("Content-type: application/pdf");
//Tên File
header("Content-Disposition: attachment; filename=downloaded.pdf");
//Kích thước của File
header("Content-Length: " . filesize("original.pdf") );
//Nội dung cuả File
readfile('original.pdf');
?>

4.Authentication Header

- Đây là một header rất hay của PHP, nó sẽ tạo ra một bảng Login và yêu cầu nhập Username và Password, rất thích hợp cho trang dành cho các vùng hạng chế.

Mã lệnh (php)
<?
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
}
else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

- Chú ý khi sữ dụng Header : header phải được gọi trước khi đưa nội dung vào trang, vì header phải được gửi trước khi gửi nội dung của trang hoặc bạn sẽ nhận được lỗi thông báo về Header, tuy nhiên bạn có thể tranh lỗi này bằng sữ dụng Output buffering mà tôi sẽ đề cập sau đây. Đây là một vd về sử dụng header sai:

Mã lệnh (html)
<html>
<?php
//Lỗi vì <html> đã được gửi rồi
header('Location: http://www.example.com/');
?>

III.Output Buffering

- Cũng như ASP, PHP cũng có chức năng tạo bộ đệm trang và chức năng này mạnh hơn rất nhiều so với ASP nhưng lại đòi hỏi cấu hình PHP. Tuy nhiên chức năng này hoạt động hầu hết trên Server mà không cần phải cấu hình lại PHP. Bạn có thể sử dụng các hàm Buffer của PHP hoặc tự tạo bộ đệm cho mình. Sử dụng Buffer sẽ giúp cho bạn tránh được lỗi header và có thể thay đổi nội dung của trang nhưng nó cũng yêu cầu một Server tốt, vì mỗi lần Buffer thì nó sẽ ghi vào bộ nhớ hay File.

1.Output Buffering Function

- Sau đây là một số hàm sử dụng Output Buffer:

- bool ob_start: bắt đầu sử dụng Buffer

- bool ob_end_flush: kết thúc sử dụng Buffer và gửi bộ đệm đến Client, chú ý là bộ đệm sẽ không thay đổi được nữa.

- bool ob_end_clean: kết thúc sử dụng Buffer và xóa toàn bộ bộ đệm .

- void ob_flush: gửi bộ đệm đến Client, bộ đệm không thay đổi được nữa.

- void ob_clean: xóa bộ đệm .

- string ob_get_contents: trả về nội dung bộ đệm .

- int ob_get_length: trả về kích thước bộ đệm .

- string ob_get_clean: trả về nội dung bộ đệm và xóa bộ đệm.

2.User Output Function

- Một cách khác để sử dụng Buffer là tạo một biến để chứa nội dung của trang trước khi đưa nội dung của trang ra. Cách này hơi tốn công so với sử dụng hàm của PHP nhưng nó đơn giản và không bị hạn chế.

IV.Search Array

- PHP là một ngôn ngữ Web mạnh, nhưng nó lại có một thiếu sót rất lớn là tìm kiếm trong Array, hầu hết các hàm của PHP chỉ sử dụng khi ta biết rỏ là key hay value đó hoặc có hoặc không trong Array đó, không thể nào tìm kiếm các key hay value liên quan hay hơi giống hay không phân biệt chữ hoa và chữ thường (sensitive) so với chuổi cần tìm .

1.PHP Array Function

- Sau đây là một số hàm tìm kiếm trong array của PHP:

mixed array_search ( mixed needle, array haystack [, bool strict])

- Hàm array_search tìm kiếm một giá trị trong array và trả về key của Value đó. Hàm này xem ra lại rất kém hiệu quả.

bool in_array ( mixed needle, array haystack [, bool strict])Hàm này cũng tương tự như array_search nhưng nó trả về giá trị TRUE nếu tìm thấy và FALSE nếu không tìm thấy trong Array.

- bool array_key_exists ( mixed key, array search) Hàm này là mô phỏng của in_array, điểm khác là nó kiểm tra key chứ không phải value.

- array array_keys ( array input [, mixed search_value])Cuối cùng là hàm array_key, hàm này sẽ trả về một array chứa Key của array cần tìm hay của một giá trị Array cần tìm. Hàm này không thể sử dụng để tìm kiếm nhưng có thể sử dụng trong việc tìm kiếm.

- Hầu hết các hàm liệt kê trên đều không hiệu quả, không thích hợp cho việc tìm kiếm Array, vì vậy mà tôi đã phải viết lại hàm SearchArray

2.SearchArray Function

- Hàm này do tôi viết lại để tìm kiếm trong Array

Mã lệnh (php)
function searcharray($search , $ARRAY , $checkkey = "" , $cmpflag = 0 , $breakonfind = "") {
$ret = array();$add = true;
foreach ($ARRAY as $key => $val) {
$add = false;
if ($checkkey != "") $cmp = $key;
else $cmp = $val;
if ($cmp <> "") {
switch ($cmpflag) {
case 1: //Compare From Left
if (strcasecmp(substr($cmp , 0 , strlen($search)) , $search) == 0) $add = true;
break;
case 2: //Compare From Right
if (strcasecmp(substr($cmp , strlen($cmp) - strlen($search)) , $search) == 0) $add = true;
break;
case 3: //Normal String Compare
if (strcasecmp($cmp , $search) == 0) $add = true;
break;
default: //In String Compare
if (stristr($cmp , $search)) $add = true;
break;
}
if ($add) {
if ($breakonfind != "") return $key;
$ret[] = $key;
}
}
}
return ($breakonfind != "") ? "" : $ret;
}

- Hàm này tìm kiếm rất hiệu quả, nó so sánh từng giá trị hay khóa trong Array và đưa ra kết quả tìm kiếm. Cách so sánh cũng tùy vào Flag mà ta đưa vào, và có thể chỉ tìm giá trị đầu tiên.

- Cách sữ dụng: hàm này có 5 tham số, trong đó có 2 tham số là bắt buộc.

- search: giá trị cần tìm .

- ARRAY: array cần kiểm tra .

- checkkey: nếu checkkey khác rỗng ("") , hàm sẽ kiểm tra khóa thay vì Value.

- cmpflag: cách kiểm tra: 1: so sánh chuổi từ bên trái, 2: so sánh chuổi từ bên phải, còn lại: hàm sẽ kiểm tra xem chuổi cần tìm có trong chuổi kiểm tra không. Tất cả các kiểu so sánh đều không phân biệt chữ hoa chữ thường.

- breakonfind: nếu khác rỗng ("") hàm sẽ trả về key của giá trị tìm thấy đầu tiên hay môt giá trị rỗng ("") nếu không tìm ra.

Hàm sẽ trả về một array chứa các giá trị tìm thấy nếu flag breakonfind không được set.

V.Make Configuration File

- Khi bạn tạo code một PHP script lớn như Forum hay Mysql Manager hay File Manager .v.v... hẳn các bạn sẽ dùng một File Config.php để lưu lại cấu hình PHP. Hàm savefile cũng do tôi viết có thể tạo một file config nhanh và rất hiệu quả.

Mã lệnh (php)
function savefile($F , $V) {
$result = "<?\n\n";
$f = fopen($F , "wb");
foreach($V as $key => $val) {
$result .= "\$" . addslashes($key) . " = " . parseval($val) . ";\n";
}
$result .= "\n?>";
fwrite($f , $result);
fclose($f);
}
function parseval($v) {
if (!is_array($v)) {
return "\"" . addslashes($v) . "\"";
}
else {
$result = "array(";
foreach ($v as $key => $value) {
$result .= '"' . addslashes($key) . '" => ' . parseval($value) . ",";
}
if (substr($result , strlen($result) - 1 , 1) == ",") $result = substr($result , 0 , strlen($result) - 1);
$result .= ")";
return $result;
}
}

- Hàm savefile sẽ mở File và sau đó sẽ chạy đệ quy parseval để tạo chuổi PHP về file Config.

- Ví dụ về sử dụng:

savefile("config.php" , array("MAINCONFIG" => $MAINCONFIG , "OTHERCONFIG" => $OTHERCONFIG);

- Hàm sẽ lưu vào file config.php 2 giá trị là MAINCONFIG theo biến $MAINCONFIG và OTHERCONFIG theo biến $OTHERCONFIG. File Config.php sẽ có nội dung như sau:

Mã lệnh (php)
<?
$MAINCONFIG = //Giá trị biến MAINCONFIG, tùy theo MAINCONFIG có dạng nào mà config được save theo dạng đó
$OTHERCONFIG = //Giá trị biến OTHERCONFIG, như trên
?>

VI.Use Pre-Made Script

- Xin kết thúc bài viết lập trình PHP nâng cao bằng một số Script thông dụng hiện nay.

1.Mysql Class

- Bạn có thể tìm thấy Mysql Class trong bộ Forum Invision Power Board, nó nằm ở thư mục IPB PATH\sources\Drivers/mySQL.php . Đây là một Class tương tác với mysql theo kiểu Object rất hay, nhưng điểm hay của nó là có thể tạo được câu lệnh SQL như INSERT, UPDATE từ các biến array rất chính xác (multi query). Tuy nhiên bạn cũng không nên sử dụng hoàn toàn class này mà nên dùng để tham khảo vì IPB không cho edit source.

2.phpMyAdmin

- Cái này thì chắc ai cũng biết , phpMyAdmin quản lý mySQL rất tuyệt vời, có thể download tại http://mysql.org

3.phpRemoteView

- Đây là một Script khá hay giúp bạn tương tác với hệ thống sử dụng PHP (cái này được xem là một công cụ hack thì đúng hơn , nhưng source của nó thì rất tuyệt). Script có thể download tại http://php.spb.ru/remview/

4.Net2ftp

- Một công cụ rất hay giúp bạn Connect tới các FTP Server sữ dụng PHP, có thể download tại http://www.net2ftp.com

5.pclTar , pclZip

- Hai công cụ tuyệt vời trong việc tạo các File Zip, Tar sử dụng PHP. Điểm đặc biệt là 2 script này không yêu cầu bất cứ gì từ PHP, bạn chỉ cần include vào và sử dụng. Có thể Download tại: http://www.phpconcept.net

6.Eskuel

- Một công cụ quản lý MySQL khác, công cụ này không bằng phpMyAdmin nhưng lại có một size rất khiêm tốn. Download tại: http://eskuel.sourceforge.net/site/upgrade...〈=english

7.Invision File Manager

- Ngoài Invision Power Board, hảng Invision còn viết một chương trình Manager rất hay, hổ trợ nhiều User và chức năng Zip File. Download tại trang web http://invisionpower.com

Ham Delay trong PHP(sleep or usleep)

1.Hàm sleep :
int sleep ( int $seconds );

Examples:

<?php

// current time
echo date('h:i:s') . "\n";

// sleep for 10 seconds
sleep(10);

// wake up !
echo date('h:i:s') . "\n";

?>
tham khảo thêm ở PHP Manual :http://php.net/manual/en/function.sleep.php
2.Hàm usleep :
 
void usleep ( int $micro_seconds );
 
Example:
<?php

// Current time
echo date('h:i:s') . "\n";

// wait for 2 seconds
usleep(2000000);

// back!
echo date('h:i:s') . "\n";

?>
tham khảo thêm ở PHP Manual :http://php.net/manual/en/function.usleep.php

Các cách lấy link web trong php - How To Find The Current URL In PHP

Trong một số trường hợp bạn bắt buộc phải lấy đường dẫn tên miền, tên miền hiện tại, các biến của bạn để phục vụ trong vấn đề gì đó.
Rất may PHP cung cấp cho chúng ta sẵn 1 số hàm phục vụ cho vân đề này. Các bạn xem các ví dụ say sẽ rõ

Code 1: Nếu bạn cần lấy tên miền hiện tại, bạn có thể sử dụng code dưới đây:

MÃ: CHỌN
<?php
# Using HTTP_HOST

$domain = $_SERVER['HTTP_HOST'];
echo $domain; //echo grouplaptrinh.com
?>
Code trên chỉ cho chúng ta tên website .com .net không bao gồm tiền tố http:// hoặc www. Vì vậy các bạn nên lưu ý khi sử dụng cú pháp này

Code 2: Lấy đường dẫn đang truy cập:
MÃ: CHỌN
<?php
# Using SCRIPT_NAME

$path = $_SERVER['SCRIPT_NAME'];

echo "Path To Script Example: <a href='$path'>An Article Title</a>";
//ex: http://grouplaptrinh.com/test.php
//result: http://grouplaptrinh.com/test.php

?>

Kết quả này trả về giá trị y chang đường dẫn bạn đang truy cập

Code 3: Trả về biến mà bạn đăng truy cập
ví dụ: http://grouplaptrinh.com/index.php?user=thanhansoft. Kết quả trả về user=thanhansoft

MÃ: CHỌN
<?php
# Using QUERY_STRING

$queryString = $_SERVER['QUERY_STRING'];

echo "Query: " . $queryString;

?>

Code 4: Dành cho các Mod rewrite
Nếu bạn đang sử dụng MOD rewrite để làm cho URL của bạn thân thiện với người dùng hơn, vẫn còn một cách để có được các URL ban đầu. Bằng cách sử dụng các biến server REQUEST_URI, chúng ta có thể nhận được các URL được truy cập trang. Vì vậy, được định nghĩa, chúng tôi bỏ qua bất cứ viết lại quy tắc.

MÃ: CHỌN
<?php
# Using REQUEST_URI

echo "http://" . $_SERVER['HTTP_HOST']  . $_SERVER['REQUEST_URI'];
//result: bai-viet/lap-trinh-web-php/cac-cach-lay-link-web-trong-php-how-to-find-the-current-url-in-php/236

?>

Thứ Hai

Đếm số người truy cập trong ngày và truy cập unique

Có lẽ bộ đếm số người truy cập đã quá quen thuộc với mọi người. 
Một số dạng đếm thông thường: 
- Tổng số ngừơi truy cập: chỉ cần tạo một file để lưu lại con số thể hiện số lần truy cập 

PHP CodeCopy To Clipboard
  • <?
  • $file    = "C:visitor.txt";
  • $incr=(file_exists($file))?file_get_contents($file):1;
  • $incr++;
  • $cont=fopen($file,'w');
  • fwrite($cont,$incr);
  • fclose($cont);
  • print 'Visit: '.$incr.'<br>';
  • ?> 

(cũng có thể dùng database thay cho file) 

- Đếm số người truy cập trong ngày: 

Tạo một database có có 2 field ID và Date 
PHP CodeCopy To Clipboard
  • <?
  • $conn = mysql_connect('câu lệnh connect');
  • mysql_db_select('your_db_name');
  • $sql = mysql_query("select * from <table> where Date='".date('Y-m-d')."'");
  • print 'số người truy cập trong ngày hôm nay:'.mysql_num_rows($sql);
  • // thêm một record mới
  • $sql = mysql("insert into <table> values('',date('Y-m-d'))");
  • ?>


- Đếm số ngừoi truy cập unique IP - mỗi IP chỉ tính một lần truy cập trong một ngày 
Tạo database gồm 3 field ID IP và Date với 2 khoá chính là IP và Date. Lúc này dữ liệu của chúng ta chỉ gồm những IP duy nhât trong một ngày( do thuộc tính khóa của IP và Date). nên công việc đếm của chúng ta bây giờ cũng giống như là đếm theo ngày. Chú ý là trên cùng một site thi đếm unique có giá trị nhỏ hơn hoặc bằng cách đếm thông thường trong ngày đó 

- Đếm số người đang online: Là đếm số ngừơi đang truy cập tại thờ điểm đó, nhưng trên thực tế thì là đếm số người online trong một khỏang thời gia $t (nếu t = 1ngày <=> đếm số người online trong ngày) 
$t thường được tính bằng giây, ta nên tạo database có cấu trúc như sau: 
ID Int(4) auto_increament 
Time int(10); 
PHP CodeCopy To Clipboard
  •  <?
  • // thêm một người online khi bạn truy cập
  • $now = time();
  • $sql = mysql("insert into <table> values('',$now)");
  • // đếm số ngừơi online trong khỏang thời gian $t
  • $sql = mysql("select * from <table> where Time>".($now-$t)
  • print mysql_num_rows($sql);
  • ?>

Trong bộ đếm số người online bạn có thể xóa đi những mẫu tin cũ (Time < $now - $t) để cho database nhẹ nhàng hơn
Nguồn:hoclaptrinh

Thứ Bảy

Làm việc với mảng trong PHP

Mở đầu 
Mảng là một cách hiệu quả để nhóm một lượng dữ liệu lại với nhau thành một khối duy nhất. Mảng trong PHP cũng như các ngôn ngữ khác (C/Java/VB), nó bao gồm 2 phần: khoá và giá trị (key và value). Nhưng vẫn có sự khác biệt, các khoá và giá trị trong PHP được dùng một cách tự do, không theo một ràng buộc quá mức nào cả. Bạn hoàn toàn có thể dùng một chuỗi để làm khoá, cũng như nhóm các giá trị không cùng kiểu dữ liệu với nhau lại làm thành một mảng. 

Tạo và thêm dữ liệu vào mảng 
Mảng được tạo dễ dàng bằng từ khoá array, và có thể thêm dữ liệu ngay trong phần nội dung của mảng. Nếu bạn thích dùng một key theo ý thích của mình thì có thể dùng toán từ => để thêm dữ liệu (value) cho key đó. 

Hơi khó hiểu, nhưng bạn hãy xem những ví dụ dưới đây để biết rõ hơn về cách tạo mảng cũng như cách lưu trữ giá trị trong mảng của PHP: 

PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   // PHP tự động gán key khi bạn tạo một mảng, bắt đầu từ key 0  
  •   // trong ví dụ dưới, key 0 có giá trị là "Piper", 
  •   // tương tự cho key 1, 2 và 3. 
  •   $airplanes = array("Piper""Cessna""Beech""Cirrus"); 
  •  
  •   // Chúng ta cũng có thể tạo key theo ý thích của chúng ta,  
  •   //không bắt buộc phải là số 
  •   $home = array("size" => 1800"style" => "ranch"
  •                 "yearBuilt" => 1955"numBeds" => 3
  •                 "numBaths" =>2"price" => 150000); 
  • ?> 

PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   // key của một mảng không bắt buộc bắt đầu phải là 0. 
  •   // Chẳng hạn, key 123 được dùng làm key bắt đầu trong ví dụ này. 
  •   $noises[123] = "hissssssss"
  •  
  •   // và khi khai báo như thế này, key tiếp theo của mảng sẽ là 124 
  •   $noises[] = "gobble gobble"
  •  
  • ?> 

Truy xuất vào 1 phần tử của mảng 
Bạn có thể truy xuất phần tử của mảng bằng cách gọi key của nó: 
PHP CodeCopy To Clipboard
  • <?php 
  •   // ví dụ về cách gọi key là 1 số 
  •   $breads = array("baguette""naan""roti""pita"); 
  •   echo "I like to eat "$breads[3] . "<br/>n"
  •  
  •   $computer = array("processor" => "Muncheron 6000"
  •                     "memory" => 2048"HDD1" => 80000
  •                     "graphics" => "NTI Monster GFI q9000"); 
  •  
  •   // ví dụ về cách gọi key là 1 chuỗi 
  •   echo "My computer has a " . $computer['processor'
  •        . " processor<br/>n"
  •  
  • ?> 

Xoá phần tử khỏi mảng 
Để xoá 1 phần tử nào đó của mảng, bạn dùng từ khóa unset cho phần tử đó: 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
  •                   "Americano""Latte"); 
  •   unset($drinks[3]);    // xóa phần tử "Mocha" khỏi mảng. 
  •  
  • ?> 

Còn muốn xoá toàn bộ phần tử của mảng, bạn cũng dùng từ khoá unset, nhưng cho toàn bộ mảng: 
PHP CodeCopy To Clipboard
  • <?php 
  •   unset($drinks);   // mảng $drinks giờ đã bị xóa sạch dữ liệu 
  • ?> 

Đếm số phần tử của mảng 
Sử dụng từ khoá count: 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
  •                  "Americano""Latte"); 
  •   $elems = count($drinks); 
  •   // kết quả sẽ là 6. 
  •   echo "The array $drinks has $elems elements<br/>n"
  •  
  • ?> 


II. Duyệt tất cả các phần tử của mảng 
Vòng lặp foreach 
PHP CodeCopy To Clipboard
  • foreach (array as [key =>] values) 
  •   khối lệnh  

Vòng lặp này sẽ duyệt qua từng phần tử một trong mảng, nó sử dụng một biến cho trước để tạo một bảng copy phần tử mà nó đang duyệt tới và xử lý trên biến đó. Vòng lặp kết thúc khi không còn phần tử nào để duyệt. 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
  •                   "Americano""Latte"); 
  •   foreach ($drinks as $drink
  •   { 
  •     echo "We serve $drink<br/>n"
  •   } 
  •  
  • ?> 

Vòng lặp thông thường (for) 
Vòng lặp for hoàn toàn có thể được dùng để duyệt qua tất cả các key của mảng: 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $drinks = array("Coffee""Café au Lait""Mocha""Espresso"
  •                   "Americano""Latte"); 
  •  
  •   for ($x = 0$x < count($drinks); $x++) 
  •   { 
  •     echo "We serve '$drinks[$x]'<br/>n"
  •   } 
  •  
  • ?> 


III. Mảng nhiều chiều (Multi-Dimensional Arrays) 
Rất nhiều trường hợp bạn muốn lưu trữ nhiều mảng trong 1 mảng có sẵn. Khi đó, chúng ta có mảng một nhiều chiều. Và rất may mắn là PHP hỗ trợ rất mạnh mẽ và dễ dàng trong việc tạo mảng nhiều chiều. 
Thật vậy, đây là cách mà mảng nhiều chiều được tạo trong PHP : 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $bikes = array(); 
  •   $bikes["Tourmeister"] = array("name" => "Grande Tour Meister"
  •                                 "engine_cc" => 1100
  •                                 "price" =>12999); 
  •   $bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000"
  •                                 "engine_cc" => 998
  •                                 "price" => 11450); 
  •   $bikes["OffRoadster"] = array("name" => "Off-Roadster"
  •                                 "engine_cc" => 550
  •                                 "price" => "4295"); 
  •  
  • ?> 


Còn đây là cách truy xuất vào các phần tử của mảng nhiều chiều: 
PHP CodeCopy To Clipboard
  • <?php 
  •  
  •   $names = array_keys($bikes); 
  •  
  •   foreach ($names as $name
  •   { 
  •     print $bikes[$name] . " costs: " . $bikes[$name]["price"
  •           . "<br/>n"
  •   } 
  •  
  • ?> 


IV. Lời kết 
Mảng là một khai báo rất dễ dàng trong PHP. Việc học về mảng thật ra không có gì khó, chỉ cần đọc qua các ví dụ, bạn cũng hoàn toàn có thể rút ra cho mình được phương thức mà PHP tạo một mảng đơn giản 


http://hoclaptrinh.net

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates