db = $db;
$this->query = $query;
}
public function __toString()
{
return $this->getQuery();
}
public function __debugInfo() {
return [
//'db:protected' => get_class($this->db) ." Object",
'db:protected' => $this->db,
'status:protected' => $this->status,
'error:protected' => $this->error,
'query:protected' => $this->query,
'duration:protected' => $this->duration,
//'recordset:protected' => get_class($this->recordset) ." Object",
'recordset:protected' => $this->recordset,
'results_rows_count:protected' => $this->results_rows_count,
'affected_rows_count:protected' => $this->affected_rows_count,
];
}
public function fetchColumn($column_name)
{
if ($this->status == 'ready') {
$this->execute();
}
return $this->recordset->fetchColumn($column_name);
}
public function fetchOne()
{
if ($this->status == 'ready') {
$this->execute();
}
return $this->recordset->fetchOne();
}
public function fetchAll()
{
if ($this->status == 'ready') {
$this->execute();
}
return $this->recordset->fetchAll();
}
public function getQuery()
{
return $this->query;
}
public function getStatus()
{
return $this->status;
}
public function execute($query=null, $params=[])
{
if (empty($query)) {
$query = $this->query;
}
if (! empty($params)) {
$parts = explode('?', $query);
$query = array_shift($parts);
$i = 1;
foreach ($params as $param) {
if (empty($parts)) {
throw new \Exception('SqlQuery::execute() => params error (1) [QUERY: ' . preg_replace('/\s+/', ' ', $query) . ' ]');
}
$param = $this->db->escape($param);
$query .= $param;
$query .= array_shift($parts);
$i++;
}
if (! empty($parts)) {
throw new \Exception('SqlQuery::execute() => params error (2) [QUERY: ' . preg_replace('/\s+/', ' ', $query) . ' ]');
}
}
$this->query = preg_replace('/\s+/', ' ', $query);
$this->status = 'running';
$ts_start = microtime(true);
//echo $query . "
";
$rs = $this->db->getDriver()->execute($query);
//pre($rs);
$ts_end = microtime(true);
$this->duration = $ts_end - $ts_start;
$this->recordset = $rs;
$this->db->setLastQuery($this);
$error_code = $this->db->getDriver()->getConn()->errno;
if ($error_code !== 0) {
// query error
$error_msg = $this->db->getDriver()->getConn()->error;
$this->error = $error_msg;
$this->status = 'error';
if ($this->db->throwOnSqlError) {
throw new \Exception('SqlQuery::execute() => DB error [' . $error_code . '] : ' . $error_msg . PHP_EOL . '[QUERY: ' . preg_replace('/\s+/', ' ', $query) . ' ]');
}
//return null;
} else {
$this->status = 'success';
}
$this->results_rows_count = $rs->getRowsCount();
$this->affected_rows_count = $this->db->getDriver()->getAffectedRowsCount();
if (strpos($query, "SQL_CALC_FOUND_ROWS")) {
$found_rows = $this->execute('SELECT FOUND_ROWS() AS found_rows')->oneField('found_rows');
} else {
$found_rows = null;
}
return $this;
}
public function executeSelect($query, $params=[])
{
// Alias of executeSelectAll
return $this->executeSelectAll($query, $params);
}
public function executeSelectOne($query, $params=[])
{
return $this->execute($query, $params)->fetchOne();
}
public function executeSelectAll($query, $params=[])
{
return $this->execute($query, $params)->fetchAll();
}
public function executeInsert($query, $params=[])
{
$this->execute($query, $params);
return $this->insert_id();
}
public function executeInsertAll($query, $params=[])
{
return $this->execute($query, $params);
}
public function executeUpdate($query, $params=[])
{
$this->execute($query, $params);
return $this->affected_rows_count;
}
public function executeDelete($query, $params=[])
{
$this->execute($query, $params);
return $this->affected_rows_count;
}
/* ### */
public function tableSelect($table_name, $where=[], $options=[])
{
// Alias of tableSelectAll
return $this->tableSelectAll($table_name, $where, $options)->all();
}
public function tableSelectAll($table_name, $where=[], $options=[])
{
$table = new SqlTable($this->db, $table_name);
$query = $table->buildQuery($where, $options);
return $this->executeSelectAll($query);
}
public function tableSelectOne($table_name, $where=[], $options=[])
{
if (empty($options)) {
$options = [];
}
$options['limit'] = 1;
return $this->tableSelect($table_name, $where, $options)->one();
}
public function tableInsert($table_name, $values=[], $options=[])
{
$this->tableInsertAll($table_name, [$values], $options);
return $this->db->getInsertId();
}
public function tableInsertAll($table_name, $inserts=[], $options=[])
{
$table = new SqlTable($this->db, $table_name);
return $table->insertAll($inserts, $options);
}
public function tableUpdate($table_name, $updates=[], $where=[], $options=[])
{
$table = new SqlTable($this->db, $table_name);
return $table->update($updates, $where, $options);
}
public function tableDelete($table_name, $where=[], $options=[])
{
$table = new SqlTable($this->db, $table_name);
return $table->delete($where, $options);
}
}