How to test and debug a PHP project In particular, proj2. Slide 1

Similar documents
How to test and debug a PHP project In particular, proj2. Slide 1

How to test and debug a PHP project In particular, proj2

PHP Web Services, part 2

CS637 Midterm Review

World-Wide Web Protocols CS 571 Fall Kenneth L. Calvert All rights reserved

Protocols. Application Layer FTP, HTTP, SSH, IMAP. Transport Layer TCP, UDP. Internet Layer IP. Link Layer Ethernet, WiFi

MP 1: HTTP Client + Server Due: Friday, Feb 9th, 11:59pm

COSC 2206 Internet Tools. The HTTP Protocol

CSCI 4000 Assignment 4

COMP 213. Advanced Object-oriented Programming. Lecture 20. Network Programming

World Wide Web, etc.

CSCI 4000 Assignment 5

PHP INTERVIEW QUESTION-ANSWERS

How browsers talk to servers. What does this do?

HTTP Protocol and Server-Side Basics

How to use PHP with a MySQL database

CSC 337, Fall 2013 Assignment 8 Due: Wednesday, November 20 at 22:00:00

Lecture 3: Web Servers / PHP and Apache. CS 383 Web Development II Monday, January 29, 2018

Produced by. Mobile Application Development. Higher Diploma in Science in Computer Science. Eamonn de Leastar

HTTP Server Application

CSCI 4000 Assignment 6

Project 2 Implementing a Simple HTTP Web Proxy

Application Level Protocols

Project 2 Group Project Implementing a Simple HTTP Web Proxy

Lab 2. All datagrams related to favicon.ico had been ignored. Diagram 1. Diagram 2

Using PHP to Plot PART I Updated: 10/1/17

(Frequently Asked Questions)

Introduction to web development with PHP

Computer Networks - A Simple HTTP proxy -

Homework #7 Google Cloud Platform

GET /index.php HTTP/1.1 Host: User- agent: Mozilla/4.0

HTTP Reading: Section and COS 461: Computer Networks Spring 2013

PHP. MIT 6.470, IAP 2010 Yafim Landa

NETB 329 Lecture 13 Python CGI Programming

CMSC 332 Computer Networking Web and FTP

Matt Terwilliger. Networking Crash Course

Solar Plant Data Acquisition Maintenance

CGI Programming. What is "CGI"?

Bitnami ez Publish for Huawei Enterprise Cloud

PHP APIs. Rapid Learning & Just In Time Support

Getting Some REST with webmachine. Kevin A. Smith

Instructor s Notes Web Data Management Web Client/Server Concepts. Web Data Management Web Client/Server Concepts

SEEM4570 System Design and Implementation. Lecture 6 Game Part II

CS193i Handout #18. HTTP Part 5

Apache, Php, MySql Configuration

Bitnami Piwik for Huawei Enterprise Cloud

Web insecurity Security strategies General security Listing of server-side risks Language specific security. Web Security.

Real Life Web Development. Joseph Paul Cohen

How To Install Joomla Component 2.5 On Wamp Server 2.1

By Lucas Marshall. All materials Copyright Developer Shed, Inc. except where otherwise noted.

TACACS Support APIs. curl -k -v -u "admin:cisco123" -H Accept:application/vnd.yang.data+xml -H ContentType:application/vnd.yang.

FlexNet Licensing: Steps to Activate Licenses to an Offline License Server

How to work with HTTP requests and responses

Web Security, Part 2

Bitnami Tiny Tiny RSS for Huawei Enterprise Cloud

EE 122: HyperText Transfer Protocol (HTTP)

Things to note: Each week Xampp will need to be installed. Xampp is Windows software, similar software is available for Mac, called Mamp.

Bitnami Mantis for Huawei Enterprise Cloud

Internet Content Distribution

Zend Server 5 for IBM i Reference Manual

WEB SECURITY WORKSHOP TEXSAW Presented by Solomon Boyd and Jiayang Wang

Threat Landscape 2017

HTTP Review. Carey Williamson Department of Computer Science University of Calgary

SYMFONY2 WEB FRAMEWORK

Lecture Overview. IN5290 Ethical Hacking. Lecture 4: Web hacking 1, Client side bypass, Tampering data, Brute-forcing

WEBD 236 Web Information Systems Programming

CCMS Installation Instructions

CSSE 460 Computer Networks Group Projects: Implement a Simple HTTP Web Proxy

Hypertext Transport Protocol

Here are the steps in downloading the HTML code for signatures:

CNIT 129S: Securing Web Applications. Ch 3: Web Application Technologies

Re3gistry development & testing - Bug #2895 Problems installing registry

COMP 150-IDS: Internet Scale Distributed Systems (Spring 2017) URIs and RFC 3986

Creating and Updating Websites In-Service Training Supplement

