100% found this document useful (16 votes)
144 views

PDF PHP for the Web 3rd Edition Larry Ullman download

Ullman

Uploaded by

laslosycksvy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (16 votes)
144 views

PDF PHP for the Web 3rd Edition Larry Ullman download

Ullman

Uploaded by

laslosycksvy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Download the full version of the ebook at ebookname.

com

PHP for the Web 3rd Edition Larry Ullman

https://ebookname.com/product/php-for-the-web-3rd-edition-
larry-ullman/

OR CLICK BUTTON

DOWNLOAD EBOOK

Download more ebook instantly today at https://ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

PHP Fast Easy Web Development 1st Edition Matt Telles

https://ebookname.com/product/php-fast-easy-web-development-1st-
edition-matt-telles/

ebookname.com

Web Programming for Business PHP Object Oriented


Programming with Oracle 1st Edition David Paper

https://ebookname.com/product/web-programming-for-business-php-object-
oriented-programming-with-oracle-1st-edition-david-paper/

ebookname.com

Beginning PHP Apache MySQL web development Michael K.


Glass

https://ebookname.com/product/beginning-php-apache-mysql-web-
development-michael-k-glass/

ebookname.com

The Enemy at the Gate Andrew Wheatcroft

https://ebookname.com/product/the-enemy-at-the-gate-andrew-wheatcroft/

ebookname.com
Exploratory Data Analysis with MATLAB Second Edition
Chapman Hall CRC Computer Science Data Analysis Wendy L.
Martinez
https://ebookname.com/product/exploratory-data-analysis-with-matlab-
second-edition-chapman-hall-crc-computer-science-data-analysis-wendy-
l-martinez/
ebookname.com

The Spitfire Story 2Rev Ed Edition Alfred Price

https://ebookname.com/product/the-spitfire-story-2rev-ed-edition-
alfred-price/

ebookname.com

Spinoza and German idealism First Paperback Edition


Förster

https://ebookname.com/product/spinoza-and-german-idealism-first-
paperback-edition-forster/

ebookname.com

Teacher Leadership and Behaviour Management 1st Edition Dr


Bill Rogers

https://ebookname.com/product/teacher-leadership-and-behaviour-
management-1st-edition-dr-bill-rogers/

ebookname.com

More Than Mayor or Manager Campaigns to Change Form of


Government in America s Large Cities 1st Edition James H.
Svara
https://ebookname.com/product/more-than-mayor-or-manager-campaigns-to-
change-form-of-government-in-america-s-large-cities-1st-edition-james-
h-svara/
ebookname.com
Handling Peer Pressure Character Education 1st Edition
Kate Stevenson Clark

https://ebookname.com/product/handling-peer-pressure-character-
education-1st-edition-kate-stevenson-clark/

ebookname.com
VISUAL QUICKstart GUIDE

php
for THE Web
Third Edition

Larry Ullman

Peachpit Press
Visual QuickStart Guide
PHP for the Web, Third Edition
Larry Ullman

Peachpit Press
1249 Eighth Street
Berkeley, CA 94710
510/524-2178
510/524-2221 ( fax)
Find us on the Web at www.peachpit.com.
To report errors, please send a note to errata@peachpit.com.
Peachpit Press is a division of Pearson Education.
Copyright © 2009 by Larry Ullman
Editor: Rebecca Gulick
Copy Editor: Bob Campbell
Production Coordinator: Myrna Vladic
Compositor: Debbie Roberti
Indexer: Julie Bess
Cover design: Peachpit Press

Notice of Rights
All rights reserved. No part of this book may be reproduced or transmitted in any form by any means, electronic,
mechanical, photocopying, recording, or otherwise, without the prior written permission of the publisher. For
information on getting permission for reprints and excerpts, contact permissions@peachpit.com.

Notice of Liability
The information in this book is distributed on an “As Is” basis, without warranty. While every precaution has
been taken in the preparation of the book, neither the author nor Peachpit Press shall have any liability to any
person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the
instructions contained in this book or by the computer software and hardware products described in it.

Trademarks
Visual QuickStart Guide is a registered trademark of Peachpit Press, a division of Pearson Education. Macintosh
and Mac OS X are registered trademarks of Apple Computer, Inc. Microsoft and Windows are registered
trademarks of Microsoft Corp. Other product names used in this book may be trademarks of their own
respective owners. Images of Web sites in this book are copyrighted by the original holders and are used with
their kind permission. This book is not officially endorsed by nor affiliated with any of the above companies.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as
trademarks. Where those designations appear in this book, and Peachpit was aware of a trademark claim,
the designations appear as requested by the owner of the trademark. All other product names and services
identified throughout this book are used in editorial fashion only and for the benefit of such companies with
no intention of infringement of the trademark. No such use, or the use of any trade name, is intended to
convey endorsement or other affiliation with this book.
ISBN 13: 978-0-321-44249-9
ISBN 10: 0-321-44249-0
987654321
Printed and bound in the United States of America
For Jessica, Gina, and Rich,
with gratitude for all of their
love and support.
Special thanks
Many, many thanks to everyone at Peachpit
Press for their assistance and hard work,
especially:
The best darn editor in the world, Rebecca
Gulick. Thanks for, well, just about every-
thing. As always, it’s my pleasure to be able
to work with you.
Bob Campbell, for his attention to detail.
Deb Roberti and Myrna Vladic, who take a
bunch of disparate stuff and turn it into a
book. Julie Bess for her excellent indexing.
Everyone at Peachpit for doing what’s
required to create, publish, distribute,
market, sell, and support these books.
My sincerest thanks to the readers of the
other editions of this book and my other
books. Thanks for your feedback and
support and for keeping me in business.
Finally, thanks to: Rasmus Lerdorf (who got
the PHP ball rolling); the people at PHP.net
and Zend.com; those who frequent the vari-
ous newsgroups and mailing lists; and the
greater PHP and open source communities
for developing, improving upon, and support-
ing such wonderfully useful technology.
Table of Contents
Introduction ix
Chapter 1: Getting Started with PHP 1
Basic XHTML Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Basic PHP Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Testing Your Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Sending Text to the Browser . . . . . . . . . . . . . . . . . . . . . 16

Table of Contents
Sending HTML to the Browser. . . . . . . . . . . . . . . . . . . 20
Using White Space. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Adding Comments to Scripts. . . . . . . . . . . . . . . . . . . . 25
Basic Debugging Steps. . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Chapter 2: Variables 31
What Are Variables?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Variable Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Types of Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Assigning Values to Variables . . . . . . . . . . . . . . . . . . . . 41
Understanding Quotation Marks. . . . . . . . . . . . . . . . . 44

Chapter 3: HTML Forms and PHP 47


Creating a Simple Form. . . . . . . . . . . . . . . . . . . . . . . . . . 48
Using GET or POST. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Receiving Form Data in PHP. . . . . . . . . . . . . . . . . . . . . 54
Displaying Errors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Error Reporting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Manually Sending Data to a Page. . . . . . . . . . . . . . . . . 65

Chapter 4: Using Numbers 71


Creating the Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Performing Arithmetic. . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Formatting Numbers. . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Understanding Precedence . . . . . . . . . . . . . . . . . . . . . . 82
Incrementing and Decrementing a Number. . . . . . 84
Creating Random Numbers. . . . . . . . . . . . . . . . . . . . . . 86

v
Table of Contents

Chapter 5: Using Strings 89


Creating the HTML Form. . . . . . . . . . . . . . . . . . . . . . . . 90
Connecting Strings (Concatenation) . . . . . . . . . . . . . 93
Handling Newlines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
HTML and PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Encoding and Decoding Strings. . . . . . . . . . . . . . . . 103
Finding Substrings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Replacing Parts of a String . . . . . . . . . . . . . . . . . . . . . 112

Chapter 6: Control Structures 115


Creating the HTML Form. . . . . . . . . . . . . . . . . . . . . . 116
The if Conditional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Validation Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Using else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
More Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Using elseif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Table of Contents

The Switch Conditional. . . . . . . . . . . . . . . . . . . . . . . . 142


The for Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Chapter 7: Using Arrays 151


What Is an Array?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Creating an Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Adding Items to an Array . . . . . . . . . . . . . . . . . . . . . . 158
Accessing Array Elements. . . . . . . . . . . . . . . . . . . . . . 161
Creating Multidimensional Arrays. . . . . . . . . . . . . . 165
Sorting Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Transforming Between Strings and Arrays. . . . . . 174
Creating an Array from a Form. . . . . . . . . . . . . . . . . 179

Chapter 8: Creating Web Applications 185


Creating Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Using External Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Using Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Working with the Date and Time. . . . . . . . . . . . . . . 205
Handling HTML Forms with PHP, Revisited . . . . 208
Making Forms Sticky. . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Sending Email. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Output Buffering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Manipulating HTTP Headers. . . . . . . . . . . . . . . . . . . 231

vi
Table of Contents

