[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: класс dataBase
Dron19
Привет, хочу посоветоваться, вот можешь посмотреть код и сказать, чем он кривой с твоей точки зрения, так как сразу все не рассмотришь, может

я что-то не учел или не заметил, в общем пишу класс, для разработчиков РНР приложений, что бы он мог облегчить ему жизнь. Вот код, после кода

будут еще мои слова :D

if(get_magic_quotes_gpc()) {
define('__MAGIC',1);
}
else {
define('__MAGIC',0);
}

class dataBase {

public $result; # Это свойство содержит дескриптор обращения к бд
public $errno; # Это свойство содержит номер ошибки при обращении к бд, если она была
public $error; # Это свойство содержит ошибку при обращении к бд, если она была

//********************************************************************************************


private function errors() {
if($this->num == 0) echo 'В базе данных не совпало ни одно поле<br>';
if($this->errno != 0)
echo 'Ошибка номер ' . $this->errno . ' гласит - ' . $this->error;
}

//********************************************************************************************

private function sql_where($sql) {
if(strpos($sql,"&&")) {
$sql = explode("&&",$sql);
$size = sizeof($sql);
for($i = 0; $i < $size; $i++) {
$sql_divide = explode("=",$sql[$i]);
$sql_divide[0] = "`" . trim($sql_divide[0]) . "`";
$sql_divide[1] = "'" . trim($sql_divide[1]) . "'";
$sql[$i] = join('=',$sql_divide);
}
return join('&&', $sql);
}
else {
$sql = explode("=",$sql);
$sql[0] = "`" . trim($sql[0]) . "`";
$sql[1] = "'" . trim($sql[1]) . "'";
$sql = join('=',$sql);
return $sql;
}
}



//********************************************************************************************

private function anti_sequriti($data,$int = 0) {
$anti_bag = ($int == 0) ? '`' : "'";
if(strpos($data,',')) {
$data = explode(",",$data);
$cols_size = sizeof($data);
if($int != 0 && $int != 1) die('Переменная $int может принимать только два значения: 1 или 0');
for($i = 0; $i < $cols_size; $i++) {
$data[$i] = $anti_bag . $data[$i] . $anti_bag;
}

$data = join(',',$data);
}
else {
$data = $anti_bag . $data . $anti_bag;
}
return $data;
}

//*********************************************************************************************


public function __construct($host,$name,$password,$bd) {
$db = mysql_connect($host,$name,$password) or die(mysql_errno() . ' ' . mysql_error());
mysql_select_db($bd,$db) or die(mysql_errno() . ' ' . mysql_error());
mysql_query("SET NAMES utf-8");
}


public function insert($table, $cols, $values) {

//*********************************************************************************************

if($cols == '*' || $cols == '') die('При вставке данных в базу данных, нужно указать поля через
запятую.'
);
if($values == '') die('Третий аргумент должен быть заполнен');


if(__MAGIC) {

$values = mysql_real_escape_string(stripslashes($values));
$cols = mysql_real_escape_string(stripslashes($cols));
$table = mysql_real_escape_string(stripslashes($table));

}

elseif(__MAGIC == 0) {

$table = mysql_real_escape_string($table);
$cols = mysql_real_escape_string($cols);
$values = mysql_real_escape_string($values);

}

$cols = $this->anti_sequriti($cols);
$values = htmlspecialchars($values);
$values = $this->anti_sequriti($values,1);

$query = "INSERT INTO `" . $table . "` (" . $cols . ") VALUES (" . $values . ")";
$this->result = mysql_query($query);
if($this->result) return true;
else {
$this->errno = mysql_errno();
$this->error = mysql_error();
$this->errors();
return false;
}
}


//*****************************************************************************************

public function select($table,$cols,$where = '') {

if($table == '') die('Вы должны указать из какой таблице вытаскивать данные');
if($cols == '') die('Вы должны указать какие поля вытаскивать при совпадении');


if(__MAGIC == 1) {

$where = ($where != '') ? mysql_real_escape_string(stripslashes($where)) : '' ;
$table = mysql_real_escape_string(stripslashes($table));
$cols = mysql_real_escape_string(stripslashes($cols));

}
elseif(__MAGIC == 0) {

$where = ($where != '') ? mysql_real_escape_string($where) : '' ;
$table = mysql_real_escape_string($table);
$cols = mysql_real_escape_string($cols);

}

$cols = $this->anti_sequriti($cols);
$table = $this->anti_sequriti($table);

$query = "SELECT ". $cols . " FROM " . $table;
if($where != '') {
$where = $this->sql_where($where);
$query .= " WHERE " . trim($where);
}
$this->result = mysql_query($query);
if($this->result && mysql_num_rows($this->result) > 0) {
$this->num = mysql_num_rows($this->result);
return true;
}

else {
$this->num = 0;
$this->errno = mysql_errno();
$this->error = mysql_error();
$this->errors();
return false;
}
}


//*****************************************************************************************
}

В общем этот класс пока что умеет только выбирать данные из бд, подключаться к ней и вставлять данные, пока дорабатывать не собираюсь, потому

что нужно мнение других разработчиков.
В общем смотри, краткая инструкция, при объявлении объекта, обязательно надо подключиться к базе, то есть во время создания объекта. Что бы

выполнять запросы к бд, я реализовал(пока что) два метода, insert и select, пример использования

$data->select('tavle','title','id=1 && post=28');

Данные этот класс фильтрует сам, защищает и на выходе выполнится вот такой вот запрос
SELECT `title` FROM `tavle` WHERE `id`='1'&&`post`='28'

Вместо and пока что обязательно нужно вставлять &&(кстати на мой взгляд так более красиво и по РНРшеский :) )
При выборке данных, дескриптор записывается в свойство result, что бы можно было взять оттуда полученные данные.
Если выходит какая-то ошибка, то уже в классе на тот момент реализована проверка, если не найдено не одно поле, то выходит сообщение об этом,

