I'm new in PHP, MySQL and OOP, so I tried to write a small project to learn things better. The Pponebook should contains contacts which can be edited, deleted, added, sorted and it has pagination, too. Search is also available. This is my first project in PHP and I am using OOP for the first time, so I am sure that my code is complete mess.
Contact
:
<?php
class Contact
{
private $name;
private $phone ;
private $address;
private $notes ;
private function isValid($var, $min_limit)
{
if(strlen(trim($var))>=$min_limit)
{
return true;
}
return false;
}
public function __construct($name, $phone, $address='', $notes='')
{
if($this->isValid($name, 3)&& $this->isValid($phone, 3))
{
$this->name = addslashes(trim($name));
$this->phone = addslashes(trim($phone));
$this->address = addslashes(trim($address));
$this->notes = addslashes(trim($notes));
}
else if (!$this->isValid($name, 3))
{
throw new Exception('The name is too short.');
}
else if (!$this->isValid($phone, 3))
{
throw new Exception('The phone number is too short.');
}
}
public function getName()
{
return $this->name;
}
public function getPhone()
{
return $this->phone;
}
public function getAddress()
{
return $this->address;
}
public function getNotes()
{
return $this->notes;
}
public static function printTable($sql)
{
$temp= DataBaseActions::run_q($sql);
while($row = mysql_fetch_assoc($temp))
{
$tmp='<tr class="content"><td>'.$row['name'].'</td><td>'.$row['phone'].'</td>
<td>'.$row['address'].'</td><td>'.$row['notes'].'</td>
<td class="try"><a href="index.php?mode=edit&id='.$row['contact_id'].'">Edit</a></td>
<td class="try"><a href="index.php?mode=delete&id='.$row['contact_id'].'">Delete</a></td></tr>';
echo $tmp;
}
}
}
Database
:
<?php
class DataBaseActions
{
private $db_name='phonebook';
private $db_username='Emanuela';
private $db_host='localhost';
public function connect()
{
mysql_connect($this->db_host, $this->db_username) or die('Error with the database.');
mysql_select_db($this->db_name) or die ('Error with the database.');
}
public static function run_q($sql)
{
mysql_query('SET NAMES utf8');
return mysql_query($sql);
}
public function insert($obj)
{
DataBaseActions::run_q('INSERT INTO contacts (name, address, phone, notes)
VALUES ("'.addslashes($obj->getName()).'", "'.addslashes($obj->getAddress()).'",
"'.addslashes($obj->getPhone()).'", "'.addslashes($obj->getNotes()).'")');
}
public function update($obj, $id)
{
DataBaseActions::run_q('UPDATE contacts SET name="'.$obj->getName().'",
address="'.$obj->getAddress().'", phone="'.$obj->getPhone().'",
notes="'.$obj->getNotes().'" WHERE contact_id='.$id);
}
public function delete($id)
{
DataBaseActions::run_q('DELETE FROM contacts WHERE contact_id='.$id);
}
public function sortTable($field, $mode)
{
$sql='SELECT * FROM contacts ORDER BY `'.$field.'`'.$mode;
return $sql;
}
public function search($field, $value)
{
$keywords = explode(' ',$value);
$query = 'SELECT * FROM contacts WHERE';
foreach ($keywords as $key)
{
$query .= ' `'.$field.'` LIKE "%'.$key.'%" AND';
}
$query = rtrim($query,' AND');
return $query;
}
}
Pagination
:
<?php
include 'DataBaseActions.php';
class Pagination
{
private $limit;
private static $all=0;
private $last_page;
private $page;
public function __construct($limit=5, $page=0)
{
$this->limit = $limit;
$this->page = $page;
$this->last_page = ceil(Pagination::$all/$this->limit);
}
public function setAll($sql)
{
$temp= DataBaseActions::run_q($sql);
Pagination::$all= mysql_num_rows($temp);
$this->last_page = ceil(Pagination::$all/$this->limit);
}
public function setPage($page)
{
$this->page = $page;
}
public function pageQuery($sql)
{
$newsql =$sql.' LIMIT '.$this->page*$this->limit.','.$this->limit;
return $newsql;
}
public function printPages()
{
if($this->page>0)
{
echo '<a href="index.php?page='.($this->page).'">Previous</a>';
}
echo ' | ';
for($i=0; $i<$this->last_page; $i++)
{
if($i==$this->page)
{
echo ($i+1);
}
else
{
echo '<a href="index.php?page='.($i+1).'">'.($i+1).' </a>';
}
echo ' | ';
}
if($this->page<($this->last_page-1))
{
echo '<a href="index.php?page='.($this->page+2).'"> Next</a><br>';
}
}
}
And the index file which is the worst of all. There are so many if
s and the HTML and PHP code are so messy.
<?php
error_reporting(0);
include 'Contact.php';
include 'Pagination.php';
session_start();
$db=new DataBaseActions();
$db->connect();
if($_GET['mode']=='normal')
{
$flag=0;
$_SESSION['mode']='normal';
}
if($_GET['mode']=='delete')
{
$id = addslashes($_GET['id']);
$id = htmlspecialchars(stripslashes($id));
$id = mysql_escape_string($id);
$db->delete($id);
header('Location: index.php');
}
if ($_GET['mode'] == 'edit' && $_GET['id'] > 0)
{
$id = (int) $_GET['id'];
$rs = DataBaseActions::run_q('SELECT * FROM contacts WHERE contact_id=' . $id);
$info = mysql_fetch_assoc($rs);
}
if($_GET['mode']=='ASC')
{
$flag=1;
$field=$_GET['field'];
$mode='ASC';
$_SESSION['mode']='ASC';
$_SESSION['field']=$field;
}
if($_GET['mode']=='DESC')
{
$flag=1;
$field=$_GET['field'];
$mode='DESC';
$_SESSION['mode']='DESC';
$_SESSION['field']=$field;
}
if($_POST['name']==1)
{
$s_name=$_POST['search_name'];
$flag=2;
$_SESSION['mode']='sname';
}
if($_POST['phone']==1)
{
$s_phone=$_POST['search_phone'];
$flag=3;
$_SESSION['mode']='sphone';
}
if($_POST['address']==1)
{
$s_address=$_POST['search_address'];
$flag=4;
$_SESSION['mode']='saddress';
}
if($_POST['notes']==1)
{
$s_notes=$_POST['search_notes'];
$flag=5;
$_SESSION['mode']='snotes';
}
if($_POST['form_submit']==1)
{
$flag=0;
$name=$_POST['name'];
$phone=$_POST['phone'];
$address=$_POST['address'];
$notes=$_POST['notes'];
$_SESSION['mode']='normal';
try
{
$a=new Contact($name, $phone, $address, $notes);
$id=(int)$_POST['edit_value'];
$temp=DataBaseActions::run_q('SELECT * FROM contacts WHERE phone='.$a->getPhone().' AND contact_id!='.$id);
if(mysql_num_rows($temp)==0)
{
if($id>0)
{
$db->update($a, $id);
echo 'Successful update.';
}
else
{
$db->insert($a);
echo 'The contact was successfully added to the Phone Book!';
}
}
else
{
echo 'This phone number is already in the Phone Book.';
}
}
catch(Exception $exc)
{
echo $exc->getMessage();
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css" />
<title>Phone Book</title>
</head>
<body>
<center>
<h3>Phone Book</h3><br />
<form method="post" action="index.php">
<table border="0">
<tr><td>Name:</td><td> <input type="text" name="name" value="<?php echo $info['name'];?>"/></td></tr>
<tr><td>Phone number:</td><td> <input type="text" name="phone" value="<?php echo $info['phone'];?>"/></td></tr>
<tr><td>Address:</td><td> <input type="text" name="address" value="<?php echo $info['address'];?>"/></td></tr>
<tr><td>Notes: </td><td><input type="textarea" name="notes" value="<?php echo $info['notes'];?>"/></td></tr>
</table>
<input type="hidden" name="form_submit" value="1" /><br />
<input type="submit" value="Submit" /><br /><br />
<?php
if($_GET['mode']=='edit')
{
echo '<input type="hidden" name="edit_value" value="'.$_GET['id'].'" /><br />';
}
?>
</form>
<table border="3" style="border-collapse:collapse; border-color: gray; padding: 2px;">
<tr class="header">
<td>Name</td>
<td>Phone number</td>
<td>Address</td>
<td>Notes</td>
<td></td>
<td></td>
</tr>
<?php
$p=new Pagination();
if((int)$_GET['page']>0)
{
$p->setPage((int)$_GET['page']-1);
}
if($_SESSION['mode']=='normal')
{
$flag=0;
}
if($_SESSION['mode']=='ASC' || $_SESSION['mode']=='DESC')
{
$flag=1;
$field=$_SESSION['field'];
$mode=$_SESSION['mode'];
}
if($_SESSION['mode']=='sname')
{
$flag=2;
}
if($_SESSION['mode']=='sphone')
{
$flag=3;
}
if($_SESSION['mode']=='saddress')
{
$flag=4;
}
if($_SESSION['mode']=='snotes')
{
$flag=5;
}
switch($flag)
{
case 0:
$sql='SELECT * FROM contacts';
$p->setAll($sql);
Contact::printTable($p->pageQuery($sql));
break;
case 1:
echo'<a href="index.php?mode=normal"> Go back to unsorted table<br></a>';
$p->setAll($db->sortTable($field, $mode));
Contact::printTable($p->pageQuery($db->sortTable($field, $mode)));
break;
case 2:
echo'<a href="index.php?mode=normal">Go back to all contacts<br></a>';
$p->setAll($db->search('name', $s_name));
Contact::printTable($p->pageQuery($db->search('name', $s_name)));
break;
case 3:
echo'<a href="index.php?mode=normal">Go back to all contacts<br></a>';
$p->setAll($db->search('phone', $s_phone));
Contact::printTable($p->pageQuery($db->search('phone', $s_phone)));
break;
case 4:
echo'<a href="index.php?mode=normal">Go back to all contacts<br></a>';
$p->setAll($db->search('address', $s_address));
Contact::printTable($p->pageQuery($db->search('address', $s_address)));
break;
case 5:
echo'<a href="index.php?mode=normal">Go back to all contacts<br></a>';
$p->setAll($db->search('notes', $s_notes));
Contact::printTable($p->pageQuery($db->search('notes', $s_notes)));
break;
}
?>
<tr class="content">
<td><form method="post" action="index.php"><input type="text" name="search_name">
<input type="submit" value=">"><input type="hidden" name="name" value="1"></form></td>
<td><form method="post" action="index.php"><input type="text" name="search_phone">
<input type="submit" value=">"><input type="hidden" name="phone" value="1"></form></td>
<td><form method="post" action="index.php"><input type="text" name="search_address">
<input type="submit" value=">"><input type="hidden" name="address" value="1"></form></td>
<td><form method="post" action="index.php"><input type="text" name="search_notes">
<input type="submit" value=">"><input type="hidden" name="notes" value="1"></form></td>
<td></td>
<td></td>
</tr>
<tr class="content">
<td><a href="index.php?mode=ASC&field=name">Sort ASC</a></td>
<td><a href="index.php?mode=ASC&field=phone">Sort ASC</a></td>
<td><a href="index.php?mode=ASC&field=address">Sort ASC</a></td>
<td><a href="index.php?mode=ASC&field=notes">Sort ASC</a></td>
<td></td>
<td></td>
</tr>
<tr class="content">
<td><a href="index.php?mode=DESC&field=name">Sort DESC</a></td>
<td><a href="index.php?mode=DESC&field=phone">Sort DESC</a></td>
<td><a href="index.php?mode=DESC&field=address">Sort DESC</a></td>
<td><a href="index.php?mode=DESC&field=notes">Sort DESC</a></td>
<td></td>
<td></td>
</tr>
</table>
<br>
<?php
$p->printPages();
?>
</div>
</center>
</body>
</html>