Smart Bulk SMS & Voice SMS Marketing Script with 2-Way Messaging. Quick-Start Manual

Web Programming 4) PHP and the Web

How to Create a NetBeans PHP Project

Proxying. Why and How. Alon Altman. Haifa Linux Club. Proxying p.1/24

IIS & Web & PHP Configuration Dr. Tom Hicks Trinity University

Get started with Efficient Documents Management System. Stephane Van de Putte, The NO-SOD Project

Web Mechanisms. Draft: 2/23/13 6:54 PM 2013 Christopher Vickery

Chapter 15 How to use regular expressions, handle exceptions, and validate data

Lecture 7b: HTTP. Feb. 24, Internet and Intranet Protocols and Applications

WWW. HTTP, Ajax, APIs, REST

NET 311 INFORMATION SECURITY

Preparing Your Working Environment

3. WWW and HTTP. Fig.3.1 Architecture of WWW

Yioop Full Historical Indexing In Cache Navigation. Akshat Kukreti

CSCI-1680 WWW Rodrigo Fonseca

CSCI-1680 WWW Rodrigo Fonseca

Princess Nourah bint Abdulrahman University. Computer Sciences Department

Hello everyone! Page 1. Your folder should look like this. To start with Run your XAMPP app and start your Apache and MySQL.

Bitnami TestLink for Huawei Enterprise Cloud

Bitnami Ruby for Huawei Enterprise Cloud

LAMP, WEB ARCHITECTURE, AND HTTP

Avoiding Web Application Flaws In Embedded Devices. Jake Edge LWN.net URL for slides:

HTTP Console Documentation

Programming Tips for CS758/858

Bitnami Coppermine for Huawei Enterprise Cloud

Rabbit Web-Based Program Downloader For the Softools Compiler SHDesigns

Transcription:

How to test and debug a PHP project In particular, proj2 Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 1

Inventory tracking by pizza2 Pizza2 tracks flour and sugar inventory Each pizza ordered by a student uses one unit of flour, one unit of cheese. So you need a new inventory table. When the system sees supplies low, it orders more, using web services. And saves the supply order ids, so it can later check for their delivery one or two days later (using a web service) So you need another table for saving supply order ids. Specifically, the day manager checks inventory at the start of each day, even day 1, and checks if any older orders have been delivered, and credits their quantities to the inventory sends off web services for new orders as needed. Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 2

Code that needs work in proj2: pizza2 side: mostly in day manager pizza2/database/createdb.sql, dropdb.sql: needs new code to set up/drop inventory table, undelivered_orders table. pizza2/pizza/index.php: needs to fail an order if there is insufficient inventory. Deducts from inventory for successful order. pizza2/day/index.php: when doing next_day action, needs to do the inventory management and ordering. On any access, needs to find out inventory levels, etc. Calls into web_services.php to do needed web services to server to order more flour, cheese. pizza2/day/order_list.php: now needs to displays inventory information and undelivered supply orders pizza2/day/web_services.php: functions for each web service, using Guzzle to do the actual GET and POSTs. As in model, let the caller handle exceptions. pizza2/model/inventory_db.php: database actions for inventory management (also need to edit initial.php) Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 3

Code that needs work in proj2_server: mainly in rest/index.php proj2_server/rest/index.php: top-level web service code: need to fix GET/POST /day code, add /orders services proj2_server/rest/.htaccess: needed to get the Apache web server to execute index.php for any incoming URL.../rest/... (no edits needed) proj2_server/model/order_db.php: provided code has new add_order(), this may be sufficient. proj2_server/model/day.php: needs to retrieve and update the system day on the server 5/1/2017 4

PHP with echo statements that trace the execution of the code // calculate the future value $future_value = $investment; echo '$future_value: '. $future_value. '<br>'; echo '$interest_rate: '. $interest_rate. '<br>'; echo '$years: '. $years. '<br>'; echo 'For loop for calculating future value is starting...<br><br>'; for ($i = 1; $i <= $years; $i++) { $future_value = ($future_value + ($future_value * $interest_rate)); echo '$i: '. $i. '<br>'; echo '$future_value: '. $future_value. '<br>'; } Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 5

The data displayed in a browser Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 6

When echo can t be used Echo is great for simple debugging of client-side code, in cases where the controller includes a view file If the controller does a redirect, the echoed text is lost Demo: using echo in pizza2 s day controller, in change-to-next day code that needs work for proj2. Put echo in list handling in controller code that forwards to day_list.php, see echo in output Put echo in change-to-next-day handling in code that redirects to., see instead in list handling in output. This is because the redirected request does list handling. The original response is just the REDIRECT, no HTML at all. Also, can t use echo in rest/index.php, because it will be sent back to client and mess up that response. 5/1/2017 7