Chapter 9: Cookies and Sessions 237


What Are Cookies? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Creating Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Reading from Cookies. . . . . . . . . . . . . . . . . . . . . . . . . . 248
Adding Parameters to a Cookie . . . . . . . . . . . . . . . . 254
Deleting a Cookie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
What Are Sessions?. . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Creating a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Accessing Session Variables. . . . . . . . . . . . . . . . . . . . 267
Deleting a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

Chapter 10: Creating Functions 271


Creating and Using Simple Functions . . . . . . . . . . 272
Creating and Calling Functions
That Take Arguments. . . . . . . . . . . . . . . . . . . . . . 279
Setting Default Argument Values. . . . . . . . . . . . . . . 283

Table of Contents
Creating and Using Functions That
Return a Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Understanding Variable Scope. . . . . . . . . . . . . . . . . 291

Chapter 11: Files and Directories 297


File Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Writing to Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Locking Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Reading from Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Handling File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . 317
Navigating Directories. . . . . . . . . . . . . . . . . . . . . . . . . 325
Creating Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Reading Files Incrementally. . . . . . . . . . . . . . . . . . . . 339

Chapter 12: Intro to Databases 345


Introduction to SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Connecting to MySQL . . . . . . . . . . . . . . . . . . . . . . . . . 348
MySQL Error Handling. . . . . . . . . . . . . . . . . . . . . . . . . 352
Creating and Selecting a Database . . . . . . . . . . . . . 355
Creating a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Inserting Data into a Database. . . . . . . . . . . . . . . . . 363
Securing Query Data. . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Retrieving Data from a Database. . . . . . . . . . . . . . . 371
Deleting Data in a Database. . . . . . . . . . . . . . . . . . . . 377
Updating Data in a Database. . . . . . . . . . . . . . . . . . . 383

vii
Table of Contents

Chapter 13: Regular Expressions 391


What Are Regular Expressions?. . . . . . . . . . . . . . . . 392
Matching Patterns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Using Literals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Using Metacharacters. . . . . . . . . . . . . . . . . . . . . . . . . . 400
Using Quantifiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Using Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Matching and Replacing Patterns. . . . . . . . . . . . . . 406

Appendix A: Installation and Configuration 411


Installation on Windows. . . . . . . . . . . . . . . . . . . . . . . 412
Installation on Mac OS X. . . . . . . . . . . . . . . . . . . . . . . 415
Using the MySQL Client. . . . . . . . . . . . . . . . . . . . . . . . 419
Creating MySQL Users. . . . . . . . . . . . . . . . . . . . . . . . . 422
PHP Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

Appendix B: Resources and Next Steps 431


Table of Contents

Online PHP Resources. . . . . . . . . . . . . . . . . . . . . . . . . 432


Database Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Top Ten Frequently Asked
Questions (or Problems). . . . . . . . . . . . . . . . . . . 436
Next Steps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442

Index 445

viii
Introduction
i
When I began the first edition of this book,

Introduction
back in the year 2000, PHP was a little-known
open source project. It was adored by techni-
cal people in the know but not yet recognized
as the popular choice for Web development
that it is today. When I taught myself PHP,
very little documentation was available on
the language—and that was my motivation
for writing this book in the first place.
Today things are different. The Internet has
gone through a boom and a bust and has
righted itself. Furthermore, PHP is now the
reigning king of dynamic Web design tools
and has begun to expand beyond the realm
of Web development. But despite PHP’s
popularity and the increase in available
documentation, sample code, and examples,
a good book discussing the language is still
relevant. Particularly as PHP makes its sixth
major release, a book such as this—which
teaches the language in simple but practical
terms—can be your best guide in learning the
information you need to know.
This book will teach you PHP, providing
both a solid understanding of the fundamen-
tals and a sense of where to look for more
advanced information. Although it isn’t a
comprehensive programming reference,
through demonstrations and real-world
examples, this book provides the knowledge
you need to begin building dynamic Web
sites and Web applications using PHP.

ix
Introduction

What Is PHP?
PHP originally stood for Personal Home
Page. It was created in 1994 by Rasmus
Lerdorf to track the visitors to his online
résumé. As its usefulness and capabilities
grew (and as it began to be utilized in more
professional situations), PHP came to mean
PHP: Hypertext Preprocessor. (The defini-
tion basically means that PHP handles data
before it becomes HTML—which stands
for Hypertext Markup Language.) Figure i.1 At the time of this writing, this is the
appearance of the official PHP Web site, located at
According to the official PHP Web site, found www.php.net. Naturally, this should be the first place
at www.php.net (Figure i.1), PHP is an HTML you look to address most of your PHP questions
What Is PHP?

embedded scripting language. I’ll explain this and curiosities.


definition in more detail.
To say that PHP is HTML embedded means
that it can be written within your HTML
code—HTML being the code with which all
Web pages are built. Therefore, programming
with PHP starts off as only slightly more com-
plicated than hand-coding HTML.
Also, PHP is a scripting language, as opposed
to a programming language. This means that
PHP is designed to do something only after
an event occurs—for example, when a user
submits a form or goes to a URL (Uniform
Resource Locator—the technical term for
a Web address). Conversely, programming
languages such as Java and C can be used to
write stand-alone applications, which may or
may not involve the Web. The most popular
example of a scripting language is JavaScript,
which commonly handles events that occur
within the Web browser. Another way to refer
to the different types of languages is to use
the term interpreted for languages such as
PHP and JavaScript, which can’t act on their
own, and compiled for those like C and Java,
which can.

x
Introduction

You should also understand that PHP is a


server-side technology. This refers to the
fact that everything PHP does occurs on the
server (as opposed to on the client, which is
the computer being used by the person view-
ing the Web site). A server is just a computer
set up to provide the pages you see when you
go to a Web address with your browser ( for
example, Firefox, Microsoft Internet Explorer,
or Safari). I’ll discuss this process in more
detail later (see “How PHP Works”).
Finally, PHP is cross-platform, meaning
that it can be used on machines running
Unix, Windows, Macintosh, and other oper-

What Is PHP?
ating systems. Again, we’re talking about the
server’s operating system, not the client’s.
Not only can PHP run on almost any operat-
What PHP Is Not ing system, but, unlike most other program-
The thing about PHP that confuses ming languages, it enables you to switch your
most new learners is what PHP can’t do. work from one platform to another with few
Although you can use the language for an or no modifications.
amazing array of tasks, its main limitation At the time this book was written, PHP
is that PHP cannot be used for client-side was simultaneously in versions 4.4.9 and
features found in some Web sites. 5.2.6. (The 5.x branch has not yet been
Using a client-side technology like universally adapted, so the older version is
JavaScript, you can create a new browser still being maintained for any major security
window, add mouseovers, make pop-up concerns.) This book was actually tested
alerts, resize the browser window, find using a development version of PHP 6, the
out the screen size on the user’s machine, next major release of the language (it’s release
and dynamically generate and alter forms. date is not known at the time of this writ-
None of these tasks can be accomplished ing). The primary change in PHP 6—and it’s a
using PHP (because PHP is server-side, big one—is support for Unicode. Unicode, in
whereas those are client-side issues). But, short, provides a way to represent every char-
you can use PHP to create JavaScript, just acter from every language. Thus, in PHP 6,
as you can use PHP to create HTML. you can handle strings in any language; even
variable and function names can be written
When it comes time to develop your own in any language.
PHP projects, remember that you can
only use PHP to send information (HTML
and such) to the Web browser. You can’t
do anything else within the Web browser
until another request from the server has
been made (a form has been submitted or
a link has been clicked).

xi
Introduction

The other significant change in PHP 6 is the


removal of several outdated features. Every
removed feature has been disabled in PHP’s
default configuration for some time, and
although you could enable it, the recommen-
dation was not to use it at all. In PHP 6, you
won’t have the choice.
Although this book was written using a
development version of PHP 6, all of the code
is backward compatible, at least to PHP ver-
sion 5.x, if not to 4.x. In a couple of situations
where you might still have and be using a Figure i.2 This is the home page of Zend, creators
of the programming at the heart of PHP. The site
feature that will be removed in PHP 6, a note contains much useful software as well as a code
in a sidebar or a tip will indicate how you can gallery and well-written tutorials.
What Is PHP?

adjust the code accordingly.


More information can be found at PHP.net
and www.zend.com, the minds behind the core
of PHP (Figure i.2).

xii
Introduction

Why Use PHP?


Put simply, PHP is better, faster, and easier
to learn than the alternatives. All Web sites
must begin with just HTML, so you can
create an entire site using a number of static
HTML pages. But basic HTML is a limited
approach that does not allow for flexibility
or responsiveness. Visitors accessing HTML
pages see simple pages with no level of cus-
tomization or dynamic behavior. With PHP,
you can create exciting and original pages
based on whatever factors you want to con-
sider. PHP can also interact with databases

Why Use PHP?


