X

Простой класс для работы с MySQL

Часто требуется, написать какой-нибудь простой скрипт, в котором требуется поддержка БД. И я заметил, что частенько пишу небольшие обертки, для более удобной работы..

Я не претендую на открытие чего-то уникального, но этот класс экономит время потраченное на написание одних и тех же функций:

<?php
    class sql { // Version: 1.0.1 {2012-01-10}
            public static function connect($host,$user,$pass,$db=NULL,$charset=NULL)
            {
                if (!mysql_connect($host,$user,$pass)) die('Can not connect to database');
                if (!is_null($db)) self::usedb($db);
                if (!is_null($charset)) self::set_charset($charset);
            } // end of function

            public static function set_charset($charset='utf8')
            {
                self::query("SET character_set_results = '".$charset."',
                                 character_set_client = '".$charset."',
                                 character_set_connection = '".$charset."',
                                 character_set_database = '".$charset."',
                                 character_set_server = '".$charset."'
                            ");
            } // end of function

            public static function usedb($db)
            {
                if (!mysql_select_db($db)) die('Can not select database');
            } // end of function

            public function disconnect()
            {
                @mysql_close();
            } // end of function

            public static function query($sql, $die=TRUE)
            {
                $ret = mysql_query($sql);
                if ($die AND self::error()) die(self::error());
                return $ret;
            } // end of function

            public static function error()
            {
                return mysql_error();
            } // end of function

            public static function get_var($sql)
            {
                $ret = NULL;
                $r = self::query($sql);
                if (is_resource($r) AND mysql_num_rows($r))
                {
                    $row = mysql_fetch_array($r);
                    $ret = $row[0];
                }
                return $ret;
            } // end of function

            public static function get_results($sql)
            {
                $ret = NULL;
                $r = self::query($sql);
                if (is_resource($r) AND mysql_num_rows($r))
                {
                    $ret = Array();
                    while($row = mysql_fetch_assoc($r))
                    {
                        $ret[] = $row;
                    }
                }
                return $ret;
            } // end of function

            public static function get_row($sql)
            {
                $ret = NULL;
                $r = self::query($sql);
                if (is_resource($r) AND mysql_num_rows($r))
                {
                    $ret = mysql_fetch_assoc($r);
                }
                return $ret;
            } // end of function

            public static function affected()
            {
                return mysql_affected_rows();
            } // end of function

            public static function esc($str, $quote=TRUE, $trim=TRUE, $md5=FALSE)
            {
                if ($trim) $str = trim($str);
                if ($md5) $str = md5($str);
                $str = mysql_real_escape_string($str);
                if ($quote)
                {
                    if (!is_string($quote) OR !in_array($quote,Array('"',"'"))) $quote='"';
                    $str = $quote.$str.$quote;
                }
                return $str;
            }

        } // end of class

Ну, и простейший пример использования:

<?php
    sql::connect('localhost','root','','my-test-db');
    $str = " It's a perfect world! ";
    print_r(sql::get_var('SELECT '.sql::esc($str)));

Комментарии (4)

  • Спасибо большое за такой отличный ответ)) Просто у меня проблема, уже руки опускаются(( Я устанавливая icpmaneger,nginx, fail2ban, zand, ioncub и т.д. После чего через несколько часов начинает кудато деваться память. В isp появляется ошибка что не хватает оперативной памяти. Виртуализация OpenVZ памяти 768Мб. Буду разбираться дальше. Я грешил на процесс mysql который на принтскрине. Думаю попробовать как написано у тебя в статье : "Linux, кто съел всю память?" Спасибо за блог, много чего полезного для себя узнал! И продолжаю узнавать)))

    • Память может кушать кто угодно, в htop нажми F6[Sort By] и выбери Mem,%. И смотри какой процесс съедает память.
      Это могут быть скрипты, могут быть сервера типа MySQL или nginx. Когда определишь кто балуется, смотри конфиги.

      Например, у тебя может быть так настроен MySQL что он съедает всю память, тогда надо воспользоваться тюнерами, типа tuning-primer.sh и донастроить конфигурацию.
      А может быть у тебя посыпалась большая таблица, и MySQL запустил восстановление и все запросы к этой таблице встают в очередь, чем и создают небывалое потребление памяти, проверить это можно, выполнив SQL команду: SHOW PROCESSLIST; если будет висеть много запросов это оно.

      Так же посмотри /var/log/syslog, возможно там увидишь сообщения от процесса которому не хватает памяти.

  • Здравствуйте Виталий. Не знал как С Вами связаться, пришлось оставить комент. Извеняюсь за это))
    Помогите пожалуйста. У меня есть VPS стоит kentos в htop висят какието процессы с надъписью error, я подозриваю что так не должно быть. вобщем посмотрите пожалуй на принтскрин я красным обвел эти процессы. http://screenshot.su/show.php?img=940fd02011e6bb9fa0b34d3664484f02.jpg

    Вот строчка подозрительного процесса
    16099 mysql 25 0 414M 21440 6196 S 0.0 2.7 0:00.00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/v-host4yo

    • Привет!
      Комментарии именно для связи и нужны, поэтому правильно сделал что написал сюда!

      Те процессы, что ты обвел, стандартные, их назначение можешь погуглить более точно, вкратце так:
      - rsyslogd = системный демон отвечающий за запись логов
      - /usr/libexec/mysql = это демон базы данных MySQL
      - /usr/sbin/named = это демон dns-а

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

      На скриншоте, я не увидел надписей error, поэтому не совсем понимаю о чем ты. Если ты о вот этой части:
      --log-error=/var/lib/mysql/v-host4yo
      то это просто параметры передаваемые демоны во время запуска, в частности, этот параметр указывает куда записывать ошибки.

      Если у тебя все же есть подозрения о каких либо процессах, то могу посоветовать делать так:
      1) Поставить себе в виртуальную машину точно такую же ОС
      2) Сравнить процессы, которые будут в твоей установке с процессами которые будут на сервере.
      3) Если будут отличия, тогда первое что нужно сделать, спросить у тех.поддержки хостера, что это за процессы. Т.к. хостер может добавлять какой-то специфический софт, для обеспечения более оптимальной работы VPS.
      4) Если хостер не знает, и ты не знаешь, тогда остается только гуглить
      5) Если так и не удалось идентифицировать процесс, то надо либо обращаться к админам (например найти на weblancer.net), либо если это не возможно по тем или иным причинам, просто сделать чистую установку.

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