DB classes. Instead of creating a database handle with the 
DB::connect( )
method, you 
instantiate a 
Cache_DB
object with the 
new
operator and then call the object's 
connect( )
method. The syntax of 
$cache->connect( )
is the same, however, so you just pass it the 
DSN that identifies the database. The 
query( )
method of 
Cache_DB
works just like that of 
DB
, however there are no 
prepare( )
and 
execute( )
methods in 
Cache_DB
query( )
returns a statement handle that supports 
fetchRow( )
and 
fetchInto( )
, but the default 
fetch mode is 
DB_FETCH_ASSOC
, not 
DB_FETCH_ORDERED
.  
The first time a particular 
SELECT
statement is passed to 
$cache->query( )
Cache_DB
executes the statement and returns the results, just like 
DB
, but it also saves the results in a 
file whose name is a hash of the query. If the same 
SELECT
statement is passed to 
$cache-
>query( )
again, 
Cache_DB
retrieves the results from the file instead of running the query 
in the database.  
By default, 
Cache_DB
creates its cache files in a subdirectory of the current directory called 
db_query. You can change this by passing a directory name as part of an options array as a 
second argument to the 
Cache_DB
constructor. This sets the cache directory to 
/tmp/db_query:  
$cache = new Cache_DB('file',array('cache_dir' => '/tmp/')); 
The first argument, 
file
, tells 
Cache_DB
what container to use to store the cached data. 
file
is the default, but you need to include it here to specify the container options in the 
second argument. The relevant container option is 
cache_dir
, which tells 
Cache_DB
where 
to create the db_query subdirectory. Including a trailing slash is required.  
By default, entries stay in the cache for one hour. You can adjust this by passing a different 
value (in seconds) when creating a new 
Cache_DB
object. Here's how to keep entries in the 
cache for one day, 86,400 seconds:  
$cache = new Cache_DB('file',array('cache_dir' => '.', 
'filename_prefix' => 'query_'),86400); 
Because the expiration time is the third argument, you have to pass the defaults for the first 
two arguments as well.  
The cache isn't altered if you change the database with an 
INSERT
UPDATE
, or 
DELETE
query. If there are cached 
SELECT
statements that refer to data no longer in the database, 
you need to explicitly remove everything from the cache with the 
$cache->flush( )
method:  
$cache->flush('db_cache'); 
It's very important to include the 
db_cache
argument to 
flush( )
. The PEAR 
Cache
system 
supports dividing up the cached items into different groups, and the 
Cache_DB
object puts 
Pdf add signature field - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
android edit pdf forms; edit pdf form
Pdf add signature field - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
adding text fields to pdf acrobat; pdf form maker
everything it's keeping track of in the 
db_cache
group. Leaving out the group argument 
results in deleting the files in the base cache directory (which is probably the directory you're 
running your script from).  
The file container stores each result in a file whose name is based on an MD5 hash of the 
query that generated the particular result. Because MD5 is case-sensitive, the file container is 
case-sensitive, too. This means that if the results of 
SELECT
*
FROM
zodiac
are in the cache, 
and you run the query 
SELECT
*
from
zodiac
, the results aren't found in the cache, and the 
query is run again. Maintaining consistent capitalization, spacing, and field ordering when 
constructing your SQL queries results in more efficient cache usage.  
Although this recipe focuses on the file container, the PEAR 
Cache
system supports a number 
of other containers that hold cached data, such as shared memory, PHPLib sessions, 
databases via the dbx library, and msession sessions. To use a different container, pass the 
appropriate container name as the first argument when creating a new 
Cache_DB
object:  
$cache = new Cache_DB('shm'); 
10.15.4 See Also 
Information about the PEAR 
Cache
system and the different containers at 
http://pear.php.net/package-info.php?package=Cache
Recipe 10.16 Program: Storing a Threaded Message Board 
Storing and retrieving threaded messages requires extra care to display the threads in the 
correct order. Finding the children of each message and building the tree of message 
relationships can easily lead to a recursive web of queries. Users generally look at a list of 
messages and read individual messages far more often then they post messages. With a little 
extra processing when saving a new message to the database, the query that retrieves a list 
of messages to display is simpler and much more efficient.  
Store messages in a table structured like this: 
CREATE TABLE pc_message ( 
id INT UNSIGNED NOT NULL, 
posted_on DATETIME NOT NULL, 
author CHAR(255), 
subject CHAR(255), 
body MEDIUMTEXT, 
thread_id INT UNSIGNED NOT NULL, 
parent_id INT UNSIGNED NOT NULL, 
level INT UNSIGNED NOT NULL, 
thread_pos INT UNSIGNED NOT NULL, 
PRIMARY KEY(id) 
); 
C# PDF Digital Signature Library: add, remove, update PDF digital
things. Add a signature or an empty signature field in any PDF file page. Search unsigned signature field in PDF document. Prepare
change font size in fillable pdf form; create a fillable pdf form in word
VB.NET PDF Digital Signature Library: add, remove, update PDF
things. Add a signature or an empty signature field in any PDF file page. Search unsigned signature field in PDF document. Prepare
best way to create pdf forms; change font on pdf form
The primary key, 
id
, is a unique integer that identifies a particular message. The time and 
date that a message is posted is stored in 
posted_on
, and 
author
subject
, and 
body
are 
(surprise!) a message's author, subject, and body. The remaining four fields keep track of the 
threading relationships between messages. The integer 
thread_id
identifies each thread. All 
messages in a particular thread have the same 
thread_id
. If a message is a reply to another 
message, 
parent_id
is the 
id
of the replied-to message. 
level
is how many replies into a 
thread a message is. The first message in a thread has level 0. A reply to that level message 
has level 1, and a reply to that level 1 message has level 2. Multiple messages in a thread can 
have the same 
level
and the same 
parent_id
. For example, if someone starts off a thread 
with a message about the merits of BeOS over CP/M, the angry replies to that message from 
CP/M's legions of fans all have level 1 and a 
parent_id
equal to the 
id
of the original 
message.  
The last field, 
thread_pos
, is what makes the easy display of messages possible. When 
displayed, all messages in a thread are ordered by their 
thread_pos
value.  
Here are the rules for calculating 
thread_pos
· 
The first message in a thread has 
thread_pos = 0
· 
For a new message 
N
, if there are no messages in the thread with the same parent as 
N
N
's 
thread_pos
is one greater than its parent's 
thread_pos
.  
· 
For a new message 
N
, if there are messages in the thread with the same parent as 
N
N
's 
thread_pos
is one greater than the biggest 
thread_pos
of all the messages with 
the same parent as 
N
.  
· 
After new message 
N
's 
thread_pos
is determined, all messages in the same thread 
with a 
thread_pos
value greater than or equal to 
N
's have their 
thread_pos
value 
incremented by 1 (to make room for 
N
).  
The message board program, message.php, shown in Example 10-4
saves messages and 
properly calculates 
thread_pos
. Sample output is shown in Figure 10-5
 