уже лишняя работа при проверке исчезает и если ошибка, то выводится ее номер и текст. На данные момент все.
В дальнейшем по отзывам буду думать, стоит ли дорабатывать. Так вот еще планирую реализовать добавление/удаление таблиц и баз данных,

создание таблиц, очистка таблиц и еще большинство запросов, которыми пользуются в работе с бд в разных фирмах, что бы не писать их самим.

Возможно даже дойду до того, что бы класс мог делать дамп базы и записывать в php файл, в котором автоматом будет прописана функция exit, что

бы не могли просмотреть файл, при распаковке, он бы обрезался и добавлялся в базу. Что касается метода select, еще реализую аргумент, по

умолчанию равный 0, который при значении 1 будет выбранные данные помещать в массив и уже всего лишь сделав запрос на выборку, можно сразу

убить трех зайцев, получить выбранные данные, узнать сколько их всего и данные при этом будут уже защищенные. Также будет реализован php

файл, куда будут помещаться все запросы к бд, этот файл тоже будет закрыт для просмотра, это очень удобно, если допустим на сайте будет

формочка добавления комментариев и злоумышленник захочет прописать туда sql-injection, то этот запрос отпечатается в файле, так же при

наличии интереса, разработчик может написать реализацию добавления ип в этот файл, то есть если человек запрашивает что-то из бд, то его ип

тоже будет написан рядом с запросом и тогда легче будет найти хакера. Так вот самый главный вопрос. Стоит ли дальше дорабатывать? Удобно ли

будет пользоваться классом? Пригодится ли он вообще кому-нибудь или это реально полная лажа? От ваших ответов зависит жизнь скрипта.
Кстати также в этом файле, со скриптом будет по стандарту объявлен объект $data и от него будет происходить управление бд. Жду ответов



Спустя 31 минута, 44 секунды (20.02.2011 - 22:26) Dron19 написал(а):
заранее спасибо за советы..

Спустя 10 минут, 10 секунд (20.02.2011 - 22:37) ApuktaChehov написал(а):
А зачем он нужен? Чем он лучше обычного обращения к БД?

И может ли он сделать, к примеру вот такой запрос:
SELECT order.id, order.cntpt, order.gen_expens, order.order_cost, order.cur_payment, order.payment_type, order.date_form, order.death_line, order_productions.prod_name, order_productions.tiraj
FROM `order`
LEFT JOIN `order_productions` ON order.id = order_productions.order_id
WHERE order.user_id = '" . (int)$_SESSION['user_id'] . "'
ORDER by order.id DESC
LIMIT " . $limit . ", 5