and files, handle email, and do many other
things that HTML can’t.
Webmasters learned a long time ago that
HTML alone won’t produce enticing and last-
ing Web sites. Toward this end, server-side
technologies such as PHP have become the
norm. These technologies allow Web-page
designers to create Web applications that are
dynamically generated, taking into account
whichever elements the programmer desires.
Often database-driven, these advanced sites
can be updated and maintained more readily
than static HTML pages.
When it comes to choosing a server-side
technology, the primary alternatives to PHP
are CGI scripts (Common Gateway Interface,
commonly, but not necessarily written in
Perl), ASP.NET (Active Server Pages), Adobe’s
ColdFusion, JSP (JavaServer Pages), and Ruby
on Rails. JavaScript isn’t truly an alternative
to PHP (or vice versa) because JavaScript is
a client-side technology and can’t be used
to create HTML pages the same way PHP or
these others can.

xiii
Introduction

So the question is, why should a Web


designer use PHP instead of CGI, ASP.NET,
JSP, or whatever to make a dynamic Web site?
 PHP is much easier to learn and use.
People—perhaps like you—without
any formal programming training can
write PHP scripts with ease after reading
this one book. In comparison, ASP.NET
requires an understanding of VBScript,
C#, or another language; and CGI requires
Perl (or C). These are more complete
languages and are much more difficult
to learn.
Why Use PHP?

 PHP was written specifically for


dynamic Web page creation. Perl (and Figure i.3 Netcraft’s (www.netcraft.com) graphic
shows PHP’s phenomenal growth since 2000.
VBScript and Java) were not, and this fact
suggests that, by its very intent, PHP can
do certain tasks faster and more easily
than the alternatives. I’d like to make it
clear, however, that although I’m suggest-
ing PHP is better for certain things (specifi-
cally those it was created to do), PHP isn’t a
better programming language than Java or
Perl—they can do things PHP can’t.
 PHP is both free and cross-platform.
So, you can learn and use it on nearly any
computer and incur no cost. Furthermore,
its open source nature means that PHP’s
users are driving its development, not
some corporate entity.
 PHP is the most popular tool available
for developing dynamic Web sites. At
the time of this writing, PHP is in use on
over 20 million domain names (Figure i.3).
By mastering this technology, you’ll pro-
vide yourself with either a usable hobby
or a lucrative skill.

xiv
Introduction

How PHP Works


PHP is a server-side language, which means
the code you write in PHP resides on a host
computer that serves Web pages to Web
browsers. When you go to a Web site (www.
DMCinsights.com, for example), your Internet
service provider (ISP) directs your request to
the server that holds the www.DMCinsights.
com information. The server reads the PHP
code and processes it according to its
scripted directions. In this example, the PHP
code tells the server to send the appropriate
Web page data to your browser in the form of

How PHP Works


HTML (Figure i.4). In short, PHP creates an
HTML page on the fly based on parameters
of your choosing.

Figure i.4 This graphic demonstrates (albeit in very simplistic terms) how the process works between a client, the
server, and a PHP module (an application added to the server to increase its functionality) to send HTML back to the
browser. All server-side technologies use a third-party module on the server to process the data that’s sent back to
the client.

xv
Introduction

This differs from an HTML-generated site


in that when a request is made, the server
merely sends the HTML data to the Web
browser—no server-side interpretation
occurs (Figure i.5). Hence, to the end user’s
browser, there may or may not be an obvi-
ous difference between what home.html and
home.php look like, but how you arrive at that
point is critically altered. The major differ-
ence is that by using PHP, you can have the
server dynamically generate the HTML code.
For example, different information could
be presented if it’s Monday as opposed to
Tuesday or if the user has visited the page
How PHP Works

before. Dynamic Web page creation sets


apart the less appealing, static sites from the
more interesting and, therefore, more visited,
interactive ones.
The central difference between using PHP
and using straight HTML is that PHP does
everything on the server and then sends the
appropriate information to the browser. This
book covers how to use PHP to send the right
data to the browser.

Figure i.5 Compare this direct relationship of how a server works with basic HTML to that of Figure i.4. This is also
why HTML pages can be viewed in your browser from your own computer—they don’t need to be “served,” but
dynamically generated pages need to be accessed through a server that handles the processing.

xvi
Introduction

What You’ll Need


The most important requirement for working
with PHP—because it’s a server-side scripting
language—is access to a PHP-enabled server.
Considering PHP’s popularity, your ISP or Web
host most likely has this option available to
you on their servers. You’ll need to contact
them to see what technology they support.
Your other option is to install PHP and a
Web server application (like Apache) on your
own computer. Users of Windows, Mac OS
Figure i.6 The popular Dreamweaver IDE supports X, or Linux can easily install and use PHP

What You’ll Need


PHP development, among other server-side for no cost. Directions for installing PHP are
technologies. available in Appendix A, “Installation and
Configuration.” If you’re up to the task of
using your own PHP-installed server, you can
take some consolation in knowing that PHP
is available for free from the PHP Web site
(www.php.net) and comes in easy-to-install
packages. If you take this approach, and I
recommend that you do, then your computer
will act as both the client and the server.
The second requirement is almost a
given: You must have a text editor on your
computer. Crimson Editor, WordPad,
TextWrangler, and similar freeware applica-
tions are all sufficient for your purposes; and
BBEdit, EditPad, TextMate, and other com-
mercial applications offer more features that
you may appreciate. If you’re accustomed to
using a graphical interface (also referred to as
WYSIWYG—What You See Is What You Get)
like Adobe Dreamweaver (Figure i.6), you
can consult that application’s manual to see
how to program within it. For help in finding
a good PHP-capable editor, head to http://
www.dmcinsights.com/links/1.

xvii
Introduction

Third, you need a method of getting the


scripts you write in your text editor to the
server. If you’ve installed PHP on your own
computer, you can save the scripts to the
appropriate directory. However, if you’re
using a remote server with your ISP or
Web host, you’ll need an FTP (File Transfer
Protocol) program to send the script to
the server. There are plenty of FTP appli-
cations available; in Chapter 1, “Getting
Started with PHP,” I use the free FileZilla
(www.filezilla-project.org, Figure i.7)
for an example.
What You’ll Need

Finally, if you want to follow the examples Figure i.7 The FileZilla application can be used on
in Chapter 12, “Introduction to Databases,” many different operating systems to move PHP
scripts and other files to a remote server.
you need access to MySQL (www.mysql.com,
Figure i.8) or another database application.
MySQL is available in a free version that you
can install on your own computer.
This book assumes only a basic knowledge
of HTML, although the more comfortable
you are handling raw HTML code without
the aid of a Web-creation application such
as Dreamweaver, the easier the transition to
using PHP will be. Every programmer will
eventually turn to an HTML reference at
some time or other, regardless of how much
you know, so I encourage you to keep a good
HTML book by your side. One such introduc-
tion to HTML coding is Elizabeth Castro’s Figure i.8 MySQL’s Web site (at the time of this writing).
HTML for the World Wide Web with XHTML
and CSS: Visual QuickStart Guide (Peachpit
Press, 2002).
Previous programming experience is cer-
tainly not required. However, it may expedite
your learning, because you’ll quickly see
numerous similarities between, for example,
Perl and PHP or JavaScript and PHP.

xviii
Introduction

Script i.1 A sample PHP script, with line numbers and


bold emphasis on a specific section of code. About This Book
This book attempts to convey the fundamen-
1 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML tals of programming with PHP while hinting
1.0 Transitional//EN” at some of the more advanced features you
2 “http://www.w3.org/TR/xhtml1/DTD/ may want to consider in the future, without
xhtml1-transitional.dtd”> going into overwhelming detail. It uses the
3 <html xmlns=”http://www.w3.org/1999/ following conventions to do so.
xhtml” xml:lang=”en” lang=”en”>
4 <head> The step-by-step instructions indicate what
5 <meta http-equiv=”Content-Type” coding you’re to add to your scripts and
content=”text/html; charset=utf-8”/> where. The specific text you should type is
6 <title>Hello, World!</title> printed in a unique type style to separate it
7 </head> from the main body text. For example:

About This Book


8 <body>
<?php print “Hello, World!”; ?>
9 <?php print “Hello, World!”; ?>
10 </body> The PHP code is also written as its own
11 </html> complete script and is numbered by line for
reference (Script i.1). You shouldn’t insert
these numbers yourself, because doing so will
render your work inoperable. I recommend
using a text editor that automatically displays
the line numbers for you—the numbers will
What’s New in This Book? help when you’re debugging your work. In the
scripts you’ll sometimes see particular lines
I would consider this third edition to be a highlighted in bold, in order to draw atten-
relatively light revision of an already solid tion to new or relevant material.
book. When the second edition was writ-
ten, PHP was at version 4.x, with version
5 in development. Now version 5 is out
and version 6 is in development. The most
significant changes in PHP 5 affect more
advanced topics than are covered here.
The most significant changes in PHP 6 are
support for Unicode and the removal of
some features.
With that in mind, the first wave of altera-
tions in this edition are the removal of a
few topics that no longer apply to PHP
6. Second, I updated all the examples
to make use of Unicode and the UTF-8
encoding (if you don’t know what this
means, see Chapter 1). Third, I tweaked
some of the examples mostly to satisfy my
own drive for perfection.

