Jump to content

Контроль над ошибками


Bolmazov
 Share

Recommended Posts

Прихожу к мысли (и это нормально), что Писать код я худо-бедно научился, в том смысле, что могу реализовать логику приложения. Но вот в случае когда что-то в логике пойдет не так (порграмма не найдет необходимый файл, не подключится к БД и т.п.) всё летит в тар-тарары бизнес классом! Моя проблема в том, что я не знаю когда, где ловить ошибки. Попробую пояснить на примере:

class Connection{
private $connect_db = null;
public function __construct()
{
if (!$this->connect_db) $this->connect_db = $this->set_connect_db();
}

public function get_connect_db() return $this->connect_db;
private function set_connect_db() return new PDO('mysql:host=localhost;dbname=exemple', root);
}
$connect = new Connection;
class PAGE{
private $db = null;
public function __construct($connect, $page=null)
{
$this->db= $connect->get_connect_db();

}
public function get_table(){

// НУ И ДАЛЕЕ Я НАПРОПАЛУЮ ПОЛЬЗУЮСЬ ДАРАМИ ПЕРЕМЕННОЙ $this->db
}

$exemple= new PAGE($connect);
$exemple->get_table();
// НУ И ДАЛЕЕ Я НАПРОПАЛУЮ ПОЛЬЗУЮСЬ ДАРАМИ ПЕРЕМЕННОЙ $exemple->get_table()

Что хочется покрасить в связи с этим примером:

Где следует делать проверки? Как их обрабатывать (в общем случае)?

Link to comment
Share on other sites

у меня все тупо и просто - вот мой класс базы:

<?php



class mysql
{

public $connect;
public $error;
public $errno;
public $query_count;
public $query_result;
public $query_text;


function mysql()
{


global $kernel;


}

function do_connect()
{

global $kernel;

$this->connect = mysql_connect($kernel->config['hostname'], $kernel->config['username'], $kernel->config['userpass'] );


$this->error = mysql_error();

$this->errno = mysql_errno();

mysql_select_db( $kernel->config['database'] );

$this->error = mysql_error();
$this->errno = mysql_errno();

$this->query( "SET NAMES '". $kernel->config['charset']."'" );
$this->query( "SET CHARACTER SET '". $kernel->config['charset']."'" );

}

function query( $text )
{
global $kernel;
$this->query_count++;
$this->query_text = $text;
$this->query_result = mysql_query($text);

$this->error = mysql_error();
$this->errno = mysql_errno();
if(!empty($this->error))
{
$kernel->display->vars['error'] = $this->error;
$kernel->display->vars['errno'] = $this->errno;
$kernel->display->vars['query'] = $this->query_text;
$kernel->display->do_output( 'sql_error' );
die();


}
}


function get_num_rows()
{

global $kernel;

return mysql_num_rows( $this->query_result );

}


function fetch_row()
{
global $kernel;
$res = mysql_fetch_array( $this->query_result, MYSQL_ASSOC );
//$res = $kernel->security->return_string($res);
return $res;

}

function fetch_all()
{
global $kernel;
$rows = array();
while( $r = $this->fetch_row() ) $rows[] = $r;
return $rows;
}

function do_insert( $table, $fields )
{
global $kernel;
$this->simple_construct( array( 'insert' => $table, 'fields' => $fields ) );
$this->query($this->query_text);

}
function do_replace( $table, $fields )
{
global $kernel;
$this->simple_construct( array( 'replace' => $table, 'fields' => $fields ) );
$this->query($this->query_text);

}


function do_update( $table, $fields, $where, $limit = -1 )
{
global $kernel;
$inside_data = array( 'update' => $table, 'set' => $fields, 'where' => $where );
if( $limit != -1 ) $inside_data[ 'limit' ] = $limit;

$this->simple_construct( $inside_data );
$this->query($this->query_text);

}



function do_delete( $table, $where, $limit = -1 )
{
global $kernel;
$inside_data = array( 'delete' => $table, 'where' => $where );
if( $limit != -1 ) $inside_data[ 'limit' ] = $limit;

$this->simple_construct( $inside_data );
$this->query($this->query_text);

}

function simple_construct( $params )
{
global $kernel;
foreach( $params as $key => $value ) $params[ strtolower( $key ) ] = $value;
$this->query_text = '';
if( isset( $params['select'] ) ) $this->query_text .= $this->construct_select_query( $params );
if( isset( $params['replace'] ) ) $this->query_text .= $this->construct_replace_query( $params );
if( isset( $params['update'] ) ) $this->query_text .= $this->construct_update_query( $params );
if( isset( $params['delete'] ) ) $this->query_text .= $this->construct_delete_query( $params );
if( isset( $params['insert'] ) ) $this->query_text .= $this->construct_insert_query( $params );

}
function construct_select_query( $params )
{
global $kernel;
$text = 'SELECT '. $params['select'] .' FROM `'. $kernel->config['prefix'] . $params['from'] .'`';

if( !empty($params['where']) ) $text .= ' WHERE '. $params['where'];

if( !empty($params['order']) ) $text .= ' ORDER BY '. $params['order'];

if( !empty($params['limit']) ) $text .= ' LIMIT '. $params['limit'];

return $text;

}



function construct_update_query( $params )
{
global $kernel;
$text = 'UPDATE `'. $kernel->config['prefix'] . $params['update'] .'` SET ';

if( is_array( $params['set'] ) )
{
foreach( $params['set'] as $key => $value )
{
$key = preg_replace( "#`(.+?)`#si", "\\1", $key );
$text .= "`". $key ."` = '". $value ."', ";
}
$text = substr( $text, 0, strlen( $text ) - 2 );
}
else
{
$text .= $params['set'];
}

if( !empty($params['where']) ) $text .= ' WHERE '. $params['where'];

if( !empty($params['limit']) ) $text .= ' LIMIT '. $params['limit'];

return $text;

}



function construct_delete_query( $params )
{
global $kernel;
$text = 'DELETE FROM `'. $kernel->config['prefix'] . $params['delete'] .'` ';

if( !empty($params['where']) ) $text .= ' WHERE '. $params['where'];

if( !empty($params['limit']) ) $text .= ' LIMIT '. $params['limit'];

return $text;

}



function construct_insert_query( $params )
{
global $kernel;
$text = 'INSERT INTO `'. $kernel->config['prefix'] . $params['insert'] .'`';

$fields = "(";
$values = "VALUES (";

foreach( $params['fields'] as $field => $value )
{
$fields .= "`{$field}`, ";
$values .= $value === false ? 'null, ' : "'{$value}', ";
}

$values = substr( $values, 0, strlen( $values ) - 2 ).")";
$fields = substr( $fields, 0, strlen( $fields ) - 2 ).")";

$text .= $fields .' '. $values;

return $text;
}

function construct_replace_query( $params )
{
global $kernel;

$text = 'REPLACE INTO `'. $kernel->config['prefix'] . $params['replace'] .'`';

$fields = "(";
$values = "VALUES (";

foreach( $params['fields'] as $field => $value )
{
$fields .= "`{$field}`, ";
$values .= $value === false ? 'null, ' : "'{$value}', ";
}

$values = substr( $values, 0, strlen( $values ) - 2 ).")";
$fields = substr( $fields, 0, strlen( $fields ) - 2 ).")";

$text .= $fields .' '. $values;

return $text;
}
}

?>

Link to comment
Share on other sites

Хорошо, но если я правильно понял основное внимание здесь уделено составлению запроса ($test) который выполняется методом query( $text ) при помощи выражения $this->query_result = mysql_query($text);

Сам запрос ($text) пусть даже на инъекцию не проверяется?

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy