MySQLi

AllReady

Новичок
Здравствуйте. Не имея никаких знаний в области ООП и MySQLi я решил начать работать и с тем и с этим. Понимаю, это извращение, но я считаю это хорошим вариантом, когда хочется написать свой класс - а заодно перейти на mysqli.
Пересмотрев пару уроков, про ООП я немного понял. Решать обычные примеры я уже умею. А вот объеденить классы и mysqli как то не удается. Вот класс, который я создал:

class Db {
public $db;

public function __construct() {
$this->db = new mysqli('localhost', 'user', 123321, 'BD');
$this->db->set_charset('utf8');
$this->db->query('set profiling = 1');
if ($this->db->connect_error) die('Ошибка соединения');
return $this->db;
}

public function __destruct() {
mysqli_close($this->db);
}

public function QU($sql){
return $this->db->query($sql);
}

public function count($sql){
return $this->QU($sql)->num_rows;
}

public function assoc($sql){
return $this->QU($sql)->fetch_assoc();
}


}

$DB = new Db();​
Помогите пожалуйста советами, где я допустил какие либо грубые ошибки ?
Там все работает, просто хочу услышать ваши отзывы. Это можно и не называть классом, т.к. ничего там и нет. Про фильтрацию я вкурсе, ее я специально не учитывал, т.к. у меня стоит скрипт фильтрации глобальных массивов.
Вообщем то работа с ним такая:
$DB->QU('SELECT * FROM user'); \\ обычный запрос - выборка
$DB->count('SELECT * FROM user'); \\ возвращает количество строк в таблице
$DB->assoc('SELECT * FROM user WHERE id = 1 '); \\ возвращает ассоциативный массив​
Еще возникла проблема, каким образом можно получать например сумму полей в столбце ? Когда в mysql можно было написать так: mysql_result(mysql_query(' SELECT SUM(test) FROM user')), а как поступить в mysqli ? Я знаю то что через ассоциативный массив можно это получить, но есь ли другие варинты ? Пожалуйста проконсультируйте по классу, что мне пригодится и т.д. спасибо
 

fixxxer

К.О.
Партнер клуба
Нет никакого смысла писать обертку, которая почти ничего не делает. Чтобы было удобно, пишутся методы типа getRow, getAll, getCell итд.

А еще лучше не писать, а взять, скажем, Фанатовскую safemysql, или пдошечку (тоже написал кто-то отсюда, забыл, кто, сорри). Если хочется самому написать для практики - все равно посмотри, как там сделано.

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

AllReady

Новичок
Нет никакого смысла писать обертку, которая почти ничего не делает. Чтобы было удобно, пишутся методы типа getRow, getAll, getCell итд.

А еще лучше не писать, а взять, скажем, Фанатовскую safemysql, или пдошечку (тоже написал кто-то отсюда, забыл, кто, сорри). Если хочется самому написать для практики - все равно посмотри, как там сделано.



Это в корне неверный подход.
Спасибо за ссылки. Но мне реально хочется самому сделать. Есть большое желание учиться этому, но посмотрев код с класса safemysql я ужаснулся, т.к. не понимаю 80% функций. Обычно я пользовался обычными mysql_query/result/fetch_assoc/num_rows, но когда вижу новое и новое, не понимаю, где их использовать на своем сайте..
 

fixxxer

К.О.
Партнер клуба
Сначала посмотри документацию на safemysql - поймешь, как он спроектирован и какое предполагается использование его API. Потом лезь внутрь и смотри каждую неизвестную функцию в мануале. Разберешься.
 

AllReady

Новичок
Сначала посмотри документацию на safemysql - поймешь, как он спроектирован и какое предполагается использование его API. Потом лезь внутрь и смотри каждую неизвестную функцию в мануале. Разберешься.
Спасибо. Чуть порылся, более менее понял. У меня еще несколько вопросов, если вас не затруднит ответить...
1) На обычном процедурном стиле и с мускулом обычным было бы так:
mysql_connect(........);
mysql_query(........);
mysql_close(........);
Вот метод __destruct в моем случае как будет работать ? Он ведь закрывает соединение с БД. Он в каком случае его закроет ? Ведь я не указываю нигде, где я именно хочу закрыть его.

2) Вот функции освобождения памяти free(), цитирую: "mysqli_result::free -- mysqli_free_result — Освобождает память занятую результатами запроса"
Ну вроде как я смысл понял, на каждый запрос требует определенное количество ресурсов. Я немного не понимаю принцип особождения.
- ДОПУСТИМ !!! у нас ОЗУ 512мб, запрос требует 10мб, после запроса остается 502МБ затем идет остальной код, но у нас все так же осталось 502мб.
- В случае с ФРИ(), запрос выполнится, останется 502МБ затем освобождает память, снова становится 512, и идет дальше код?
Вот этот момент я не понял честно говоря, т.к. при работе с обычным мускулом как то не задумывался с закрытием соединения, освобождением памяти и т.д.