Figure 10-5. A threaded message board 
C# PDF insert image Library: insert images into PDF in C#.net, ASP
field. Access to freeware download and online C#.NET class source code. How to insert and add image, picture, digital photo, scanned signature or logo into PDF
add fields to pdf; pdf add signature field
VB.NET PDF insert image library: insert images into PDF in vb.net
Import graphic picture, digital photo, signature and logo into PDF Add images to any selected PDF page in VB.NET. Insert images into PDF form field in VB.NET.
adding signature to pdf form; add form fields to pdf online
Example 10-4. message.php  
require 'DB.php'; 
// a helpful database debugging function 
function log_die($ob) { print '<pre>'; print_r($ob); print '</pre>'; } 
// connect to the database 
$dbh = DB::connect('mysql://test:@localhost/test') or die("Can't connect"); 
if (DB::isError($dbh)) { log_die($dbh); } 
$dbh->setFetchMode(DB_FETCHMODE_OBJECT); 
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK,'log_die'); 
// The value of $_REQUEST['cmd'] tells us what to do 
switch ($_REQUEST['cmd']) { 
case 'read':                      // read an individual message 
pc_message_read(); 
break; 
case 'post':                      // display the form to post a message 
pc_message_post(); 
break; 
case 'save':                      // save a posted message 
if (pc_message_validate()) { // if the message is valid, 
pc_message_save();       // then save it 
pc_message_list();       // and display the message list 
} else { 
pc_message_post();       // otherwise, redisplay the posting form 
break; 
case 'list':                      // display a message list by default 
default: 
pc_message_list(); 
break; 
How to C#: Basic SDK Concept of XDoc.PDF for .NET
You may add PDF document protection functionality into your C# program. To be specific, you can edit PDF password and digital signature, and set PDF file
chrome save pdf with fields; create a fillable pdf form online
VB.NET PDF: Basic SDK Concept of XDoc.PDF
You may add PDF document protection functionality into your VB.NET program. To be specific, you can edit PDF password and digital signature, and set PDF file
change font size in pdf form; change font size in pdf form field
// pc_message_save() saves the message to the database 
function pc_message_save() { 
global $dbh; 
$parent_id = intval($_REQUEST['parent_id']); 
/* MySQL syntax for making sure pc_message doesn't change while 
* we're working with it. We also have to lock the tables that 
* hold the thread and pc_message sequences 
*/ 
$dbh->query('LOCK TABLES pc_message WRITE, thread_seq WRITE, 
pc_message_seq WRITE'); 
// is this message a reply? 
if ($parent_id) { 
// get the thread, level, and thread_pos of the parent message  
$parent = $dbh->getRow("SELECT thread_id,level,thread_pos 
FROM pc_message  
WHERE id = $parent_id"); 
// a reply's level is one greater than its parents  
$level = $parent->level + 1; 
/* what's the biggest thread_pos in this thread among messages 
with the same parent? */ 
$thread_pos = $dbh->getOne("SELECT MAX(thread_pos) FROM pc_message  
WHERE thread_id = $parent->thread_id AND parent_id = 
$parent_id"); 
// are there existing replies to this parent? 
if ($thread_pos) { 
// this thread_pos goes after the biggest existing one 
$thread_pos++; 
} else { 
// this is the first reply, so put it right after the parent  
$thread_pos = $parent->thread_pos + 1; 
/* increment the thread_pos of all messages in the thread that 
come after this one */ 
$dbh->query("UPDATE pc_message SET thread_pos = thread_pos + 1  
WHERE thread_id = $parent->thread_id AND thread_pos >= 
$thread_pos"); 
// the new message should be saved with the parent's thread_id  
$thread_id = $parent->thread_id; 
} else { 
// the message is not a reply, so it's the start of a new thread  
$thread_id = $dbh->nextId('thread'); 
$level = 0; 
$thread_pos = 0; 
// get a new id for this message  
$id = $dbh->nextId('pc_message'); 
/* insert the message into the database. Using prepare() and execute() 
makes sure that all fields are properly quoted */ 
$prh =  
VB.NET PDF Library SDK to view, edit, convert, process PDF file
NET program. Password, digital signature and PDF text, image and page redaction will be used and customized. PDF Annotation Edit.
pdf editable fields; adding form fields to pdf files
C# Create PDF Library SDK to convert PDF from other file formats
you can add some additional information to generated PDF file. What's more, you can also protect created PDF file by adding digital signature (watermark) on
best program to create pdf forms; changing font in pdf form
$dbh->prepare("INSERT INTO pc_message (id,thread_id,parent_id, 
thread_pos,posted_on,level,author,subject,body)  
VALUES (?,?,?,?,NOW(),?,?,?,?)"); 
$dbh->execute($prh,array($id,$thread_id,$parent_id,$thread_pos,$level, 
$_REQUEST['author'],$_REQUEST['subject'], 
$_REQUEST['body'])); 
// Tell MySQL that others can use the pc_message table now 
$dbh->query('UNLOCK TABLES'); 
// pc_message_list() displays a list of all messages 
function pc_message_list() { 
global $dbh; 
print '<h2>Message List</h2><p>'; 
/* order the messages by their thread (thread_id) and their position 
within the thread (thread_pos) */ 
$sth = $dbh->query("SELECT id,author,subject,LENGTH(body) AS 
body_length, 
posted_on,level FROM pc_message 
ORDER BY thread_id,thread_pos"); 
while ($row = $sth->fetchRow()) { 
// indent messages with level > 0 
print str_repeat('&nbsp;,4 * $row->level); 
// print out information about the message with a link to read it 
print<<<_HTML_ 
<a href="$_SERVER[PHP_SELF]?cmd=read&id=$row->id">$row->subject</a> by  
$row->author @ $row->posted_on ($row->body_length bytes) 
<br> 
_HTML_; 
// provide a way to post a non-reply message 
printf('<hr><a href="%s?cmd=post">Start a New Thread</a>', 
$_SERVER['PHP_SELF']); 
// pc_message_read() displays an individual message 
function pc_message_read() { 
global $dbh; 
/* make sure the message id we're passed is an integer and really 
represents a message */ 
$id = intval($_REQUEST['id']) or die("Bad message id"); 
if (! ($msg = $dbh->getRow( 
"SELECT author,subject,body,posted_on FROM pc_message WHERE id = 
$id"))) { 
die("Bad message id"); 
/* don't display user-entered HTML, but display newlines as 
HTML line breaks */ 
$body = nl2br(strip_tags($msg->body)); 
// display the message with links to reply and return to the message 
list 
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
image files including all PDF contents, like watermark and signature in .NET. C#.NET DLLs Solution for Converting Images to PDF in C# Add necessary references:
adding text fields to a pdf; pdf create fillable form
C# PDF remove image library: remove, delete images from PDF in C#.
Support removing vector image, graphic picture, digital photo, scanned signature, logo, etc. Remove Image from PDF Page Using C#. Add necessary references:
add signature field to pdf; adding image to pdf form
print<<<_HTML_ 
<h2>$msg->subject</h2> 
<h3>by $msg->author</h3> 
<p> 
$body 
<hr> 
<a href="$_SERVER[PHP_SELF]?cmd=post&parent_id=$id">Reply</a> 
<br> 
<a href="$_SERVER[PHP_SELF]?cmd=list">List Messages</a> 
_HTML_; 
// pc_message_post() displays the form for posting a message 
function pc_message_post() { 
global $dbh,$form_errors; 
foreach (array('author','subject','body') as $field) { 
// escape characters in default field values 
$$field = htmlspecialchars($_REQUEST[$field]); 
// make the error messages display in red 
if ($form_errors[$field]) { 
$form_errors[$field] = '<font color="red">' .  
$form_errors[$field] . '</font><br>'; 
// is this message a reply 
if ($parent_id = intval($_REQUEST['parent_id'])) { 
// send the parent_id along when the form is submitted 
$parent_field =  
sprintf('<input type="hidden" name="parent_id" value="%d">', 
$parent_id); 
// if no subject's been passed in, use the subject of the parent 
if (! $subject) { 
$parent_subject = $dbh->getOne('SELECT subject FROM pc_message 
WHERE id = ?',array($parent_id)); 
/* prefix 'Re: ' to the parent subject if it exists and 
doesn't already have a 'Re:' */ 
$subject = htmlspecialchars($parent_subject); 
if ($parent_subject && (! 
preg_match('/^re:/i',$parent_subject))) { 
$subject = "Re: $subject"; 
// display the posting form, with errors and default values 
print<<<_HTML_ 
<form method="post" action="$_SERVER[PHP_SELF]"> 
<table> 
<tr> 
<td>Your Name:</td> 
<td>$form_errors[author]<input type="text" name="author" value="$author"> 
</td> 
<tr> 
<td>Subject:</td> 
<td>$form_errors[subject]<input type="text" name="subject" 
value="$subject"> 
</td> 
<tr> 
<td>Message:</td> 
<td>$form_errors[body]<textarea rows="4" cols="30" wrap="physical"  
name="body">$body</textarea> 
</td> 
<tr><td colspan="2"><input type="submit" value="Post Message"></td></tr> 
</table> 
$parent_field 
<input type="hidden" name="cmd" value="save"> 
</form> 
_HTML_; 
// pc_message_validate() makes sure something is entered in each field 
function pc_message_validate() { 
global $form_errors; 
$form_errors = array(); 
if (! $_REQUEST['author']) { 
$form_errors['author'] = 'Please enter your name.'; 
if (! $_REQUEST['subject']) { 
$form_errors['subject'] = 'Please enter a message subject.'; 
if (! $_REQUEST['body']) { 
$form_errors['body'] = 'Please enter a message body.'; 
if (count($form_errors)) { 
return false; 
} else { 
return true; 
To properly handle concurrent usage, 
pc_message_save( )
needs exclusive access to the 
msg
table between the time it starts calculating the 
thread_pos
of the new message and 
when it actually inserts the new message into the database. We've used MySQL's 
LOCK 
TABLE
and 
UNLOCK TABLES
commands to accomplish this. With other databases, the syntax 
may vary, or you may need to start a transaction at the beginning of the function and commit 
the transaction at the end.  
The 
level
field can be used when displaying messages to limit what you retrieve from the 
database. If discussion threads become very deep, this can help prevent your pages from 
growing too large. For example, here's how to display just the first message in each thread 
and any replies to that first message:  
$sth = $dbh->query( 
"SELECT * FROM msg WHERE level <= 1 ORDER BY thread_id,thread_pos"); 
while ($row = $sth->fetchRow()) { 
// display each message 
If you're interested in having a discussion group on your web site, you may want to use one of 
the existing PHP message board packages. The most popular is Phorum 
(http://www.phorum.org/
), and there are a number of others listed at 
http://www.zend.com/apps.php?CID=261
Chapter 11. Web Automation 
Section 11.1.  Introduction
Recipe 11.2.  Fetching a URL with the GET Method
Recipe 11.3.  Fetching a URL with the POST Method
Recipe 11.4.  Fetching a URL with Cookies
Recipe 11.5.  Fetching a URL with Headers
Recipe 11.6.  Fetching an HTTPS URL
Recipe 11.7.  Debugging the Raw HTTP Exchange
Recipe 11.8.  Marking Up a Web Page
Recipe 11.9.  Extracting Links from an HTML File
Recipe 11.10.  Converting ASCII to HTML
Recipe 11.11.  Converting HTML to ASCII
Recipe 11.12.  Removing HTML and PHP Tags
Recipe 11.13.  Using Smarty Templates
Recipe 11.14.  Parsing a Web Server Log File
Recipe 11.15.  Program: Finding Stale Links
Recipe 11.16.  Program: Finding Fresh Links
Documents you may be interested
Documents you may be interested