Losing echo output on redirect: fixes One workaround: use error_log instead of echo. Another way: temporarily replace REDIRECT with simple exit. Demo: now we see just the echo output in change-to-next-day handling Luckily, plain text works as HTML! (our browsers are very forgiving) 5/1/2017 8

REDIRECT can also hide error displays Just like echo output, the orange box output for PHP errors is discarded on REDIRECT. Of course, the PHP error log report is there. So check the error log whenever something goes wrong. 5/1/2017 9

Error logs Check the error log whenever something goes wrong. Proj2: pizza2 s error log is in a new place, in pizza2/php-errors.log (both under XAMPP and on topcat) Proj2/proj2_server s error log for web services is in proj2_server/php-server-errors.log On topcat (Linux) or home Mac, need to chmod 777 *.log in both pizza2 and proj2_server to allow writes to the logs. (Not needed on Windows) 5/1/2017 10

Error Configuration XAMPP as installed is set up for development, not production use, so displays most errors. php.ini has error configuration for the server, so we could convert the server to production use by editing it. From php.ini of XAMPP: error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = On From php.ini on topcat (/etc/php5/php.ini, protected): error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = Off We can override the error configuration by calls in our PHP program. For proj2, that is done in main.php. Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 11

Getting errors to display on topcat <?php echo 'setting display_errors on'; ini_set('display_errors',1); This is done in main.php echo $foo; // Undefined variable echo "Done"; Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 12

Exceptions vs. Errors in PHP We saw that PDO objects throw exceptions, themselves Exception objects Exceptions are new to PHP, with PHP 5, so exceptions are different from errors, the older non-oo setup. An uncaught exception causes a fatal error. Thus we should catch possible exceptions A caught exception causes no error. Murach's PHP and MySQL, C6 2014, Mike Murach & Associates, Inc. Slide 13

Useful Exception methods Example from Tuts+ PHP Exception Tutorial: } catch (Exception $e) { echo "Message: ". $e->getmessage(). "\n\n"; echo "File: ". $e->getfile(). "\n\n"; echo "Line: ". $e->getline(). "\n\n"; echo "Trace: \n". $e->gettraceasstring(). "\n\n"; } Message: Email is invalid File: C:\wamp\www\test\validator.php Line: 7 Trace: #0 C:\wamp\www\test\user.php(11): Validator- >validate_email('$!%#$%#*') #1 C:\wamp\www\test\test.php(12): User->save() #2 {main}

New error.php in pizza2 (no more database_error.php) <!DOCTYPE html> <html> <body> <main> <!-- replacing separate database_error.php: report on error, with banner Database or class name if it's an Exception --> <?php if ($e instanceof PDOException) { // including subclasses $label = 'Database'; $error_message = $e->getmessage(); } else if ($e instanceof Exception) { $label = get_class($e); $error_message = $e->getmessage(); } else if (is_string($e)) { $label = 'User'; $error_message = $e; } else { $label = 'Unclassified'; $error_message = 'Error not Exception or string: bug in includer or error.php'; }?> <h1> <?php echo $label;?> Error</h1> <h3> <?php echo $error_message;?> </h3> <?php if ($e instanceof Exception) { echo '<p> at line '. $e->getline(). ' in file '. $e->getfile(). '</p>'; echo '<p> full backtrace:<br>'; echo str_replace("\n", '<br>', $e->gettraceasstring()); echo '</p>'; }?> <p> <?php debug_print_backtrace();?></p> </main> </body> </html> Looks at object type of Exception for label, so can handle Guzzle, PDO, Provides backtrace 5/1/2017 15

Example of error.php output: expected error on rerun of restclient/index.php GuzzleHttp\Exception\ClientException Error Client error: `POST http://localhost/cs637/eoneil/proj2/proj2_server/rest/products/` resulted in a `400 Bad Request` response: at line 111 in file C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php full backtrace: #0 C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\vendor\guzzlehttp\guzzle\src\Middleware.php(65): GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\Response)) #1 C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\vendor\guzzlehttp\promises\src\Promise.php(203): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response)) #9 C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\vendor\guzzlehttp\guzzle\src\Client.php(129): GuzzleHttp\Promise\Promise->wait() #10 C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\restclient\index.php(84): GuzzleHttp\Client->request('POST', 'http://localhos...', Array) #11 {main} #0 include() called at [C:\xampp\htdocs\cs637\eoneil\proj2\pizza2\restclient\index.php:88] important line 5/1/2017 16

Command-line curl We have seen PHP s libcurl in action Separately, we can use curl at the command line in Windows or Linux/Mac Download curl for Windows at http://curl.haxx.se/download.html (this is tricky, needs DLLs from Microsoft to work) Linux/Mac: should have curl already Also see tutorial there: http://curl.haxx.se/docs/httpscripting.html

