I want to make a dynamic select statement that can select whatever table I ask for, same with table columns in my database.
Here is my select class so far:
<?php
class select extends database{
// Instance variables
private $id;
public $table;
public $column;
public $sql;
public $result = array();
// Methods - Behavior
public function selectQuery($table){
global $con;
$sql = $this->sql;
$sql = "SELECT * FROM {$table}";
$result = $this->con->query($sql);
while($row = $result->fetch_object()){
//iterate all columns from the selected table
//and return it someway.
}
}
}
$selectQuery = new select();
Here is my database class
require_once(LIB_PATH.DS."config.php");
class database
{
public $con;
public $result = array();
public function __construct()
{
$this->con = new mysqli(DB_HOST,DB_USERNAME,DB_PASSWORD,DB);
if($this->con->connect_error){
die($this->con->connect_error);
}
}
}
$db = new database();
What I’m doing so far is connecting to my Database with mysqli then I extend my select class from my database class so I can get the connection and then I want to select all from.
Advertisement
Answer
First of all, your select
class is extending the database
class, so there’s no point re-declaring public $result = array();
in select
class, it’s not even necessary actually.
Second, since you’re not using object properties outside of the class, make them private
.
And finally, since you’re dealing with variable number of arguments, make use of func_get_args()
function.
Here’s the reference:
Well based on your requirement, the solution would be to send variable number of arguments to selectQuery()
method and use func_get_args()
to get an array comprising a function’s argument list.
- The first argument is the table name and rest of the arguments are column names(if provided)
- If only one argument is passed to the function then the
SELECT
query would beSELECT * FROM table_name
- And if more than one argument is passed to the function then the
SELECT
query would beSELECT column1, column2, column3, ... FROM table_name
So your code should be like this:
require_once(LIB_PATH.DS."config.php");
class database
{
public $con;
public function __construct()
{
$this->con = new mysqli(DB_HOST,DB_USERNAME,DB_PASSWORD,DB);
if($this->con->connect_error){
die($this->con->connect_error);
}
}
}
class select extends database{
// Instance variables
private $table;
private $columns;
private $sql;
// Methods - Behavior
public function selectQuery(){
// incrementally construct the query
$this->sql = "SELECT ";
// get the argments passed to the function
$this->columns = func_get_args();
// the first argument would be the table name and rest of the arguments are coolumn names(if provided)
$this->table = $this->columns[0];
// if only one argument is passed to the function,
// then SELECT query would be SELECT * FROM table_name
if(count($this->columns) == 1){
$this->sql .= "* ";
}else{
// if more than one argument is passed to the function,
// then the SELECT query would be SELECT column1, column2, column3, ... FROM table_name
for($i = 1; $i < count($this->columns); ++$i){
$this->sql .= $this->columns[$i] . ",";
}
// remove the last , from the $sql string
$this->sql = rtrim($this->sql, ",");
}
$this->sql .= " FROM $this->table";
// execute the query
$result = $this->con->query($this->sql);
// return the result set
return $result;
}
}
$obj = new select();
$table = "YOUR_TABLE_NAME";
$column1 = "COLUMN_1";
$column2 = "COLUMN_2";
$result = $obj->selectQuery($table, $column1, $column2);
while($row = $result->fetch_assoc()){
// display it
echo $row[$column1] . " " . $row[$column2] . "<br />";
}
$result = $obj->selectQuery($table);
while($row = $result->fetch_assoc()){
// display it
}