xix
Introduction

Because of the nature of how PHP works, you


need to understand that there are essentially
three views of every script: the PHP code (e.g.,
Script i.1), the code that’s sent to the browser
(primarily HTML), and what the browser
Figure i.9 This is a sample view
displays to the end user. Where appropri-
you’ll see of the browser window.
ate, sections of or all of the browser window For the purposes of this book, it
are revealed, showing the end result of the won’t make any difference which
exercise (Figure i.9). Occasionally, you’ll also Web browser or operating system
you use.
see an image displaying the HTML source
that the browser received (Figure i.10). You
can normally access this view by choosing
View Source or View Page Source from the
appropriate Web browser menu. To sum-
About This Book

marize, Figure i.10 displays the HTML the


browser receives, and Figure i.9 demonstrates
how the browser interprets that HTML.
Using PHP, you’ll create the HTML that’s sent
to the browser.
Because the column in this book is nar-
rower than the common text editor screen,
sometimes lines of PHP code printed in the
steps have to be broken where they would
not otherwise break in your editor. A small
gray arrow indicates when this kind of break
occurs. For example:
print “This is going to be a longer line
 of code.”;

Figure i.10 By viewing the source code received by the Web browser, you can see the HTML created
by PHP and sent by the server.

xx
Introduction

You should continue to use one line in your


scripts, or else you’ll encounter errors when
executing. (The gray arrow isn’t used in
scripts that are numbered.)
While demonstrating new features and tech-
niques, I’ll do my best to explain the why’s
and how’s of them as I go. Between reading
about and using a function, you should clearly
comprehend it. Should something remain
confusing, though, this book contains a num-
ber of references where you can find answers
to any questions (see Appendix B, “Resources
and Next Steps”). If you’re confused by a

About This Book


particular function or example, your best bet
will be to check the online PHP manual or
the book’s supporting Web site (and its user
support forum).

Which Book Is Right for You?


This is the third edition of my first book on
PHP. Like the original, it’s written with the
beginner or nonprogrammer in mind. If
you have little or no programming experi-
ence, prefer a gentler pace, or like to learn
things in bite-sized pieces, this is the book
for you. Make no mistake: This book covers
what you need to know to begin develop
dynamic Web sites (while using practical
examples), but it does so without any in-
depth theory or advanced applications.
Conversely, if you pick up new technolo-
gies really quickly or already have some
experience developing Web sites, you may
find this to be too basic. In that case, you
should consider my PHP 6 and MySQL 5
for Dynamic Web Sites: Visual QuickPro
Guide instead (Peachpit Press, 2008).
It discusses SQL and MySQL in much
greater detail and goes through several
more complex examples, but it does so at
a quick jog.

xxi
Introduction

Companion Web Site


While you’re reading this book, you may
also find it helpful to visit the PHP for the
World Wide Web: Visual QuickStart Guide,
3rd Edition Web site, located at www.
DMCinsights.com/phpvqs3/ (Figure i.11).
There you’ll find every script in this book
available in a downloadable form. (However,
I strongly encourage you to type the scripts
yourself in order to become more familiar
with the structure and syntax of PHP.) Figure i.11 The book’s associated Web site.
Companion Web Site

The site also includes a more detailed refer-


ence section with links to numerous useful
Web pages where you can continue learning
PHP. In addition, the site provides an errata
section listing any mistakes made in this text.
What many users find most helpful, though,
is the book’s supporting forum, found
through the Web site or directly at www. Figure i.12 If you need more assistance, use the
DMCInsights.com/phorum/list.php?23 book’s supporting forum, where readers and I post
(Figure i.12). Using the forum, you can: problems and solutions.

 Find answers to problems you’re having


 Receive advice on how to approach an
idea you have
 Get debugging help from other readers
 See how changes in the technologies have
affected the examples in the book
 Learn what other people are doing
with PHP
 See a faster reply from me than if you send
me a direct email

xxii
Introduction

Questions, comments, or
suggestions?
If you have a PHP-specific question, there
are newsgroups, mailing lists, and question-
and-answer sections available on PHP-
related Web sites for you to turn to. These
are discussed in more detail in Appendix B.
Browsing through these references or search-
ing the Internet will almost always provide
you with the fastest answer.
You can also direct your questions, com-

Companion Web Site


ments, and suggestions to me. You’ll get the
fastest reply using the book’s corresponding
forum (I always answer those questions first).
If you’d rather email me, my contact informa-
tion is available on the Web site. I do try to
answer every email I receive, but it will prob-
ably take a couple of weeks (whereas you’ll
How to Ask Questions
likely get a reply in the forum within a couple
the Smart Way of days).
Whether you’re posting a message to the For more tips and an enlightening read,
book’s supporting forum, sending me an see Eric Steven Raymond’s “How to Ask
email, or asking a question in a news- Questions the Smart Way” at www.catb.
group, knowing how to most effectively org/~esr/faqs/smart-questions.html.
ask a question improves the quality of The 10 minutes you spend on it will save
the response you’ll receive as well as the you hours in the future. Those people who
speed with which you’ll get your answer. will answer your questions, like myself,
To receive the best answer in the shortest will be most appreciative!
amount of time, follow these steps:
1. Search the Internet, read the
manuals, and browse any applicable
documentation.
2. Ask your question in the most appro-
priate forum (newsgroup, mailing list,
and so on).
3. Use a clear and concise subject.
4. Describe your problem in detail, show
any relevant code, say what went
wrong, indicate what version of PHP
you’re using, and state what operating
system you’re running.

xxiii
This page intentionally left blank
Random documents with unrelated
content Scribd suggests to you:
»Kolmasti olen vuoden kuluessa saanut häneltä sanomia», vastasi
Mary. »Kahdessa ensimmäisessä kirjeessään hän puhui ainoastaan
Roger de Condésta, ihmetellen, minkä tähden viimemainittu ei tullut
hänen jäljessään Ranskaan; mutta viimeisessä kirjeessään hän ei
maininnut Roger de Condén nimeä, vaan puhui hänen ja prinssi
Filipin lähestyvästä avioliitosta.»

Molemmat tytöt katselivat Roger de Condén piirteitä tarkasti, mutta


hänen kasvoistaan ei näkynyt merkkiäkään siitä surusta, joka täytti
hänen sydämensä.

»Niin kai on parempi», sanoi hän rauhallisesti. »De Montfortin tytär


voisi tuskin olla onnellinen nimettömän seikkailijan kanssa», lisäsi
hän hieman katkerasti.

»Te teette hänelle vääryyttä», puolusti Mary de Stutevill. »Hän


rakasti teitä, ja jollen erehdy uskoessani tuntevani
lapsuudenystäväni yhtä hyvin kuin itseni, rakastaa hän teitä vieläkin.
Mutta Bertrade de Montfort on ylpeä nainen, ja mitä voitte odottaa,
kun hän ei kokonaiseen vuoteen saa teiltä minkäänlaista tietoa.
Oletteko arvellut, että hän etsisi teidät käsiinsä ja rukoilisi teitä
pelastamaan hänet siitä liitosta, jonka hänen isänsä on solminut
hänen puolestaan?»

»Te ette tiedä», vastasi Roger, »enkä minä saa teille puhua. Mutta
pyydän teitä uskomaan minua, kun sanon, että juuri hänen
mielenrauhansa ja onnensa vuoksi en seurannut häntä Ranskaan.
Mutta keskustellaan muista asioista. Suru on minun, enkä tahdo
tyrkyttää sitä muille. Halusin vain tietää, että hän voi hyvin ja
toivoakseni on onnellinen. Minun ei ole koskaan suotu tehdä
onnelliseksi häntä tai ketään muutakaan naista. Toivoisin, etten olisi
lainkaan sotkeutunut hänen elämäänsä, mutta en tiennyt, mitä tein.
Ja hänen kauneutensa ja hyvyytensä himousvoima kiehtoi minua
voimakkaasti, joten olin heikko enkä jaksanut vastustaa sitä tunnetta,
jota en ollut koskaan ennen eläissäni tuntenut — rakkautta.»

»Teitä ei hevin sovi moittia», myönsi Joan de Tany


hyväntahtoisesti. »Bertrade de Montfort on sellainen kuin mainitsitte,
vieläpä enemmänkin; jo se, että on hänet tuntenut, on siunaus.»

Hänen puhuessaan Norman of Torn ensi kerran katsoi häntä