Спустя 1 минута, 53 секунды (20.02.2011 - 22:38) inpost написал(а):
Dron19
сама идея очищать от магических кавычек где-то внутри огромного класса - мне не нравится, не легче сразу на входящем обрезать ненужное?
Стиль как-то поехал весь...
Что-то мне кажется, что это индусский код, всё реализовывается в 2-3 строчки, а тут такой огромный класс...
count - 5 символов, sizeof - 6 символов, а работают, ведь, одинаково (и не спорь, проводил тесты, и сам можешь проверить!)
(int)$int - и нет проблем, а в твоём скрипте его нету, или по крайней мере не видел...

Спустя 15 минут, 31 секунда (20.02.2011 - 22:54) Invis1ble написал(а):
Dron19
Цитата
класс, для разработчиков РНР приложений, что бы он мог облегчить ему жизнь

и чем это он интересно облегчит жизнь, если с помощью него невозможно сделать более сложные запросы?

Спустя 18 часов, 58 минут, 55 секунд (21.02.2011 - 17:53) Гость_dron19 написал(а):
Ну вот я хочу облегчить жизнь, если так будет еще сложней, то не буду делать
inpost, это еще не законченный вариант, тут кстати, если всмотришься в код и поймешь логику, двумя строчками не обойтись.

Спустя 1 минута, 48 секунд (21.02.2011 - 17:55) Гость_Dron19 написал(а):
В общем на сколько я понял дорабатывать не стоит?

Спустя 12 минут, 48 секунд (21.02.2011 - 18:07) T1grOK написал(а):
Почему же, очень даже стоитю Просто у каждого свой стиль программирования. Вы выбрали объектный, с вот такой оберткой над sql.

Спустя 5 минут, 23 секунды (21.02.2011 - 18:13) Zerstoren написал(а):
Dron 19
Посмотрите реализацию библиотеки в Code-Igniter

весьма удобно, качественно и быстро для написания.
Сам сейчас разрабатываю лайт версию такой API для Mysql

Спустя 18 минут, 31 секунда (21.02.2011 - 18:31) Гость_dron19 написал(а):
хм, так если в codeIgniter такой класс уже реализован, то смысл мне его писать? Вы мне скажите, дорабатывать его дальше или нет? Если да, то +, если не, то -

Спустя 7 минут, 41 секунда (21.02.2011 - 18:39) Zerstoren написал(а):
Цитата (Гость_dron19 @ 21.02.2011 - 15:31)
хм, так если в codeIgniter такой класс уже реализован, то смысл мне его писать? Вы мне скажите, дорабатывать его дальше или нет? Если да, то +, если не, то -

Я его пытался перенести) Но он слишком интегрирован в движок. И вынести его нереально.

А еще у него 1600+ строк, хотя либа может состоять вполне из 600 строк.
(пока у меня 170 строк)

Я говорю именно саму идею.
К примеру метод сцепки данных

$db->select('id,text,author')->where('id',123)->get('page')->ro w();
В таком стиле.

А то в вашем случае нужно передать в одну стартовую функцию кучу параметров.
А так все четко быстро понятно.

Как сделать сцепку данных напишу вечером в этой теме.

Спустя 47 минут, 45 секунд (21.02.2011 - 19:27) Гость_dron19 написал(а):
да я и сам знаю как это сделать, не первый год занимаюсь программированием.
Просто я скрипт еще не доделал, по нему толком пока нельзя определить каким он будет, еще поставлю защиту от двойного объявления класса. Воспользуюсь синглтоном. В общем Вы за то что бы я дорабатывал скрипт?

Спустя 2 минуты, 18 секунд (21.02.2011 - 19:29) Invis1ble написал(а):
Гость_dron19
Цитата
В общем Вы за то что бы я дорабатывал скрипт?

это тебе решать. В любом случае - хуже не будет, может что-то новое узнаешь.

Спустя 9 минут (21.02.2011 - 19:38) twin написал(а):
Самое бесполезное занятие - писать класс БД. Никакой практической пользы от него обычно нет.