Command-line curl example 1 From pa2.html: curl localhost/cs637/username/proj2/proj2_server/rest/day/ This fires a GET to http://localhost/cs637... i.e. does the Web service to get the current day from the server: topcat$ curl localhost/cs637/username/proj2/proj2_server/rest/day/ 6topcat$ Result (no end-of-line after the number, so shows up at start of next line) Note: will always return 6 until you fix its code.

Command-line curl example 2 From pa2.html: curl -i -d 9 -H Content-Type:text/plain http://localhost/cs637/username/proj2/proj2_server/rest/day/ This fires a POST to http://localhost/cs637... i.e. does the Web service to set the current day to 9 in the server, and overrides the default Content-Type (URL-encoded, as needed for params with POST) Without i or v for status info, or verbose status info: topcat$ curl -d 9 -H Content-Type:text/plain http://localhost/cs637/username/proj2/proj2_server/rest/day/ topcat$ Nothing at all seen how can we tell it worked?

Command-line curl example 2 With v for verbose: topcat$ curl v -d 9 -H Content-Type:text/plain http://localhost/cs637/eoneil37/proj2_server/rest/day/ * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 80 (#0) > POST /cs637/eoneil37/proj2_server/rest/day/ HTTP/1.1 POST command > User-Agent: curl/7.35.0 > Host: localhost > Accept: */* > Content-Type:text/plain > Content-Length: 1 > * upload completely sent off: 1 out of 1 bytes good news! < HTTP/1.1 200 OK more good news < Date: Mon, 04 May 2015 14:33:16 GMT * Server Apache/2.4.7 (Ubuntu) is not blacklisted < Server: Apache/2.4.7 (Ubuntu) < X-Powered-By: PHP/5.5.9-1ubuntu4.9 < Content-Length: 0 < Content-Type: text/html < * Connection #0 to host localhost left intact

Command-line curl example 2 With i for status info: less clutter, get the basic facts: curl -i -d 9 -H Content-Type:text/plain http://localhost/cs637/eoneil1/proj2/proj2_server/rest/day/ HTTP/1.1 200 OK Date: Sat, 21 Nov 2015 19:54:43 GMT Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11 X-Powered-By: PHP/5.5.11 Content-Length: 0 Content-Type: text/html

Command-line curl example 2 topcat$ curl i -d 9 -H Content-Type:text/plain http://localhost/cs637/eoneil1/proj2/proj2_server/rest/da y/ Explanation of arguments: -i return status info -d 9 data use method POST, with POST data 9. Defaults to Content-Type for encoded parameters, like form submission fields x=10&y=20 or whatever -H Content-Type:text/plain override the default Content- Type to this type, plain text So this command does a POST to the URL with just 9 as POST data, and reports verbosely on the action

Shell scripts We can automate command line work with shell scripts (even on Windows) topcat$ more test1.sh curl -i -d 9 -H Content-Type:text/plain http://localhost/cs637/$1/proj2/proj2_server/rest/day/ topcat$ chmod +x test1.sh topcat$ test1.sh eoneil Fills in eoneil for $1 in script: curl -i -d 9 -H Content-Type:text/plain http://localhost/cs637/eoneil/proj2/proj2_server/rest/day/ For Windows: test1.cmd: use %1% instead of $1. See shell and.cmd files in proj2_tests directory.

proj2_tests Note: these test the server-side code only servertest0: tests provided functionality of proj2_server servertest1: test that server day number can be set, setting of day 0 reinitializes orders servertest2: sets day 0 to reinit orders, then sends an order in, gets the order back as order 1, or possibly a higher number on reruns servertest3: like servertest2, then set server day to 3, get order back, should be delivered 5/1/2017 24

proj2_tests Windows tests: servertest0.cmd servertest1.cmd servertest2.cmd servertest3.cmd Linux/Mac tests: servertest0.sh servertest1.sh servertest2.sh servertest3.sh Be sure to chmod +x *.sh for easy execution 5/1/2017 25

servertest0.sh run on topcat topcat$ servertest0.sh eoneil -------------get server day HTTP/1.1 200 OK Content-Length: 1 Content-Type: text/html 6 -------------set server day -- ineffective until coded right HTTP/1.1 200 OK ---------------get server day again HTTP/1.1 200 OK 6 GOAL: this should be 9 ---------------get product 1 5/1/2017 26

Grading run Run servertest series Reinitialize: use dropdb, createdb of pizza2/database, send day 0 to proj2_server Run Selenium script: Test0: initialize, see initial supply order for 60 units of flour, 80 units of cheese (or a little more) Test1: order 10 pizzas and check inventory Test2: order too many pizzas, check for error Test3: reinit, advance day and check for supply order (in case project doesn t do initialization inventory check, see order at start of 2 nd day) Test4: check a supply order is delivered Possibly other tests 5/2/2017 27