arvostelevasti ja näki, että Joan de Tany oli kaunis ja että hänen
puhuessaan hänen kasvoillaan välähteli satoja pieniä älykkyyden ja
hyvän luonteen vaihtuvia ilmeitä, jotka tekivät hänet perin
kiehtovaksi. Niin, Joan de Tanya oli hauska katsella, ja Norman of
Tornilla oli rinnassaan haavoittunut sydän, joka kaipasi kärsimysten
lievitystä — parantavaa balsamia vammoilleen ja mustelmilleen.

Ja niinpä kävi, että Tornin henkipatto oli kauan aikaa jokapäiväinen


vieras Richard de Tanyn linnassa ja että miehen ja molempien
naisten tuttavuus kehittyi syväksi ystävyydeksi, uhaten heistä yhteen
nähden muuttua vieläkin enemmäksi.

Kun Norman of Torn ei tuntenut naisten tapoja, näki hän Joan de


Tanyn pienissä teoissa ainoastaan ystävyyttä.. Hänen elämänsä oli
ollut kova ja yksinäinen. Ainoa siihen milloinkaan tunkeutunut kirkas
ja lämmittävä päivänsäde oli ollut hänen ja Bertrade de Montfortin
välinen keskinäinen rakkaus.

Ajatuksissaan hän oli ehdottoman uskollinen sille naiselle, joka,


kuten hän tiesi, ei ollut häntä varten, mutta hän ikävöi kaltaistensa
seuraa, ja niinpä sellaisten kuin Joan de Tanyn ja tämän kauniin
vieraan ystävyys oli hänestä tervetullut. Hän ei uneksinutkaan
kummankaan tuntevan häntä kohtaan mitään lämpimämpää tunnetta
kuin herttaista ystävyyttä, joka oli hänestä yhtä uutta kuin rakkaus —
miten hän olisi osannut erottaa rajan tai aavistaa tietämättömyytensä
hirveitä seurauksia!

Mary de Stutevill näki ja piti miestä vain huikentelevana ja kevyenä


sydämen asioissa — sellaisia, sen hän tiesi, oli paljon. Hän olisi
saattanut varoittaa Rogeria, jos olisi tiennyt, miten asianlaita oikein
oli, mutta nyt hän sensijaan salli kaiken mennä omaa menoaan, vain
yhden ainoan kerran lausuttuaan varoittavan viittauksen Joan de
Tanylle.

»Pidä vaari sydämestäsi, Joan», kehoitti hän, »jotta se ei luisu


sinulta sellaisen miehen haltuun, joka näyttää olevan yhtä kerkeä
rakastumaan kuin unohtamaankin!»

De Tanyn tytär punehtui.

»Osaan täysin hyvin suojella omaa sydäntäni, Mary de Stutevill»,


vakuutti hän lämpimästi. »Jos sinä itse haluat tätä miestä omaksesi,
niin sano toki — älä sen nojalla, että sinun sydämesi hehkuu hänen
läheisyydessään, luule minun sydäntäni yhtä herkäksi!»

Nyt oli Maryn vuoro punastua, ja hänen kielellään pyöri pureva


vastaus, mutta äkkiä hän oivalsi, kuinka naurettava sellainen
hyödytön sanakiista olisi. Sensijaan hän kietoi käsivartensa Joanin
ympärille ja suuteli häntä.

»Minä en häntä rakasta», virkkoi hän, »ja olen hyvilläni siitä, ettet
sinäkään rakasta, sillä tiedän Bertraden rakastavan häntä ja hänen
vain lyhyt vuosi sitten vannoneen kuolematonta rakkautta
Bertradelle. Unohdetaan, että olemme kajonneet tähän asiaan.»
Juuri näihin aikoihin kuninkaan sotilaat hävittelivät kapinallisten
ylimyksien maa-alueita ja kiskoivat raskaita veroja aikaisemmin
samana vuonna Rochesterin luona kärsimänsä kirvelevän tappionsa
kostoksi, joten pienten seurueiden oli tuskin turvallista uskaltautua
maanteille, jolleivät ne mielineet joutua Henrik kolmannen
palkkasoturien käsiin.

Eivät edes läänitysaatelisten vaimot ja tyttäret saaneet rauhaa


kuninkaan puoluelaisten hyökkäyksiltä; eikä ollut lainkaan tavatonta,
että he joutuivat kärsimään vankeutta ja joskus pahempaakin
kuninkaan kannattajani puolelta.

Ja näin levottomana aikana pisti Joan de Tanyn oikulliseen


päähän lähteä ratsastamaan Lontooseen käymään kauppamiesten
myymälöissä.

Vaikka itse Lontoo olikin vankasti paroonien puolella kuningasta


vastaan, väijyi Richard de Tanyn linnan ja Lontoon välisellä tiellä
paljon vaaroja.

»Mutta», huudahti tytön äiti tuskaisesti, »rosvojen,


kuningasmielisten ja Tornin henkipaton joukkojen keskellä et olisi
turvassa, jos sinua saattamassa olisi armeija».

»Mutta koska minulla ei ole armeijaa», tokaisi tyttö nauraen, »olen


siis sinun oman järkeilysi mukaan ihan varmassa turvassa».

Ja kun Roger de Condé koetti suostutella häntä luopumaan


päätöksestään, pilkkasi hän ritaria, väittäen hänen pelkäävän
kohtaavansa Tornin paholaisen, ja kehoitti häntä jäämään kotiin ja
sulkeutumaan turvaan hänen äitinsä ruokasäiliöön.
Koska Joan de Tany oli hemmoteltu lapsi, lähtivät he niin ollen
taivaltamaan Lontooseen, molemmat tytöt ja kymmenkunta
palvelijaa ja soturia; Roger de Condé oli mukana seurueessa.

Samaan aikaan lähetti tuikea, harmaapäinen vanhus


sanansaattajan henkipaton leiristä, tummaihoisen, papiksi
naamioidun miehen, jonka oli määrä mennä Lontooseen ja nähtyään
Joan de Tanyn ja Roger de Condén seurueen ratsastavan
kaupunkiin luovuttaa viemänsä kirje portin vahtipäällikölle.

Kirjeessä oli seuraava lyhyt tiedonanto:

»Kookas, harmaa-asuinen ritari, jolla on suljettu kypäri, on Norman


of
Torn.» Eikä siinä ollut allekirjoitusta.

Kaikki sujui hyvin, ja Joan nauroi hilpeästi niiden henkilöiden


pelolle, jotka olivat estelleet häntä, kun he erään poikkitien kohdalla
näkivät kaksi joukkoa aseistettuja miehiä lähestyvän heitä
vastakkaisilta suunnilta. Lähemmän joukon johtaja kannusti
ratsuaan, ehättäen katkaisemaan pienen seurueen tien, pysähtyi
heidän eteensä ja huusi töykeästi:

»Keitä olette?»

»Olemme rauhallisissa aikeissa matkalla Lontoon myymälöihin»,


vastasi
Norman of Torn.

»En tiedustanut asiaanne», kiljui mies, »vaan sitä, keitä olette.


Vastatkaa ja vastatkaakin nopeasti!»
»Olen Roger de Condé, ranskalainen herrasmies, ja nämä ovat
sisareni ja palvelijoitani», valehteli henkipatto, »ja jollei seurassani
olisi naisia, saisitte vastauksen teräksessä, kuten tomppelimaisen
hävyttömyytenne tähden ansaitsisitte».

»Siihen on yllin kyllin tilaa ja aikaa nytkin, pelkurimainen,


ranskalainen koira», kivahti upseeri, laskien puhuessaan keihäänsä
tanaan.

Joan de Tany istui ratsunsa selässä niin, että hän erotti Roger de
Condén kasvot, ja hänen sydämensä paisui ylpeydestä ja
rohkeudesta, kun hän näki ja ymmärsi sen tyydytyksen hymyn
häiveen, joka levisi Rogerin huulille hänen kuullessaan miehen
taisteluhaasteen ja laskiessaan oman keihäänsä tanaan.

Pyöräytettyään ratsunsa toisiinsa päin hyökkäsivät noin


kolmenkymmenen metrin päässä toisistaan olleet taistelijat täyttä
laukkaa vastakkain. Heidän törmätessään yhteen oli täräys niin
ankara, että molemmat hevoset olivat vähällä kellahtaa kumoon ja
molemmat vankat sotakeihäät pirstoutuivat sadoiksi sirpaleiksi
osuttuaan kumpikin suoraan keskelle vastustajan kilpeä.
Käännettyään sitten ratsunsa ympäri ja viskattuaan syrjään nyt
hyödyttömät keihääntyngät de Condé ja upseeri kävivät
ahdistamaan toisiaan miekoilla.

Mies hyökkäsi toistamiseen perin rajusti de Condéta vastaan,