1. Путается синтаксис, что никоем образом не упрощает разработку. Мне вот прям физически противно корежить SQL всякими плэйсхолдерами и прочими вопросиками и чушью. Ну а если синтаксис портится настолько досконально, как в этом классе, ничего кроме желания немедленно его выкинуть, не возникает.

2. Умоляются возможности SQL, ибо для того, чтобы работать с ним полноценно и 1600 строк явно не хватит.

3. Соответственно неоправданно жрется ресурс, потому как весь этот здоровущий объект придется постоянно держать в памяти, даже при небольшом запросике плана count(*)

Ну и в любой момент может так подвести под монастырь... При каком то сложном и нестандартном запросе. И класс не переделать - полторы тышшы строк, и весь скрипт на нем написан. Придется лепить костыль или с позором, потупив глазки, писать обычную mysql_query().

Я не именно этот класс имею ввиду. Этот вообще ничего не умеет и не может. Я про монструозные надстройки всяких codeIgniter'ов и прочих зендов.

Занимались бы чем-нибудь действительно полезным.

Спустя 36 минут, 23 секунды (21.02.2011 - 20:14) Zerstoren написал(а):
Твин, подобные классы как минимум гарантия от (забыл поставить mysql_real_escape_string ).
громоздкость? Да.
Тяжелее? Да.

А почему "с позором, потупив глазки"?
Я к примеру при сложных запросах отказываюсь от API и пишу запрос ручками и меня это нисколечко не смущает.

Т.к. фигушки когда-то будет нормальное API для join, а если и будет. То он будет громоздкий фхлам.

API - это не обязанность, а плюшка.

к примеру одна из слабо-юзаемых WHERE `id` IN (5,6,7,8,9,15,74,75)

Что мы будем делать в mysql_query?

$array = array(1,2,3,5,6,7);
$sql = 'SELECT * FROM `page` WHERE `id` IN ('.implode($array,',').')';


А что мы запишем если будем использовать API?

$array = array(1,2,3,5,6,7);
$db->where_in('page',$array)->get('page');


Работает медленнее но какая у нас цель для постройки рядового сайта?
Сделать сайт как можно быстрее.

Если это крупный проект, то конечно такой класс не покатит.

Спустя 32 минуты, 46 секунд (21.02.2011 - 20:47) twin написал(а):
Цитата
А что мы запишем если будем использовать API?

Не вижу экономии во времени. Пара символов с учетом копипаста или автозаполнения невсчет.
А вот новые методы нужно помнить. А чуть запарил - вот и потеря времени. Да еще какая.

На кой мне забивать голову этой некчемностью, лучше оствить там место для нюансов чистого SQL. А их в избытке и без этих извращений.

Спустя 49 минут, 1 секунда (21.02.2011 - 21:36) Гость_dron19 написал(а):
twin, просто я так подумал, тебе не нравится, а другим может и понравится, может реально кто-то признает. Да и еще самому интересно smile.gif Все равно спасибо тебе за отзыв wink.gif

Спустя 1 час, 26 минут, 20 секунд (21.02.2011 - 23:03) Гость_dron19 написал(а):
Вот метод update, что самое плохое, так это то, что он в среднем раз 5-6 медленней работает чем обычный запрос

public function update($table,$cols,$values,$where) {

if($table == '') die('Вы должны указать таблицу в которой хотите изменить поля');
if($cols == '') die('Вы должны указать в каких полях хотите сделать изменения');
if($values == '') die('Вы должны указать новые значения полей');
if($where == '') die('Вы должны указать WHERE');

$this->select($table,$cols,$where);
if($this->num > 0) {

if(__MAGIC == 1) {

$where = mysql_real_escape_string(stripslashes($where));
$table = mysql_real_escape_string(stripslashes($table));
$cols = mysql_real_escape_string(stripslashes($cols));
$values = mysql_real_escape_string(stripslashes($values));

}
else {

$where = mysql_real_escape_string($where);
$table = mysql_real_escape_string($table);
$cols = mysql_real_escape_string($cols);
$values = mysql_real_escape_string($values);

}

$table = $this->anti_sequriti($table);
$cols = $this->anti_sequriti($cols);
$values = $this->anti_sequriti($values,1);
$where = $this->sql_where($where);
if(strpos($cols,",") || strpos($values,",")) {
if((strpos($cols,",") && !strpos($values,",")) || (!strpos($cols,",") && strpos($values,","))) die('Неккоректно перезаписываете поля');
$cols = explode(",",$cols);
$values = explode(",",$values);
$size = sizeof($cols);
$sizer = sizeof($values);
if(($size > $sizer) || ($size < $sizer)) {
die('Разное количество изменяемых полей');
unset($sizer);
}
for($i = 0; $i < $size; $i++) {
if($i < $size - 1) $in = ','; else $in = NULL;
$pols .= $cols[$i] . '=' . $values[$i] . $in;
}
}
else $pols = $cols . '=' . $values;

$query = "UPDATE " . $table . " SET " . $pols . " WHERE " . $where;
echo htmlspecialchars($query) . "<br>";
$this->result = mysql_query($query);

if($this->result) return true;
else {
$this->errno = mysql_errno();
$this->error = mysql_error();
$this->errors();
return false;
}
}

}


