Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Chapter 1: Exploring the PHP Environment . . . . . . .1 Introducing the Tip of the Day Program. . . . . . . . . . . . . . . . . . 2 Programming on the Web Server . . . . . . . . . . . . . . . . . . . . . . . 3 Installing PHP and Apache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Using an Existing Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Installing Your Own Development Environment . . . . . . . . 5 Installing Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Installing Apache Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Testing Your Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Starting Apache as a Service . . . . . . . . . . . . . . . . . . . . . . . . 8 Configuring Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Running Your Local Server . . . . . . . . . . . . . . . . . . . . . . . . . 9 Installing PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Downloading the PHP Program . . . . . . . . . . . . . . . . . . . . 10 Telling Apache about PHP . . . . . . . . . . . . . . . . . . . . . . . . . 11 Adding PHP to Your Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Adding PHP Commands to an HTML Page . . . . . . . . . . . 12 Examining the Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Configuring Your Version of PHP . . . . . . . . . . . . . . . . . . . . . . 15 Safe Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Register Globals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Windows Extensions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Creating the Tip of the Day Program . . . . . . . . . . . . . . . . . . . 18 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Chapter 2: Using Variables and Input . . . . . . . . . .21 Introducing the Story Program . . . . . . . . . . . . . . . . . . . . . . . . 22 Using Variables in Your Scripts. . . . . . . . . . . . . . . . . . . . . . . . 23 Introducing the Hi Jacob Program . . . . . . . . . . . . . . . . . . 23 Creating a String Variable . . . . . . . . . . . . . . . . . . . . . . . . . 25 Printing a Variable’s Value . . . . . . . . . . . . . . . . . . . . . . . . . 26 Using the Semicolon to End a Line. . . . . . . . . . . . . . . . . . 27 C on t e n t s Using Variables for More-Complex Pages . . . . . . . . . . . . . . . 28 Building the Row Your Boat Page . . . . . . . . . . . . . . . . . . . 28 Creating Multi-Line Strings . . . . . . . . . . . . . . . . . . . . . . . . 29 Working with Numeric Variables . . . . . . . . . . . . . . . . . . . . . . 30 Making the ThreePlusFive Program . . . . . . . . . . . . . . . . . 30 Assigning Numeric Values . . . . . . . . . . . . . . . . . . . . . . . . . 32 Using Mathematical Operators . . . . . . . . . . . . . . . . . . . . . 32 Creating a Form to Ask a Question. . . . . . . . . . . . . . . . . . . . . 33 Building an HTML Page with a Form . . . . . . . . . . . . . . . . 34 Setting the Action Attribute to a Script File . . . . . . . . . . . 35 Writing a Script to Retrieve the Data. . . . . . . . . . . . . . . . . 35 Sending Data without a Form . . . . . . . . . . . . . . . . . . . . . . . . . 36 Understanding the get Method . . . . . . . . . . . . . . . . . . . . . 36 Using a URL to Embed Form Data . . . . . . . . . . . . . . . . . . 38 Working with Multiple Field Queries. . . . . . . . . . . . . . . . . 40 Reading Input from Other Form Elements. . . . . . . . . . . . . . . 40 Introducing the borderMaker Program . . . . . . . . . . . . . . . 40 Building the borderMaker.html Page . . . . . . . . . . . . . . . . 41 Reading the Form Elements. . . . . . . . . . . . . . . . . . . . . . . . 43 Returning to the Story Program . . . . . . . . . . . . . . . . . . . . . . . 46 Designing the Story . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Building the HTML Page. . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Checking the Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Building the Final Story . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Chapter 3: Controlling Your Code with Conditions and Functions . . . . . . . . . . .55 Examining the Petals Around the Rose Game . . . . . . . . . . . 56 Creating a Random Number . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Viewing the Roll Em Program . . . . . . . . . . . . . . . . . . . . . . 57 Printing a Corresponding Image . . . . . . . . . . . . . . . . . . . . 58 Using the if Statement to Control Program Flow . . . . . . . . . 58 Introducing the Ace Program. . . . . . . . . . . . . . . . . . . . . . . 59 Creating a Condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Exploring Comparison Operators . . . . . . . . . . . . . . . . . . . 62 Creating an if Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Working with Negative Results . . . . . . . . . . . . . . . . . . . . . . . . 63 Demonstrating the Ace or Not Program . . . . . . . . . . . . . . 64 Using the else Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 xi C o n ten t s Working with Multiple Values . . . . . . . . . . . . . . . . . . . . . . . . . 66 Writing the Binary Dice Program. . . . . . . . . . . . . . . . . . . . 66 Using Multiple else if Clauses . . . . . . . . . . . . . . . . . . . . . . 68 Using the switch Structure to Simplify Programming . . . . . 69 Building the Switch Dice Program . . . . . . . . . . . . . . . . . . 69 Using the switch Structure. . . . . . . . . . . . . . . . . . . . . . . . . 71 Combining a Form and Its Results . . . . . . . . . . . . . . . . . . . . . 71 Responding to Checkboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Using Functions to Encapsulate Parts of the Program . . . . . 77 Examining the This Old Man Program . . . . . . . . . . . . . . . 77 Creating New Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Using Parameters and Function Values . . . . . . . . . . . . . . . . . 80 Examining the Param.php Program . . . . . . . . . . . . . . . . . 80 Looking at Encapsulation in the Main Code Body. . . . . . 82 Returning a Value: The chorus() Function . . . . . . . . . . . . 83 Accepting a Parameter in the verse() Function . . . . . . . . 84 Managing Variable Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Looking at the Scope Demo. . . . . . . . . . . . . . . . . . . . . . . . 86 Returning to the Petals Game . . . . . . . . . . . . . . . . . . . . . . . . . 88 Starting HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Main Body Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 The printGreeting() Function . . . . . . . . . . . . . . . . . . . . . . . 89 The printDice() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 The showDie() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 The calcNumPetals Function . . . . . . . . . . . . . . . . . . . . . . . 92 The printForm() Function . . . . . . . . . . . . . . . . . . . . . . . . . . 93 The Ending HTML Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Chapter 4: Loops and Arrays . . . . . . . . . . . . . . . . . .95 Introducing the Poker Dice Program . . . . . . . . . . . . . . . . . . . 96 Counting with the for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Initializing a Sentry Variable. . . . . . . . . . . . . . . . . . . . . . . . 98 Setting a Condition to Finish the Loop . . . . . . . . . . . . . . . 99 Changing the Sentry Variable . . . . . . . . . . . . . . . . . . . . . . 99 Building the Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Modifying the for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Counting by Fives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Counting Backwards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Using a while Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 xii C o n ten t s Repeating Code with a while Loop . . . . . . . . . . . . . . . . . 103 Recognizing Endless Loops . . . . . . . . . . . . . . . . . . . . . . . 105 Building a Well-Behaved Loop. . . . . . . . . . . . . . . . . . . . . 106 Working with Basic Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Generating a Basic Array . . . . . . . . . . . . . . . . . . . . . . . . . 109 Using a Loop to Examine an Array’s Contents . . . . . . . 109 Using the array() Function to Preload an Array . . . . . . . 110 Detecting the Size of an Array . . . . . . . . . . . . . . . . . . . . . 110 Improving This Old Man with Arrays and Loops . . . . . . . . 111 Building the Place Array. . . . . . . . . . . . . . . . . . . . . . . . . . 113 Writing Out the Lyrics. . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Keeping Persistent Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Counting with Form Fields. . . . . . . . . . . . . . . . . . . . . . . . 114 Storing Data in the Text Box . . . . . . . . . . . . . . . . . . . . . . 116 Using a Hidden Field for Persistence . . . . . . . . . . . . . . . 117 Writing the Poker Dice Program . . . . . . . . . . . . . . . . . . . . . . 117 Setting Up the HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Building the Main Code Body . . . . . . . . . . . . . . . . . . . . . 118 Making the rollDice() Function. . . . . . . . . . . . . . . . . . . . . 119 Creating the evaluate() Function . . . . . . . . . . . . . . . . . . . 123 Printing the Results. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Chapter 5: Better Arrays and String Handling . .133 Introducing the Word Search Program Creator. . . . . . . . . . 134 Using the foreach Loop to Work with an Array. . . . . . . . . . 135 Introducing the foreach.php Program. . . . . . . . . . . . . . . 136 Creating an Associative Array. . . . . . . . . . . . . . . . . . . . . . . . 137 Examining the assoc.php Program . . . . . . . . . . . . . . . . . 138 Building an Associative Array . . . . . . . . . . . . . . . . . . . . . 138 Building an Associative Array with the array() Function . . . . . . . . . . . . . . . . . . . . . . . 139 Using foreach with Associative Arrays . . . . . . . . . . . . . . 140 Using Built-In Associative Arrays . . . . . . . . . . . . . . . . . . . . . 141 Introducing the formReader.php Program . . . . . . . . . . . 141 Reading the $_REQUEST Array . . . . . . . . . . . . . . . . . . . . 141 Creating a Multidimensional Array. . . . . . . . . . . . . . . . . . . . 144 Building the HTML for the Basic Multidimensional Array . . . . . . . . . . . . . . . . . . . . . . . . 146 Responding to the Distance Query . . . . . . . . . . . . . . . . . 147 xiii C o n ten t s Making a Two-Dimensional Associative Array . . . . . . . . . . 150 Building the HTML for the Associative Array. . . . . . . . . 150 Responding to the Query . . . . . . . . . . . . . . . . . . . . . . . . . 151 Building the Two-Dimensional Associative Array . . . . . 153 Getting Data from the Two-Dimensional Associative Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Manipulating String Values . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Demonstrating String Manipulation with the Pig Latin Translator . . . . . . . . . . . . . . . . . . . . . . . . 154 Building the Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Using the split() Function to Break a String into an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Trimming a String with rtrim(). . . . . . . . . . . . . . . . . . . . . 157 Finding a Substring with substr() . . . . . . . . . . . . . . . . . . 158 Using strstr() to Search for One String Inside Another . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Using the Concatenation Operator . . . . . . . . . . . . . . . . . 159 Finishing the Pig Latin Program . . . . . . . . . . . . . . . . . . . 159 Translating Between Characters and ASCII Values . . . . 159 Returning to the Word Search Creator. . . . . . . . . . . . . . . . . 160 Getting the Puzzle Data from the User . . . . . . . . . . . . . . 160 Setting Up the Response Page . . . . . . . . . . . . . . . . . . . . 161 Working with the Empty Data Set . . . . . . . . . . . . . . . . . . 162 Building the Program’s Main Logic . . . . . . . . . . . . . . . . 163 Parsing the Word List . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Clearing the Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Filling the Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Adding a Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Making a Puzzle Board . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Adding the Foil Letters . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Printing the Puzzle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Printing the Answer Key. . . . . . . . . . . . . . . . . . . . . . . . . . 178 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Chapter 6: Working with Files . . . . . . . . . . . . . . . .181 Previewing the Quiz Machine . . . . . . . . . . . . . . . . . . . . . . . . 182 Entering the Quiz Machine System . . . . . . . . . . . . . . . . . 182 Editing a Quiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Taking a Quiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Seeing the Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 xiv C o n ten t s . 9 Installing PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Downloading the PHP Program . . . . . . . . . . . . . . . . . . . . 10 Telling Apache about PHP . . . . . . . . . . . . . . . . . . . . . . . 11 Adding PHP to Your Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Adding PHP Commands to an HTML Page . . . . . . . . . . . 12 Examining. 135 Introducing the foreach .php Program. . . . . . . . . . . . . . . 136 Creating an Associative Array. . . . . . . . . . . . . . . . . . . . . . . . 137 Examining the assoc .php Program . . . . . .