yrittäen hurjalla sysäyksellä ratsastaa hänet kumoon, mutta hänen
pistonsa luiskahti vahinkoa tekemättä henkipaton säilästä, ja kun
upseeri pyörsi ympäri uudistamaan kamppailua, aloittivat he tuiman
ottelun hevostensa kääntelehtiessä ja pyörähdellessä lapa lapaa
vasten.
Tytöt istuivat jäykkinä satulassa, katsellen ottelua, ja Joan de
Tanyn silmissä hehkui taistelun tuli hänen tarkkaillessaan Roger de
Condén ihmeteltävän miekkailun jokaista liikettä.

Henkipatto ei ollut välittänyt olla edes kyllin varovainen


sulkeakseen kypärinsilmikkoaan, ja hänen huulillaan väikkyvä tuikea
ja ylpeä hymy ilmaisi selvemmin kuin sanat, kuinka perinpohjaisesti
hän halveksi vastustajansa säilää. Ja katsellessaan Joan de Tany
näki hymyn äkkiä tiukkenevan kylmäksi, kovaksi juovaksi ja miehen
silmien soukkenevan pelkiksi raoiksi, ja hänen naisellinen vaistonsa
aavisti kuninkaan upseerin kuolemantuomion, ennenkuin henkipaton
miekka upposi hänen sydämeensä.

Molempien kuningasmielisten soturijoukkioiden muut jäsenet olivat


istuneet kuin lumottuina katsellessaan kamppailua, mutta kun heidän
johtajansa ruumis nyt retkahti pois satulasta, syöksyivät he
vimmaisesti de Condén ja hänen pienen seurueensa kimppuun.

Paroonin palvelijat taistelivat uljaasti, mutta ylivoima oli rusentava,


ja vaikka Norman of Tornin jäntevä käsi oli heidän puolellaan, oli
lopputulos alunperin selvä.

Henkipaton ympärillä välkkyi viisi miekkaa, mutta hänen säilänsä


oli tehtävänsä tasalla, ja yksi toisensa jälkeen herpaantuivat hänen
vastustajansa satulassaan, kun hänen sujahtelevan aseensa kärki
painui heidän sisälmyksiinsä.

Melkein kaikki paroonin miehet olivat kaatuneet, kun eräs heistä,


vanha palvelija, kannusti ratsunsa Joan de Tanyn ja Mary de
Stutevillin luokse.
»Tulkaa, hyvät naiset», huusi hän, »nopeasti! Pääsette ehkä
pakoon.
Heillä on niin paljon puuhaa taistelussa, etteivät he huomaa.»

»Vie lady Mary, John!» käski Joan. »Minä saatoin Roger de


Condén tähän pinteeseeen vastoin kaikkia neuvoja ja minä jään
hänen luoksensa loppuun saakka.»

»Mutta, mylady —» alkoi John.

»Mutta ei mitään, herraseni!» keskeytti tyttö terävästi. »Tee


niinkuin käsketään! Seuraa mylady Marya ja pidä huolta siitä, että
hän saapuu kommelluksitta isäni linnaan!» Ja kohottaen
ratsuraippaansa hän sivalsi Maryn hevosta lautasille, niin että eläin
oli vähällä heittää kauniin kannettavansa selästään ponnahtaessaan
rajusti sivulle, lähtien sitten huimaa vauhtia nelistämään takaisin
samaa tietä, jota he olivat tulleet.

»Perässä, John!» komensi Joan tiukasti. »Äläkä palaa, ennenkuin


hän on turvassa linnan muurien sisällä! Sitten voit tuoda apua.»

Vanhus oli tottunut tottelemaan käskevää pientä lady Joania


tämän varhaisimmasta lapsuudesta saakka, ja se tottumus oli
juurtunut häneen niin voimakkaasti, että hän pyöräytti hevosensa
ympäri ja lähti täyttä laukkaa ratsastamaan lady Mary de Stutevillin
kiitävän ratsun jälkeen.

Kun Joan de Tany uudelleen kääntyi katselemaan taistelua,


ympäröi Roger de Condéta hyvinkin kaksikymmentä miestä, ja
vaikka hän pitelikin pahoin edessään olevia, ei hän voinut torjua
takaapäin ahdistavia hyökkääjiä. Katseleva tyttö näki sotakirveen
tärähtävän hänen kypäriinsä ja miekan heittävän hänen
hervottomista sormistaan, samalla kun hänen eloton ruumiinsa
vierähti sir Mortimerin selästä taistelun temmellyksessä poljetulle
maantielle.

Tyttö liukui vikkelästi ratsunsa selästä ja juoksi pelkäämättä


maahan sortuneen soturin luokse välittämättä ympärillään sekavana
rykelmänä korskuvista ja hyppivistä, terässuojuksisista hevosista ja
sinne tänne liikkuvista sotureista. Ja Norman of Tornille oli onneksi,
että tämä rohkea tyttö oli silloin saapuvilla, sillä juuri kun hän saapui,
kaatuneen vierelle, oli eräs sotilaista tähdännyt miekkansa kärjen
hänen kurkkuunsa survaistakseen loppupiston.

Parahtaen Joan de Tany heittäytyi henkipaton ruumiin päälle


parhaansa mukaan suojellakseen häntä uhkaavalta miekalta.

Äänekkäästi kiroten sotilas tarttui kovakouraisesti hänen


käsivarteensa kiskoakseen hänet pois uhrinsa luota, mutta samassa
ratsasti paikalle upea-asuinen ritari, joka seisahtui seurueen vierelle.

Tulija oli viisiviidettä- tai viisikymmenvuotias, kookas, komea,


mustaviiksinen ja ylpeän röyhkeä, kuten hyvin usein ovat sellaiset
henkilöt, jotka ansaitsematon suosio on korottanut mahtavaan ja
vaikutusvaltaiseen asemaan.

Hän oli John de Fulm, Buckinghamin herttua, syntyperältään


ulkomaalainen; hän oli vuosikausia kuulunut kuninkaan suosikkeihin
ja oli de Montfortin ja paroonien katkerimpia vihollisia.

»Mitä nyt?» tiuskasi hän. »Mitä täällä on tekeillä?»

Sotilaat perääntyivät, ja eräs heistä vastasi:


»Joukko kuninkaan vihollisia karkasi kimppuumme, herra kreivi,
mutta me ajoimme heidät pakoon ja otimme nämä kaksi vankia.»

»Kuka olette?» kysyi kreivi, kääntyen de Condén vierellä polvillaan


olevan Joanin puoleen, ja kun tyttö käänsi kasvonsa ylöspäin,
huudahti hän: »Jumaliste! De Tanyn tytär! Kelpo saalis totisesti,
sotilaat. Entä kuka ritari on?»

»Katsokaa itse, herra kreivi!» kehoitti tyttö, ottaen kaatuneen


päästä kypärin, jonka siteitä hän oli irroittanut.

»Edward!» äänsi mies. »Mutta ei, se on mahdotonta, sillä vasta


eilen erosin Edwardista Doverissa.»

»En tiedä hänestä muuta kuin sen», vastasi Joan de Tany, »että
hän on ihmeteltävin miekankäyttäjä ja uljain mies, mitä minun on
milloinkaan suotu nähdä. Hän nimitti itseään Roger de Condéksi,
mutta en tiedä hänestä mitään paitsi sitä, että — hän näyttää
prinssiltä ja taistelee kuin paholainen. Luultavasti hän on ihan
puolueeton, mylord, ja koska te varmastikaan ette käy sotaa naisia
vastaan, sallinette meidän niin ollen jatkaa rauhassa matkaamme,
jonka sotilaanne aiheettomalla hyökkäyksellään keskeyttivät.»

»De Tanyn suvun jäsen, madam, olisi tärkeä ja arvokas vanki


näinä levottomina aikoina», lausui kreivi, »ja se yksin riittäisi
pakottamaan minut pidättämään teidät; mutta kaunis de Tany on
vieläkin arvokkaampi, ja senvuoksi suon teille ainakin yhden
suosionosoituksen: en vie teitä kuninkaan luokse, vaan saatte olla
vankina minun linnassani, sillä olen yksin ja kaipaan kauniin ja
rakastavan naisen ilahduttavaa seuraa.»
Tytön pää keikahti pystyyn, samalla kun hän katsoi kreiviä suoraan
silmiin.

»Arveletteko, John de Fulm, Buckinghamin kreivi, haastelevanne


jollekulle sievälle keittiöpalvelijattarelle? Unohdatteko, että sukuni on
vanha ja kunnioitettu Englannissa, vaikka se ei olekaan kuninkaan
suosiossa kuten jotkut ulkomaalaiset, ja että te olette velvollinen
osoittamaan kunnioitusta de Tanyn tyttärelle?»

»Kaikki on sodassa oikeutettua, hyvä kaunotar», vastasi kreivi.


»Totisesti», jatkoi hän, »taitaisipa helvetissäkin olla hyvä, jos siellä
kaikki olisivat teidän näköisiänne. En ole nähnyt teitä joihinkuihin
vuosiin enkä tiennyt sen vanhan ketun, Richard de Tanyn,
säilyttävän sellaista aarretta likaisessa, iänikuisessa linnassaan.»