Спустя 49 секунд (21.02.2011 - 23:03) Гость_dron19 написал(а):
Но этот метод обрабатывает запросы, а я проверял с необработанным вручную запросом.

Спустя 3 минуты, 7 секунд (21.02.2011 - 23:07) Гость_dron19 написал(а):
Если писать запрос вручную и обрабатывать его, то класс работает медленней в 2 - 3 раза

Спустя 23 секунды (21.02.2011 - 23:07) Гость_dron19 написал(а):
результаты огорчают

Спустя 8 минут, 46 секунд (21.02.2011 - 23:16) Dron19 написал(а):
постараюсь еще сбить скорость, что бы хотя бы в полтора раза медленней

Спустя 24 минуты, 55 секунд (21.02.2011 - 23:41) Dron19 написал(а):
Еще постараюсь реализовать такую фишку, вот если сайт работает на мускуле и начальник потребовал перенести сайт на другой хост, а там только и примеру постгре база, перенеся сайт, просто в самом начале изменить слово с мускула на постгре и готово, сайт работает на другой базе с немного другими запросами и бд.

Спустя 30 минут, 7 секунд (22.02.2011 - 00:11) Zerstoren написал(а):
Вы думаете начальнику есть дело у кого стоит сайт?
Ему главное чтоб он был доступен 60/60/24/7/365

Если конечно он не шарит начальник

А ваш запрос сильно тяжелый по коду.
Не проще ли сделать

function update($tabl,$value,$where) {
if(! is_array($value)) {
die('Ne massiv');
}

foreach($value as $keys=>$vals) {
$key[] = mysql_real_escape_string($keys);
$val[] = mysql_real_escape_string($vals);
}
$keys = implode($key,',');
$vals = implode($val,'","');

// и т.д. думаю вы поняли
/*
* в массиве $value передаем данные типа
* ключ (Поле для замены) => значение (значение поля для замены)
*/

}


Могут быть ошибки, т.к. накидал за 3 минуты

Спустя 13 минут, 17 секунд (22.02.2011 - 00:24) Dron19 написал(а):
Начальнику то все равно, но программисту какого? Все запросы к функции переписывать, в в классе указал название бд и он сам подставил все запросы. Ради такого можно и пожертвовать скоростью

Спустя 3 часа, 2 минуты, 24 секунды (22.02.2011 - 03:26) glock18 написал(а):
Цитата (Dron19 @ 21.02.2011 - 21:24)
Начальнику то все равно, но программисту какого? Все запросы к функции переписывать, в в классе указал название бд и он сам подставил все запросы. Ради такого можно и пожертвовать скоростью


есть такое понятие фреймворк, основа то бишь. и как-то в программерской среде стало принято, что фреймворк никогда не должен подвергаться изменениям для решения одной единственной задачи, а должен давать варианты для внесения необходимых изменений извне.

практической пользы я от этого класса для себя лично не вижу по нескольким причинам:
1.

хм, так если в codeIgniter такой класс уже реализован, то смысл мне его писать? Вы мне скажите, дорабатывать его дальше или нет? Если да, то +, если не, то -


приведенный выше листинг, если и претендует на уникальность, то не в лучшем смысле этого слова - класс содержит много, очень много лишнего, и выполнен не лучшим образом.