3) Класс для работы с mysqli - safemysql, сами запросы и работа с БД на процедурном стиле ? Тоесть сам класс (ООП) + mysqli (процедурный) ?
---
Буду благодарен за ответы
 

AllReady

Новичок
Только что посмотрел видеоурок, чтобы вызвать деструктор, нужно написать так?
unset($имя класса);
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, деструктор вызывается сам. Не смотри больше видеоуроков.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Деструктору вообще до лампады что тебе надо сделать, он просто вызывается по завершении работы. Этим и надо пользоваться =)
 

AllReady

Новичок
AllReady, скриптов много в интернетах, берешь любой фреймворк и изучаешь.
Понял, спасибо. А не можешь пожалуйста ответить на этот вопрос:
2) Вот функции освобождения памяти free(), цитирую: "mysqli_result::free -- mysqli_free_result — Освобождает память занятую результатами запроса"
Ну вроде как я смысл понял, на каждый запрос требует определенное количество ресурсов. Я немного не понимаю принцип особождения.
- ДОПУСТИМ !!! у нас ОЗУ 512мб, запрос требует 10мб, после запроса остается 502МБ затем идет остальной код, но у нас все так же осталось 502мб.
- В случае с ФРИ(), запрос выполнится, останется 502МБ затем освобождает память, снова становится 512, и идет дальше код?
Вот этот момент я не понял честно говоря, т.к. при работе с обычным мускулом как то не задумывался с закрытием соединения, освобождением памяти и т.д.
 

WMix

герр M:)ller
Партнер клуба
когда скрипт закончит обработку, память освободится сама, но на пхп можно написать скрипт, который будет часами крутится, и в этом случае очень важно думать о памяти.
 

AllReady

Новичок
Еще 1 вопрос. Создал класс, по работе с mysqli (немного измененный по сравнению с тем что в первом посту, точнее опп сменил на процедурный), ничего в нем особенного не было, просто сократил названия функций для себя. И сравнил с обычным mysql (он был без класса) прямое подключение.
Почему в моем случае mysql был производительнее чем mysqli ? К изменениям между 2мя вариантами можно просто отнести созданный мною класс
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, почему производительнее? Как измерял производительность?
 

AllReady

Новичок
AllReady, почему производительнее? Как измерял производительность?
Обычной генерацией через микротайм'ы()
Если на денвере с mysql было ~0.038 - 0.05 то с mysqli было ~0.05 - 0.06
Это я примерно. Ставил на vps'ку, там все так же, только не 0.0***, а 0.00**, то есть быстрее. Но все же в обоих случаях у меня mysql выиграл в скорости...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Кхм, уж не знаю как ты там измерил и что было с системой в тот момент, только эти 0,02 укладываются в твою погрешность измерений и делать такие выводы, как сделал ты - не то, чтобы преждевременно, а вовсе некорректно.
 

AllReady

Новичок
Кхм, уж не знаю как ты там измерил и что было с системой в тот момент, только эти 0,02 укладываются в твою погрешность измерений и делать такие выводы, как сделал ты - не то, чтобы преждевременно, а вовсе некорректно.
А если же не использовать класс, а напрямую соедениться, может быть результат разным ?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, может быть, причем значительно. И если ты собрался что-то измерить надо точно знать как это сделать. У тебя там запрос мог закешироваться, могла произойти паразитная нагрузка на диск/проц в процессе теста от третьей стороны. Могли быть магнитные бури на Юпитере ;) В любом случае я думаю, что для тебя эти 0,02 - не та ситуация, чтобы о ней так задумываться.
 

AllReady

Новичок
AllReady, может быть, причем значительно. И если ты собрался что-то измерить надо точно знать как это сделать. У тебя там запрос мог закешироваться, могла произойти паразитная нагрузка на диск/проц в процессе теста от третьей стороны. Могли быть магнитные бури на Юпитере ;) В любом случае я думаю, что для тебя эти 0,02 - не та ситуация, чтобы о ней так задумываться.
Просто обидно, т.к. вроде переписываешь, переходишь к новому, а результат хуже. Может в чем то другом он лучше, но мне почему-то принципиально уменьшить генерацию)) Спасибо большое за ответы, помогли во многом))
 
Сверху