»Ettekö siis suostu päästämään meitä vapaiksi?» tiedusti Joan de


Tany.

»Ei käytetä niin tylyjä sanoja», väitteli kreivi. »Sanokaamme


mieluummin, että päivä on kulunut niin pitkälle ja tiellä vilisee niin
paljon vaaroja, ettei Buckinghamin kreivi voi suostua jättämään
vanhan ystävänsä kaunista tytärtä maantien vaaroille alttiiksi, vaan
—»

»Lopetetaan moiset typerät jaaritukset!» kivahti tyttö. »Minun ei


olisi sopinutkaan odottaa parempaa sinun kaltaiseltasi vaippaansa
kääntäneeltä, ulkomaalaiselta vintiöltä, joka kerran istui mukana de
Montfortin neuvottelupöydässä, mutta sitten kavalsi ystävänsä
suikertautuakseen kuninkaan suosioon.»

Kreivi kalpeni kiukusta ja kallistui eteenpäin ikäänkuin lyödäkseen


tyttöä, mutta malttoi mielensä ja kääntyi erään sotilaan puoleen,
käskien:

»Tuokaa vanki muassanne! Jos mies on hengissä, tuokaa


hänetkin! Haluaisin tarkempia tietoja tästä miekkosesta, jolla on
naamionaan kruununprinssin kasvot.»

Ja käännettyään ratsunsa ympäri hän poistui läheisyydessä


olevaa, kapinallisille kuulunutta linnaa kohti, jonka kuningasmieliset
olivat valloittaneet ja jota de Fulm nyt käytti päämajanaan.
KOLMASTOISTA LUKU

Kun Norman of Torn tuli jälleen tajuihinsa, huomasi hän olevansa


pienessä tornihuoneessa oudossa linnassa. Hänen päätänsä särki
kauheasti, ja hänen ruumiinsa oli kipeä ja hellä; mutta hän kömpi
pois vuoteelta, jolla hän virui, ja pääsi ovelle, tukien huojuvaa
ruumistaan seinää vasten painetuilla käsillään. Pettymyksekseen
hän havaitsi, että se oli lukittu ulkoapäin, eikä hän, heikko kun oli,
yrittänytkään avata sitä voimakeinoilla.

Hänen yllään oli täydet pukimet ja rauta-asu samoin kuin silloin,


kun hänet oli isketty maahan, mutta hänen kypärinsä oli poissa, ja
myöskin hänen miekkansa ja tikarinsa olivat kadonneet.

Päivä oli päättymäisillään, ja kun tuli hämärä ja huone pimeni, kävi


hän yhä kärsimättömämmäksi. Vaikka hän useita kertoja jyskytti
ovea, ei hän saanut vastausta, ja vihdoin hän lakkasi siitä
epätoivoissaan. Mentyään ikkunan ääreen hän näki huoneensa
olevan noin kymmenen metrin korkeudella kivillä lasketusta pihasta.
Siitä näkyi vinoittain vanhan linnan muita ikkunoita, joista alkoi näkyä
valoa. Niiden takana liikkui sotilaita, ja kerran hän luuli erottaneensa
naisen hahmon, mutta ei ollut siitä varma.
Hän aprikoi, miten Joan de Tanyn ja Mary de Stutevillin oli käynyt.
Hän toivoi heidän päässeen pakoon, ja kuitenkin — niin, Joan
varmasti ei ollut päässyt, sillä nyt hän selvästi muisti katseensa
hetkiseksi osuneen tytön silmiin vähäistä ennen kuin isku osui
häneen, ja hän ajatteli, kuinka varmaa luottamusta hän oli siitä
nopeasta katseesta lukenut. Sellainen katse rohkaisisi shakaalin
karkaamaan leijonalauman kimppuun, mietti henkipatto. Kuinka
kaunis olento Joan olikaan! Ja hän oli jäänyt hänen, Normanin,
luokse taistelun ajaksi! Nyt hän muisti: Mary de Stutevill ei ollut
Joanin seurassa silloin, kun heidän katseensa osuivat vastakkain;
niin, Joan oli ihan yksin. Niin! Se oli todellakin ystävyyttä!

Mikä muu muisto koetti tunkeutua hänen järkkyneen ja pettävän


muistinsa kynnyksen ylitse? Sanojako? Rakkauden sanoja? Ja
hänen huulilleen painetut huulet? Ei; sen kaiken täytyi olla vain
hänen vahingoittuneiden aivojensa kuvittelua.

Mikä kilahti hänen rintasuojustaan vasten? Hän tunnusteli ja löysi


metallisen korun, jota silkinhieno hius piti kiinni hänen teräksisen
sotisopansa renkaissa. Hän vei pikku vehkeen ikkunan ääreen ja
näki himmenevässä valossa, että se oli kultainen, jalokiviupotuksilla
somistettu tukkakoru, mutta ei erottanut, oliko pieni, silkinhieno
hiuskihara musta vaiko ruskea. Varovasti hän irroitti helyn, kietoi
ohuen hiuksen sen ympärille ja pisti sen ihokkaansa povelle. Se
vaivasi häntä epämääräisesti, mutta minkä tähden, sitä hän tuskin
olisi osannut itselleen selittää.

Käännyttyään jälleen ikkunaan hän tähyili näkyvissään oleviin


huoneisiin, ja pian hän näki ritarin tulevan läheisen huoneen
suppean ikkuna-aukon kohdalle.
Asustaan päättäen ritari oli korkeassa asemassa oleva mies ja
ilmeisesti keskusteli kiivaasti jonkun henkilön kanssa, jota Norman of
Torn ei nähnyt. Mies, kookas, lihava, mustatukkainen ja
mustaviiksinen ylimys, takoi nyrkillään pöytään antaakseen pontta
sanoilleen ja äkkiä hän kavahti pystyyn ikäänkuin syöksyäkseen sitä
henkilöä kohti, jolle hän puhui. Hän katosi tuokioksi tähyilijän
näkyvistä, ja sitten Norman of Torn näki hänet uudelleen huoneen
toisessa päässä parhaillaan karkeasti käymässä käsiksi naiseen,
joka ilmeisesti koetti päästä karkuun hänen otteestaan. Kun nainen
kääntyi kiusaajaansa päin, kohosi koko Tornin paholaisessa piilevä
paholaisen sisu hänen kipeään päähänsä, sillä hänen näkemänsä
kasvot olivat Joan de Tanyn.

Jupisten kirouksen vanki kääntyi heittäytyäkseen teljettyä ovea


vasten, mutta ennenkuin hän oli ennättänyt harpata ainoatakaan
askelta, sai ulkoa kuuluva raskaiden askelten ääni hänet
pysähtymään; ja kun avainnippu kilisi avainta sovitettaessa oven
lukkoon, hiipi hän hiljaa oviaukon viereen seinustalle, jossa
sisäänpäin kääntyvä ovi piilottaisi hänet.

Kun ovi työnnettiin auki, valaisi lepattava soihtu huonetta, mutta


vain himmeästi, joten tulija näki sängyn olevan tyhjän vasta
edettyään keskelle huonetta.

Hän oli sotilas, ja hänen kupeellaan riippui miekka. Siinä oli kylliksi
Tornin paholaiselle — juuri miekkaa hän eniten kaipasi; ja ennenkuin
mies sai hitaan järkensä tajuamaan, että vuode oli tyhjä, puristuivat
teräksenlujat sormet hänen kurkkuunsa, ja hän nujertui lattialle
henkipaton jättiläisruhon alle.

Heidän taistellessaan ei kuulunut muuta ääntä kuin heidän


ruumiittensa hankautuminen lattiaa vasten ja heidän varuksiensa
kalahtelu; toinen pyrki tempaamaan tikarin vyöltään, toinen iäksi
sulkemaan vastustajansa henkitorven.

Pian sotilas tapasi hapuilemansa aseen ja nyittyään sitä yhä


heikentyvillä voimillaan hän tunsi tikarin liukuvan tupestaan. Hitaasti
ja voimattomasti hän kohotti sen korkealle päällänsä olevan miehen
selän kohdalle; vielä viimeisen kerran ponnistaen voimiaan
äärimmilleen hän painoi kärkeä alaspäin, mutta ennenkuin se ehti
maaliinsa, kuului terävä naksahdus, ikäänkuin luu olisi taittunut, tikari
kirposi vahinkoa tekemättä hänen kuolleesta kädestään ja hänen
päänsä retkahti taaksepäin hänen katkenneen kaulansa varaan.

Siepattuaan kuolleelta vastustajaltaan miekan Norman of Torn


riensi ulos tornihuoneesta.

*****

Kun John de Fulm, Buckinghamin kreivi, tarttui raakalaiskäsillä


Joan de Tanyyn, kävi tämä hänen kimppuunsa kiukkuisesti kuin
naarastiikeri. Hän löi lyömistään miehen päätä ja kasvoja, kunnes
kreivi häpeän ja raivon vallassa iski häntä suoraan vasten suuta
nyrkillään; mutta sekään ei masentanut neitoa, joka voimiensa
uupuessa kuitenkin yhä löi ahdistajaansa. Ja silloin mahtava,
kuningasmielinen kreivi, kuninkaan valioystävä, kouraisi vankoilla
sormillaan tytön kurkkua, ja himokas rakkaus muuttui verenhimoksi,
sillä hän olisi ollut valmis tappamaan Joanin vimmassaan.

Näky oli tällainen, kun Tornin henkipatto syöksähti huoneeseen


paljas miekka kädessään. He olivat huoneen toisessa päässä, ja
näyn hänen huuliltaan puristama, raivokas kiljaisu sai kreivin
hellittämään uhrinsa ja kääntymään miekka kädessä häntä vastaan.
Ei virketty mitään, sillä sanoja ei tässä kaivattu. Miehet olivat
toistensa kimpussa, taistellen elämästä ja kuolemasta, ennenkuin
tyttö oli päässyt jälleen pystyyn. John de Fulmin elämänlanka olisi
äkkiä katkennut, jollei hänen avukseen olisi rientänyt joitakuita hänen
sotilaitaan, jotka olivat kuulleet ottelun hälyn.

Heitä oli neljä, ja he syöksyivät suinpäin huoneeseen ja suoraa


päätä Norman of Tornin kimppuun innokkaasti pyrkiessään
survaisemaan miekkansa häneen; mutta heti henkipaton
mestarillisen käden kohdattuaan he alkoivat hyökkäillä hitaammin,
eikä kaksi heistä tuokion kuluttua enää lainkaan hyökkäillyt, kun taas
jäljelläolevat ja kreivi vain varovasti kaartelivat hänen ympärilleen,
väijyen sopivaa tilaisuutta, jota he eivät koskaan saaneet.

Norman of Torn seisoi selkä pöytää vasten huoneen nurkassa, ja


Joan de
Tany oli hänen takanaan.

»Siirtykää vasemmalle!» supatti tyttö. »Minä tunnen tämän vanhan


rakennuksen. Päästyänne lamppua kannattavan pöydän luokse on
suoraan lakananne pieni ovi. Iskekää miekallanne lamppu
sammuksiin, kun tunnette käteni vasemmassa kädessänne! Sitten
minä opastan teidät siitä ovesta, joka teidän pitää sulkea ja teljetä
jälkeemme. Ymmärrättekö?»

Norman nyökkäsi.

Verkkaisesti hän taistellen siirtyi pöytää kohti sotilaiden sillä välin


pitäessä hornamaista melua, huutaen apua. Kreivi pysyi huolellisesti
poissa de Condén miekan kärjen ulottuvilta, ja sotilaat olivat sangen
taipuvaiset noudattamaan isäntänsä esimerkkiä.
Hänen parhaiksi ehdittyään päämääräänsä syöksyi huoneeseen
vielä kymmenkunta miestä, ja tämän avun rohkaisemana tuli toinen
de Condéta ahdistava sotilas liian likelle häntä. Nykäistessään
säilänsä irti miehen kurkusta Norman of Torn tunsi lujan, lämpimän
käden sujahtavan omaan käteensä takaapäin, ja hänen miekkansa
sivalsi kajahtavan iskun lamppuun.

Huoneen jäätyä pimeäksi Joan de Tany ohjasi hänet ulos pikku


ovesta, jonka hän heti sulki ja telkesi, kuten tyttö oli käskenyt.

»Tännepäin!» kuiskasi neito, taaskin tarttuen hänen käteensä, ja


hiljaisuuden vallitessa talutti häntä useiden hämärien huoneiden
lävitse, seisahtuen vihdoin sileän seinän kohdalle avarassa
tammilaudoituksella sievistetyssä huoneessa.

Siellä tyttö nopein sormin tunnusteli laudoituksen reunaa ja liikkui


yhä vikkelämmin, kun linnassa alkoi kajahdella kiiruhtavien askelten
ääniä.

»Mikä on viassa?» kysyi Norman of Torn, huomattuaan hänen yhä


pahenevan hämminkinsä.

»Mon Dieu!» tuskaili Joan. »Olenko voinut erehtyä? Varmasti tämä


on sama huone. Voi, hyvä ystävä, että minun oikullani ja
turhamaisuudellani pitikin saattaa teidät kaikkeen tähän! Ja nyt, kun
ehkä voisin pelastaa teidät, hämmentyy pääni, enkä muista tietä.»

»Älkää olko huolissanne minun tähteni!» lohdutti Tornin


paholainen nauraen. »Minusta tuntui, että juuri minä koetin pelastaa
teitä, ja suokoon taivas minulle muussa tapauksessa anteeksi, sillä
totisesti ainoastaan se voi puolustaa sitä tekoani, että pakenin
kourallista miekkamiehiä. En voinut panna mitään alttiiksi, kun sinä
olit kysymyksessä, Joan», lisäsi hän vakavammin.

Takaa-ajon hälinä kuului nyt ihan likeltä, ja lepattavien soihtujen


kajastusta jo näkyikin läheisestä huoneista.

Vihdoin tyttö huudahti hiljaa: »Tomppeli!» tarttui de Condén käteen


ja kiidätti hänet huoneen vastaiseen päähän.

»Täällä se on», kuiskutti hän riemuisesti, »täällä se on ollut koko


ajan». Hypisteltyään sormillaan pitkin laudoituksen reunaa, kunnes
löysi pienen, kätketyn pontimen, hän painoi sitä, ja osa
laudoituksesta kääntyi hitaasti sisäänpäin, jättäen näkyviin sen
takana avautuvan pimeän onkalon ammottavan suun.

Tyttö astui kerkeästi aukosta sisälle, vetäen de Condén


perässään, ja kun laudoitus oli hiljaa kiertynyt paikoilleen, astui
Buckinghamin kreivi huoneeseen muassaan toistakymmentä
sotilasta.

»Piru heidät vieköön!» kiukkuili de Fulm. »Mihin he ovat


saattaneet mennä? Varmastihan olimme heidän jäljillään.»

»Tämä tuntuu kummalliselta, mylord», vastasi eräs sotilaista.


»Tarkastetaan yläkertaa ja torneja, sillä varmasti he eivät ole tulleet
tänne.» Ja seurue palasi samaa tietä, jättäen huoneen tyhjäksi.

Laudoituksen takana tyttö seisoi painautuneena kiinni de


Condéseen käsi vielä miehen kädessä.

»Mihin nyt?» tiedusti Roger. »Vai pysymmekö täällä piilossa


pelästyneiden kanojen tavoin, kunnes sota päättyy ja parooni palaa
päästämään meidät tästä ummehtuneesta onkalosta?»
»Maltahan», pyysi tyttö, »kunnes hermoni hiukan rauhoittuvat.
Olen ihan voimaton.» Henkipatto tunsi tytön vartalon vapisevan
painautuessaan häntä vasten.

Norman of Tornissa oli suojelemisvaisto voimakas. Ja ihmekö


sitten, että hänen kätensä kiertyi Joanin hartioiden ympärille
ikäänkuin hän olisi halunnut sanoa: »Älä pelkää! Minä olen rohkea ja
voimakas. Mikään ei pysty tekemään sinulle pahaa, niin kauan kuin
minä olen tässä.»

Äkkiä tyttö kohotti kätensä Rogerin kasvoille uskaltaen tehdä sen


pimeyden suojassa.

»Roger», kuiskasi hän kielensä takertuessa tuttuun nimeen.


»Luulin heidän tappaneen sinut — ja vain minun tähteni, typerän
itsepäisyyteni tähden! Voitko antaa minulle anteeksi?»

»Antaa anteeksi?» kertasi mies hymyillen itsekseen. »Antaa


anteeksi, että olen saanut tilaisuuden taistella? Ei ole mitään
anteeksi annettavaa, Joan, jollei minun pitäisi pyytää anteeksi sitä,
että olen puolustanut sinua niin kehnosti.»

»Älä puhu sellaista!» kielsi tyttö. »Ei milloinkaan ennen ole koko
maailmassa nähty sellaista uljuutta ja sellaista miekankäyttelyä eikä
sellaista miestä.»

Norman ei vastannut. Hänen mielessään myllersi sekavia,


ristiriitaisia ajatuksia. Tytön käsien kosketus, kun ne hetkisen olivat
olleet hänen poskillaan, epävarmasti hyväillen, ja häntä vastaan
nojaavan vartalon tuntu panivat veren kuumasti kiertämään hänen
suonissaan. Hän oli ymmällä, sillä hän ei ollut uneksinutkaan, että
ystävyys oli niin suloista. Sen, ettei tyttö vetäytynyt irti ympärilleen

You might also like