если пишешь класс для работы с базой данных, то он и должен с ней работать, а не экранировать хтмл-сущности.

а магические anti_секьюрити и иже с ними совершенно не вписываются в рамки. что за секьюрити, и почему анти? беглым взглядом на него можно предположить что эта магия определяет что и какими кавычками нужно выделить, если так, то у этого метода большое будущее (в плане создания проблем).

2. класс предоставляет наискуднейшие возможности в выборке, о чем уже говорили. да, я понимаю, что можно даже запрос с джойном и группировкой выполнить, и даже с вложенными запросами, но я даже боюсь представить в какой из параметров мне придется пихать все это по частям, и в какое чудовище превратится вызов метода select.

не пройдет и пары часов, как существующих возможностей не хватит, и класс придется расширять.

Однозначно класс представляет ценность для тебя, и советую тебе продолжить его разработку, но сперва переосмыслив все сказанное выше, советую так же посмотреть хороший пример, даже не его реализацию, а принцип работы с классом.

Отчасти соглашусь с Твином, очень часто видел совершенно ужасные библиотеки, делающие работу с бд только еще менее удобной, чем она есть. Сначала определись, что ты хочешь получить - систему врапперов для работы с разными субд, простую либу для работы с mysql, ORM или просто нормальный построитель запросов. То что я вижу сейчас - нечто среднее между всем этим. Создать хороший гибрид этого всего можно, но оно делается совсем не так просто, а потому советую остановиться на чем-то одном для начала.

как я бы разделил эти варианты:
1. система врапперов - это один из вариантов решения проблемы миграции с одной субд на другую, но часто синтаксис запросов меняется при миграции, так что код придется шерстить почти наверняка, если только не реализовать под эгидой врапперов еще построитель запросов.

2. простая либа - ну, самое нужное от такой либы - вставка, обновление и прочие подобного плана запросы (replace, insert on duplicate key update), позволяющие в качестве параметра принимать данные массивом. так как часто работа проходить именно с массивами, то перегонять их вручную в запрос ой как влом, тем более не забывай что выполнять 20000 инсертов по 1 строке гораздо хуже, чем 200 инсертов по 100 строк.

3. ORM - почитай, его гораздо сложнее реализовать, чем простой билдер запросов, но обычно он совершенно не нужен ввиду очевидных вытекающих требований к возвращаемым объектам.

4. билдер - та же либа, но позволяющая дополнительно строить запросы типа select. это ты тоже попробовал сделать, и я тебе тут настоятельно советую - посмотри примеры(РАСРАС), если все таки решишь делать такое. предложенный вариант совершенно неудобен, да и слишком ограничен. без ограничений совсем тоже едва ли получится, делай все только с оглядкой на удобство будущего использования.

Успехов, в общем ;)

Спустя 2 минуты, 37 секунд (22.02.2011 - 03:29) glock18 написал(а):
Dron19
и кстати да, облегчи методы все, которые решишь оставить. вставка и обновление, например, делаются буквально в 10-15 строк

Спустя 4 часа, 7 минут, 24 секунды (22.02.2011 - 07:36) twin написал(а):
dron19
Цитата
twin, просто я так подумал, тебе не нравится, а другим может и понравится, может реально кто-то признает. Да и еще самому интересно  Все равно спасибо тебе за отзыв
Дело не в том, нравится кому или нет. Ты конечно пиши, раз это доставляет тебе удовольствие. Польза от этого конечно же есть. Для тебя. По крайней мере ты узнаешь не понаслышке, что писать класс бд - дело бестолковое и неблагодарное. Ну а в процессе топтания по граблям узнаешь много нового и интересного из того же SQL к примеру.

Правда я бы лучше потратил это время на что то на самом деле полезное и востребованное. А так то - удачи. smile.gif

Спустя 8 минут, 46 секунд (22.02.2011 - 07:45) Dron19 написал(а):
А что именно лишнее тут? Что можно заменить. Просто делал класс то спешкой и перед его написанием ничего не проектировал. Вот и написал...

Спустя 8 минут, 40 секунд (22.02.2011 - 07:54) Dron19 написал(а):
Да в принципе опыта лишнего не бывает.

Спустя 7 часов, 18 минут, 27 секунд (22.02.2011 - 15:12) Dron19 написал(а):
Цитата (Zerstoren @ 21.02.2011 - 21:11)
Вы думаете начальнику есть дело у кого стоит сайт?
Ему главное чтоб он был доступен 60/60/24/7/365

Если конечно он не шарит начальник

А ваш запрос сильно тяжелый по коду.
Не проще ли сделать

function update($tabl,$value,$where) {
if(! is_array($value)) {
die('Ne massiv');
}

foreach($value as $keys=>$vals) {
$key[] = mysql_real_escape_string($keys);
$val[] = mysql_real_escape_string($vals);
}
$keys = implode($key,',');
$vals = implode($val,'","');

// и т.д. думаю вы поняли
/*
* в массиве $value передаем данные типа
* ключ (Поле для замены) => значение (значение поля для замены)
*/

}


Могут быть ошибки, т.к. накидал за 3 минуты

Тут вообще бред написан, тут много ошибок.

Спустя 1 час, 22 минуты, 12 секунд (22.02.2011 - 16:35) Dron19 написал(а):
скорость выполнения этого запроса первый номер

$data->update('test','title,id','testim,1','id=1');

А этого будет обозначена вторым номером

$data = mysql_query("UPDATE `test` SET `title` = '".$text."', `id` = '".$text2."' WHERE id=1");


1) 0.000731
2) 0.000149

1) 0.000706
2) 0.000131

1) 0.000575
2) 0.000147

1) 0.000579
2) 0.000137

1) 0.000631
2) 0.000185

1) 0.000573
2) 0.000137

Эти цифры я получал, каждый раз обновляя два этих запроса, очевидно класс
в полной заднице и при таком показателе его можно помять и выбросить. Подозреваю, что это мой билдер запросов в классе такой медленный. Вот он сам билдер

$table = $this->anti_sequriti($table);
$cols = $this->anti_sequriti($cols);
$values = $this->anti_sequriti($values,1);
$where = $this->sql_where($where);
if(strpos($cols,",") || strpos($values,",")) {
if((strpos($cols,",") && !strpos($values,",")) || (!strpos($cols,",") && strpos($values,","))) die('Неккоректно перезаписываете поля');
$cols = explode(",",$cols);
$values = explode(",",$values);
$size = sizeof($cols);
$sizer = sizeof($values);
if(($size > $sizer) || ($size < $sizer)) {
die('Разное количество изменяемых полей');
unset($sizer);
}
for($i = 0; $i < $size; $i++) {
if($i < $size - 1) $in = ','; else $in = NULL;
$pols .= $cols[$i] . '=' . $values[$i] . $in;
}
}
else $pols = $cols . '=' . $values;

Спустя 3 минуты, 19 секунд (22.02.2011 - 16:38) Dron19 написал(а):
это кусок кода, отвечающий за построение обработанного от инъекции запроса

Спустя 3 часа, 11 минут, 4 секунды (22.02.2011 - 19:49) inpost написал(а):
Dron19
Ты фальсифицировал результаты! В обоих случаях, если ты обрабатываешь входимые данные через mysql_real_escape_string - то используй в обоих, а не показывай, что без них - быстрее...

Спустя 4 часа, 57 минут, 53 секунды (23.02.2011 - 00:47) Dron19 написал(а):
inpost, ты меня не понял, в обоих случаях я использовал mysql_real_escape_string, только запрос составлял вручную. Так вот вручную запрос и обработка быстрее в 4-6 раз чем неудобный билдер. Я быстрей вручную составлю... Ну все равно, раз уж взялся за класс, буду дорабатывать

Спустя 42 секунды (23.02.2011 - 00:47) Dron19 написал(а):
то лишь билдер, а сверху написана обработка

Спустя 19 минут, 46 секунд (23.02.2011 - 01:07) twin написал(а):
блин. вот попробуй в 5.1.53 засунуть в запрос целочисленное значение в апострофах. Или наоборот.

Нельзя этой гадостью заниматься. Это ПЛОХО. И pdo это плохо. И вообще плохо все, что корежит язык программировния, коим и является SQL.

