|
|
|
| Написал свой класс по работе с бд, пока все нравится и удобный вроде бы, да и в общем очень нравится, правда была проблема с insertom, когда много кода html вводил вроде бы не отправлялось, для этого пришлось сделать такой режим guard :) по умол. он включен и если он вкл., то данные пролазят через htmlspecialchars и mysql_real_escape_string, а если нет, то данные отправляются без проверки.. может подскажите в чем проблема может быть? Или все нормально? Да и в общем можете пожалуйста сказать - им серьезно пользоваться можно?
я его даже прокомментировал!
<?php
class Mysql {
/**
* @var bool
* id подключения к бд
*/
public $id = false;
/**
* @var bool
* статус подключения
*/
public $status = false;
/**
* @var string
* содержит все ошибки, которые могут возникнуть
*/
public $error = '';
/**
* соединения с бд
*
* @param $host
* адрес сервера MySQL
* @param $user
* логин
* @param $password
* пароль
* @param $database
* название бд
* @return bool
* соединилсь - true, иначе false
*/
public function connect($host, $user, $password, $database) {
if($this->id = @mysql_connect($host, $user, $password)) {
$this->status = true;
} else {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
if(!@mysql_select_db($database)) {
$this->status = false;
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
return true;
}
/**
* установка кодировки работы с бл
*
* @param $charset
* кодировка соединения с бд
* @return bool
* успешно - true, иначе false
*/
public function charset($charset) {
if($this->status == false) {
return false;
}
mysql_query("SET character_set_client='".$charset."'");
mysql_query("SET character_set_results='".$charset."'");
mysql_query("SET collation_connection='".$charset."_general_ci'");
}
/**
* вставка данных
*
* @param $table
* название таблицы
* @param array $column
* массив названий колонок
* @param array $values
* массив значений
* @param bool $guard
* безопасный режим, включен - true, иначе false
* @return bool
* успеная отправка true, иначе false
*/
public function insert($table, $column = array(), $values = array(), $guard = true) {
if($this->status == false) {
return false;
}
for($i=0;$i<count($column);$i++) {
$column[$i] = '`'.$column[$i].'`';
}
for($i=0;$i<count($values);$i++) {
if($guard) {
$values[$i] = mysql_real_escape_string(htmlspecialchars($values[$i], ENT_QUOTES));
}
if(empty($values[$i])) {
$values[$i] = 'null';
} else {
$values[$i] = '\''.$values[$i].'\'';
}
}
$column = implode(", ", $column);
$values = implode(", ", $values);
$sql = mysql_query("INSERT INTO `".$table."` (".$column.") VALUES (".$values.")");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
}
/**
* получение массива всех даных по таблице
*
* @param $table
* название таблицы
* @return array|bool
* успешно - true, иначе false
*/
public function get($table) {
if($this->status == false) {
return false;
}
$sql = mysql_query("SELECT * FROM `".$table."`");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
while($row = mysql_fetch_array($sql, MYSQL_BOTH)) {
$res[] = $row;
}
return $res;
}
/**
* получение массива данных по колонке
*
* @param $table
* название таблицы
* @param $column
* название колонки
* @return array|bool
* успешно - true, иначе false
*/
public function get_column($table, $column) {
if($this->status == false) {
return false;
}
$sql = mysql_query("SELECT * FROM `".$table."`");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
while($row = mysql_fetch_array($sql, MYSQL_BOTH)) {
$res[] = $row[$column];
}
return $res;
}
/**
* получение массива данных
*
* @param $table
* название таблицы
* @param $data
* название значение, которое требуется проверить
* @param $column
* название колонки, с которой сверяем
* @param $value
* название значения, с которым сверяем
* @return bool
* успешно - true, иначе false
*/
public function count($table, $data, $column, $value) {
if($this->status == false) {
return false;
}
$sql = mysql_query("SELECT `".$data."` FROM `".$table."` WHERE ".$column." = '".$value."'");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
if(mysql_num_rows($sql) > 0) {
return true;
} return false;
}
/**
* получение массива данных по определенному значению
*
* @param $table
* название таблицы
* @param $column
* название колонки, с которой сверяем
* @param $value
* название значения, с которым сверяем
* @return array|bool
* успешно - true, иначе false
*/
public function get_once($table, $column, $value) {
if($this->status == false) {
return false;
}
$sql = mysql_query("SELECT * FROM `".$table."` WHERE ".$column." = '".$value."'");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
while($row = mysql_fetch_array($sql, MYSQL_BOTH)) {
return $row;
}
}
/**
* обновление данных по колонке и значению
*
* @param $table
* название таблицы
* @param $setColumn
* название колонки, которой присваиваем новое значение
* @param $setValue
* название значение, которое присваиваем
* @param $column
* название колонки, с которой сверяем
* @param $value
* название значения, с которым сверяем
* @param bool $guard
* безопасный режим, включен - true, иначе false
* @return bool
* успешно - true, иначе false
*/
public function update($table, $setColumn, $setValue, $column, $value, $guard = true) {
if($this->status == false) {
return false;
}
if($guard) {
$setValue = mysql_real_escape_string(htmlspecialchars($setValue, ENT_QUOTES));
}
if($column == 'id') {
$sql = mysql_query("UPDATE `".$table."` SET `".$setColumn."` = '".$setValue."' WHERE ".$column." = '".intval($value)."'");
} else {
$sql = mysql_query("UPDATE `".$table."` SET `".$setColumn."` = '".$setValue."' WHERE ".$column." = '".$value."'");
}
// $this->debug("UPDATE `".$table."` SET `".$setColumn."` = '".$setValue."' WHERE ".$column." = '".$value."'");
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
}
/**
* удаление данных по колонке и значению
*
* @param $table
* название таблицы
* @param $column
* название колонки, с которой сверяем
* @param $value
* название значения, с которым сверяем
* @return bool
* успешно - true, иначе false
*/
public function delete($table, $column, $value) {
if($this->status == false) {
return false;
}
if($column == 'id') {
$sql = mysql_query("DELETE FROM `".$table."` WHERE `".$column."` = ".intval($value)."");
} else {
$sql = mysql_query("DELETE FROM `".$table."` WHERE `".$column."` = ".$value."");
}
if(!$sql) {
$this->error .= '<p>ОШИБКА в функции '.__FUNCTION__.': <b>'.mysql_error().'</b></p>';
return false;
}
}
/**
* закрывает соединения по по его id
*
* @param null $id
* id соединения
*/
public function close($id = null) {
$this->status = false;
if($id) {
$id = $this->id;
}
mysql_close($id);
}
/**
* ф-ция для отладки
*
* @param $obj
* имя переменной, массива и т.д.
* @param bool $param
* true - pritn_r();, false - var_dump();
*/
public function debug($obj, $param = true) {
echo("<pre style='padding: 30px;overflow:visible;z-index:9999;position:relative;background:#fff;color:000;'>\n\n\n");
if($param) {
print_r($obj);
} else {
var_dump($obj);
}
echo("\n\n\n</pre>");
}
}
$mysql = new Mysql();
?>
|
| |
|
|
|
|
|
|
|
для: belkin
(18.03.2012 в 10:14)
| | это очередная обертка из "функций", ООП тут и не пахнет
причем вы наглухо убили гибкость SQL жесткими рамками определенных запросов | |
|
|
|
|
|
|
|
для: Valick
(18.03.2012 в 10:48)
| | А можете пожалуйста подробней, где именно жесткие рамки? И если не трудно, может есть пример хорошего класса для работы с бд, чтобы я хоть посмотрел, как там устроенно(если не сложно, пожалуйста). | |
|
|
|
|
|
|
|
для: Belkin
(18.03.2012 в 16:50)
| | >А можете пожалуйста подробней, где именно жесткие рамки?
Как?
взять данные не из одной таблицы а из двух сразу?
удалить из двух или более таблиц?
построить более сложное условие, чем соответствие одного поля?
Писать еще и еще функции?
Может проще запрос не привязывать к функциям, а передавать его в функцию параметром?
Вряд ли это можно назвать правильным примером, по отношению к вашему вопросу, но какой никакой:
<?php
class db
{
function query($sql, $htmlspecialchars = true, $connect)
{
$resousre = mysql_query($sql, $connect);
if ($resousre)
{
if (is_bool($resousre)) return true;
$data = array();
if (mysql_num_rows($resousre) > 0)
{
while ($row = mysql_fetch_assoc($resousre))
{
if ($htmlspecialchars === false)
$data[] = $row;
else
$data[] = my_htmlspecialchars($row);
}
}
return $data;
}
else return debug(mysql_error());
}
public function debug($param)
{
}
}
// примеры вызовов
$result = db::query('SELECT * FROM `table`');
$result = db::query('SELECT * FROM `table`', false);
$sql = 'SELECT * FROM `table`';
$result = db::query($sql, true, $db_1);
// функция my_htmlspecialchars
function my_htmlspecialchars($data)
{
if (is_array($data)) return array_map('my_htmlspecialchars', $data);
else return htmlspecialchars($data);
}
?>
|
| |
|
|
|
|
|
|
|
для: Belkin
(18.03.2012 в 16:50)
| | http://pear.php.net/manual/en/package.database.mdb2.php
там несколько классов, насколько они хороши я не знаю
___
просто чтобы у вас получилось ООП вам нужно понять его принципы и один из них это инкапсуляция
задача класса для работы с базой данных абстрагировать код от какой-то конкретной базы данных и адаптировать запрос под конкретный диалект используемый в подключенной конкретной базе
грубо говоря основному коду по барабану какая БД (MySQL, PostgreSQL или Oracle) подключена, код остается неизменным | |
|
|
|
|