Databases with PHP A quick introduction Y’all know SQL and Databases You put data in You get data out You can do processing on it very easily LIMIT, ORDER, WHERE, GROUP BY It has a nice Structured Query Language You’ve learned all of this before You’ve done PostgreSQL MySQL doesn’t differ in SQL syntax Slight differences when creating new users and selecting active databases What is this lecture then? How to convert your existing SQL knowledge into PHP How to use that to make something interesting Here’s stuff I prepared earlier There is some PHP/HTML relating to the visual parts of the page. I will not cover that, unless there is time at the end There is some CSS, again I’ll leave that to the end The PHP relating to the logic is in a separate file, I will show you how to create that. Roadmap Make a database When people type into the box and hit enter we need to Connect to the database Insert the data into the table When people view the page we need to Connect to the database Grab the last 25 comments, ordered by the time they are posted How to create the database Delivery in 39 seconds or its free root@core:~# date Wed Mar 16 13:58:58 UTC 2011 root@core:~# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 45 Server version: 5.1.41-3ubuntu12 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database gw; Query OK, 1 row affected (0.01 sec) mysql> use gw; Database changed mysql> create table comments (id INT AUTO_INCREMENT PRIMARY KEY, time TIMESTAMP, val TEXT (255)); Query OK, 0 rows affected (0.03 sec) mysql> grant all on gw.* to 'gw'@'localhost' identified by 'somepassword'; Query OK, 0 rows affected (0.12 sec) mysql> quit; Bye root@core:~# date Wed Mar 16 13:59:34 UTC 2011 Connect to the database from PHP When we execute queries later, PHP needs to know where the database server is and how to log into it If you only have one database connection (normal) you can forget about the returned connection handle resource mysql_connect(“servername”,”username”,”password”); This makes PHP remember that mysql calls must go through that connection Automatically flushed and closed cleanly Select the correct database You are now connected to the database server but not yet to your actual database Need to choose the database (like “use gw;” when creating the database) bool mysql_select_db(“databasename”); Returns true on success, false otherwise Execute arbitrary SQL You know how to do everything else in SQL, reuse that knowledge! resource mysql_query(“SQL query string”); The returned value might be a boolean If an error then false, if success but not a fetching type of query then true Or it might be a handle to the result set Which could be empty You can then fetch individual rows array mysql_fetch_assoc($myResultSet); mysql_fetch_assoc will return false if there are no more rows while($row = mysql_fetch_assoc($resultSet)) { //Per row code } The ‘assoc’ part is for ‘associative array’. You access a column by its name like $row[“columnA”] That’s all we need Any questions on SQL syntax? You should know how to do the following: SELECT rows from a table WHERE they meet certain criteria ORDER the returned rows LIMIT the number of rows returned GROUP BY is cool, but you probably won’t really need it for the project Are we missing anything? YES! SECURITY Barry and other people like him will have his way with your ponies if you are not careful w3schools puts up a really insecure example in their tutorial, NEVER EVER DO THIS: Yeah but all that protection stuff kills the mood Not so, its quick and easy. You have one function which will magically create a locale specific super ultra protection filter and run it on your input: $input = “Barry says \”;DROP DATABASE ponies;--”; $safe = mysql_real_escape_string($input); It doesn’t even matter if your database server is CHINESE, it will connect to it and ask it which characters are dangerous This is why its called _real_ (it doesn’t play around) Always use it! Keep it in your wallet Don’t use the old mysql_escape_string(); it has expired and will break when you need it most OK, so back to the chat thing… index.php And the part that talks to MySQL logic.php Tada! Head over to ten.xd-bx.net and abuse it Did you know you can embed HTML and JavaScript into your post? You could actually do some pretty cool/nasty things The annoying refresh every 30 seconds can only be fixed with a splash of AJAX, someone else is lecturing that