Ну как вы не поймете, панацеи нету. Нет, не было и никогда не будет. Это миф и ветряные мельницы. Как бы сейчас не противились апологеты. Невозможно всего предусмотреть. И универсальность всегда обратно пропорциональна гибкости, как не выкручивайся, как не старайся затуманить действительность всякими мелкомягкими попытками изменить мир.

SQL есть SQL. Никто, никогда не сделает над ним надстройку, которая его бы в чем то превзошла. Это все глупо и смешно.

Спустя 1 день, 13 часов, 53 минуты, 24 секунды (24.02.2011 - 15:01) Snus написал(а):
Меня эта тема навела на мысль как нашими усилиями можно побороть быдло-запросы учеников Попова.

Написал суховатый скрипт, но для простых запросов в БД сойдет.

leftTags - Теги, которые не нужно обрамлять апострофами.
nTags - Теги, которые переносить на следующую строчку.
repF и repT можно не трогать :)

<?php
//author Snus

class vQuery {

public $query;
private $leftTags;
private $nTags;
private $repF;
private $repT;

public function __construct(){
$this->leftTags = array('SELECT','AS','FROM','WHERE','ORDER','GROUP','BY','INNER','LEFT','JOIN','ON','UNION','DROP','TRUNCATE','TABLE','LIKE','LIMIT','RIGHT','*','=',',','.','>','<','!=','<>');
$this->nTags = array('FROM','WHERE','ORDER','GROUP','INNER','LEFT','LIMIT');
$this->repF = array('=', ',',' ','`','"');
$this->repT = array(' = ',' , ',' ','','\'');
}

public function q($q){
$exp = explode(' ', $this::r($q));
foreach($exp as $key => &$val){
$val = trim($val);
if(!in_array(strtoupper($val), $this->leftTags) && !strpos($val, '\'', 1) && !strpos($val, '.', 1))
$exp[$key] = '`'.$val.'`';
else if(in_array(strtoupper($val), $this->leftTags) && strtoupper($exp[$key-1]) != 'FROM')
$exp[$key] = strtoupper($val);
else if(substr_count($val, '\'') > 2){
$match = preg_match('/\'(.*)\'/', $val, $matches);
$exp[$key] = '\''.addslashes($matches[1]).'\'';
}

if(in_array(strtoupper($val), $this->nTags))
$exp[$key] = "\n".$val;

}
$this->query = implode(' ', $exp);
}

private function r($q){
return str_replace($this->repF, $this->repT, $q);
}

public function dump(){
echo '<pre>';
echo $this->query;
echo '</pre>';
}

}


?>


Пишем абсолютно некрасивый быдло-запрос

$query = "select fdsfsd,dbsa.db,sdfsdf from mytable AS tbl inner join dbsa as s on s.id=tbl.id where tag=bit";
$vQuery = new vQuery();
$vQuery->q($query);

echo $vQuery->query;
$vQuery->dump();


И на выходе получаем приятный для глаза запрос :)

SELECT `fdsfsd` , dbsa.db , `sdfsdf` FROM `mytable` AS `tbl` INNER JOIN `dbsa` AS `s` ON s.id = tbl.id WHERE `tag` = `bit`

SELECT `fdsfsd` , dbsa.db , `sdfsdf`
FROM `mytable` AS `tbl`
INNER JOIN `dbsa` AS `s` ON s.id = tbl.id
WHERE `tag` = `bit`


В общем - времени у меня не так много, чтобы доработать до ума скриптик. Пищу для размышления я вам дал. :)

Спустя 1 час, 30 минут, 16 секунд (24.02.2011 - 16:31) Dron19 написал(а):
А что smile.gif Это идея, в подписи написать , тем кто поршел курсы Попова и не умеет создавать нормальные запросы, качайте скрипт =). Будет польза, а потом глядишь и новички разберут скрипт biggrin.gif

Спустя 3 минуты, 9 секунд (24.02.2011 - 16:34) Snus написал(а):
Dron19
Ну это если только для простых запросов. Для более сложных - нужна доработка. Если хотя бы пару человек откликнутся, можно будет валидатор sql написать. Мне кажется, что полезная штука smile.gif Решать народу.


_____________
PHP+MySQL - уже изучил, осталось всего лишь это:
C,C++,C#,JavaScript,Python,Ruby,Perl,OpenGl,DirectX,ASP.NET - Намерен учить все
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.