Начитался в форуме, теперь не дает покоя одна мысль: Стоит ли для подключение к БД создавать отдельный класс вот так, к примеру: PHP: <?php class mysql{ function connect(){ mysql_connect() } } ?> или же достаточно того, что предлагает Дмитрий Котеров в своей книге "PHP5 в подлиннике" (всю книгу еще не осилил, но такой подход был предложен в начале "рассказа о MySQL+PHP"): PHP: <?php $server='localhost'; $username='root'; $pass='pass'; mysql_connect($server, $username, $pass); ?> Правильно ли я понял, что в первом случае является плюсом освобождение массива $GLOBALS ?
принципиальной разницы нет. все зависит от того, как ты проектируешь свое приложение. если использование классов в нем целесообразно (например, оно все основано на классах), то разумнее, конечно, обернуть в класс. в этом же классе удобно реализовать различные методы работы с бд (ну там, select, update etc)
Наговнокодил для примера: PHP: <?php class Indic { public static function GetInstance($host, $uname, $upass, $dbname) { if(($id = mysql_connect($host, $uname, $upass)) && mysql_select_db($dbname, $id) !== false) { return $id; } else throw new Exception(mysql_error($id)); } } try { $database = Indic::GetInstance("localhost", "root", "password", "an"); } catch(Exception $e) { die($e->getMessage()); } ?>
Не, вот примерный говнокод: PHP: <?php /** * @name dbif.inc * @copyright Vasilii B. Shpilchin (2009) * @package GamEEnG * * Объектный интерфейс для работы с БД MySQL. * Подерживает выборку, запись, обновление, удаление и произвольный запрос. * Отдельные методы для таблиц типа MEMORY. */ class DB { public static $link; public static $memory; public static $querys_num = 0; public static $querys_time = 0; private static $microtime = null; private static $timer_off = false; // Выключить таймер? /** * Произвольный запрос. * * @param $query */ public static function query($query) { if (empty(self::$link)) { SYS::db_connect(); } self::timer(); $res = mysqli_query(self::$link, $query); self::timer(); if (mysqli_errno(self::$link)) { throw new exp_db(mysqli_errno(self::$link), mysqli_error(self::$link).'['.$query.']', 'sql_query'); } else { return $res; } } /** * Выборка из таблицы. * * @param string $what * @param string $table * @param array $where (key = поле) * */ public static function select($what, $table, $where, $if = 'and') { $uwhere = null; for ($i=0; $i<count($where); $i++) { foreach ($where[$i] as $field => $value) { if (!is_null($uwhere)) { $uwhere .= " $if "; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } } $query = 'SELECT '.$what.' FROM `'.$table.'` WHERE '.$uwhere.';'; return self::query($query); } /** * Запись в таблицу. * * @param string $table * @param array $fields * @param array $values */ public static function insert($table, $fields, $values) { foreach ($fields as &$field) { $field = '`'.$field.'`'; } foreach ($values as &$value) { $value = '"'.SYS::escape($value).'"'; } $query = 'INSERT INTO `'.$table.'` '; $query .= '('.implode(',', $fields).') '; $query .= 'VALUES '; $query .= '('.implode(',', $values).')'; return self::query($query); } /** * Обновление строки/строк. * * @param string $table * @param array $fields * @param array $values * @param array $where (key = поле) */ public static function update($table, $fields, $values, $where, $if = 'and') { foreach ($fields as &$field) { $field = '`'.$field.'`'; } foreach ($values as &$value) { $value = '"'.SYS::escape($value).'"'; } unset($field); unset($value); $uwhere = null; for ($i=0; $i<count($where); $i++) { foreach ($where[$i] as $field => $value) { if (!is_null($uwhere)) { $uwhere .= " $if "; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } } foreach ($values as $n => $value) { $fields[$n] .= '='.$value; } $query = 'UPDATE `'.$table.'` SET '.implode(',',$fields); $query .= ' WHERE '.$uwhere; $query .= ';'; return self::query($query); } /** * Удаление строки/строк * * @param string $table * @param array $where (key = поле) * @param string $if - условие */ public static function delete($table, $where, $if = 'and') { $uwhere = null; foreach ($where as $field => $value) { if (!is_null($uwhere)) { $uwhere .= ' '.$if.' '; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } $query = 'DELETE FROM `'.$table.'` WHERE '.$uwhere.';'; return self::query($query); } /** * Произвольный запрос (MEMORY) * * @param $query */ public static function mem_query($table, $query) { if (empty(self::$memory)) { SYS::init_memory_db($table); } $res = mysqli_query(self::$memory, $query); if (mysqli_errno(self::$memory)) { throw new exp_db(mysqli_errno(self::$link), mysqli_error(self::$$link).'['.$query.']', 'sql_query'); } else { return $res; } } /** * Выборка из таблицы (MEMORY) * * @param string $what * @param string $table * @param array $where (key = поле) * */ public static function mem_select($what, $table, $where) { $uwhere = null; foreach ($where as $field => $value) { if (!is_null($uwhere)) { $uwhere .= ' and '; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } $query = 'SELECT '.$what.' FROM `'.$table.'` WHERE '.$uwhere.';'; return self::mem_query($query); } /** * Запись в таблицу (MEMORY) * * @param string $table * @param array $fields * @param array $values */ public static function mem_insert($table, $fields, $values) { foreach ($fields as &$field) { $field = '`'.$field.'`'; } foreach ($values as &$value) { $value = '"'.SYS::escape($value).'"'; } $query = 'INSERT INTO `'.$table.'` '; $query .= '('.implode(',', $fields).') '; $query .= 'VALUES '; $query .= '('.implode(',', $values).')'; return self::mem_query($query); } /** * Обновление строки/строк (MEMORY) * * @param string $table * @param array $fields * @param array $values * @param array $where (key = поле) */ public static function mem_update($table, $fields, $values, $where) { foreach ($fields as &$field) { $field = '`'.$field.'`'; } foreach ($values as &$value) { $value = '"'.SYS::escape($value).'"'; } unset($field); unset($value); $uwhere = null; foreach ($where as $field => $value) { if (!is_null($uwhere)) { $uwhere .= ' and '; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } foreach ($values as $n => $value) { $fields[$n] .= '='.$value; } $query = 'UPDATE `'.$table.'` SET '.implode(',',$fields); $query .= ' WHERE '.$uwhere; $query .= ';'; return self::mem_query($query); } /** * Удаление строки/строк (MEMORY) * * @param string $table * @param array $where (key = поле) */ public static function mem_delete($table, $where) { $uwhere = null; foreach ($where as $field => $value) { if (!is_null($uwhere)) { $uwhere .= ' and '; } $uwhere .= $field.'"'; $uwhere .= SYS::escape($value); $uwhere .= '"'; } $query = 'DELETE FROM `'.$table.'` WHERE '.$uwhere.';'; return self::mem_query($query); } /** * Проверка MEMORY-таблицы на существование * * @param string $table * @return boolean */ public static function mem_check($table) { $res = mysqli_query(self::$memory, 'show tables'); $list = mysqli_fetch_array($res, MYSQLI_NUM); print_r($list); die(); if (in_array($table, $list)) { return true; } else { return false; } } /** * Статистика количества и скорости запросов */ private static function timer() { if (self::$timer_off) return false; if (empty(self::$microtime)) { self::$microtime = microtime(true); self::$querys_num++; } else { $microtime = microtime(true); self::$querys_time += ($microtime - self::$microtime); self::$microtime = null; } } /** * Закрыть все соединения. */ public static function close_all() { if(self::$link) { mysqli_close(self::$link); } if (self::$memory) { mysqli_close(self::$memory); } } } ?>
PHP: В ту же степь: <?php /** * Абстрактный класс работы с базой данных. От него наследуют классы для работы с конкретной СУБД. * * @package classes * @subpackage DBClasses * @abstract */ abstract class SQLDB { /** * Уникальный идентификатор. Создается фабрикой. * @access protected * @var string */ protected $factId; /** * Singleton * @static * @access protected * @var object */ static protected $instance; /** * Определяет нужно ли производить перекодирование между БД и сайтом * @access protected * @var boolean */ protected $needEnc; /** * Кодировка БД * @access protected * @var string */ protected $encDB; /** * Кодировка сайта * @access protected * @var string */ protected $encFile; /** * Адрес сервера БД * @access protected * @var string */ protected $host; /** * Логин * @access protected * @var string */ protected $login; /** * Пароль * @access protected * @var string */ protected $pass; /** * База данных * @access protected * @var string */ protected $db; /** * Определяет показывать ли sql запросы * @access protected * @var boolean */ protected $sqlShow; /** * Определяет логировать ли sql запросы * @access protected * @var boolean */ protected $sqlLog; /** * Определяет проверять ли на наличие union * @access protected * @var boolean */ protected $checkU; /** * Определяет проверять ли на наличие присоединенных запросов * @access protected * @var boolean */ protected $checkD; /** * Ссылка на открытое соединение с БД * @access protected * @var resource */ protected $link; /** * Результат запроса * @access protected * @var resource */ protected $res; /** * Последний запрос * @access protected * @var string */ protected $sql; /** * Символ для обрамления ключа слева. * * Символ для обрамления ключа слева(Left Key Symbol). * Используется в {@link escapeKeys} * @access protected * @var string */ protected $LKS=""; /** * Символ для обрамления ключа справа. * * Символ для обрамления ключа справа(Right Key Symbol). * Используется в {@link escapeKeys} * @access protected * @var string */ protected $RKS=""; //////////////////////////// //Абстрактные методы// //////////////////////////// /** * Закрывает соединение */ abstract protected function closeConnection(); /** * Выполняет запрос $sql. * * @access protected * @param string $sql запрос для выполнения * @return resource результат выпонения запроса */ abstract protected function query($sql); /** * Возвращает код последней ошибки * * @return string Код последней ошибки */ abstract public function getErrorCode(); /** * Возвращает последнее сообщение об ошибке * * @return string Сообщение об ошибке */ abstract public function getErrorMsg(); /** * Возвращает id только что добавленной записи. * * @access protected * @return int id только что добавленной записи */ abstract protected function getLastID(); /** * Возвращает количество строк, обработанных последним запросом. * * @access protected * @return int количество строк, обработанных последним запросом */ abstract protected function affectRows(); /** * Начинает транзакцию * * Отключает autocommit и посылает серверу команду начать транзакцию. */ abstract public function startTran(); /** * Подтверждает транзакцию * * Подтверждает транзакцию и включает autocommit. */ abstract public function commit(); /** * Откатывает транзакцию * * Производит откат транзакции и включает autocommit. */ abstract public function rollback(); /** * Возвращает очередную строку из результата запроса в виде ассоциативного массива * * @param resource $res Если параметр $res задан, то строка берется из него, в противном случае строка берется из $this->res * @return array Ассоциативный массив, содержащий значения из очередной строки результата */ abstract public function fetchAssoc($res=null); /** * Возвращает очередную строку из результата запроса в виде объекта * * @param resource $res Если параметр $res задан, то строка берется из него, в противном случае строка берется из $this->res * @return array Объект, содержащий значения из очередной строки результата */ abstract public function fetchObj($res=null); /** * Возвращает очередную строку из результата запроса в виде пронумерованного массива * * @param resource $res Если параметр $res задан, то строка берется из него, в противном случае строка берется из $this->res * @return array Пронумерованный массив, содержащий значения из очередной строки результата */ abstract public function fetchRow($res=null); /** * Возвращает единственное значение из результата запроса * * Этот метод следует использовать, когда ожидется выбор единственного значения * * @param resource $res Если параметр $res задан, то строка берется из него, в противном случае строка берется из $this->res * @return mixed Значение из результата запроса */ abstract public function fetchField($res=null); /** * Обрабатывает спецсимволы в строке для безопасного ее использования в запросе * * @param mixed $str Строка, в которой надо экранировать спецсимволы или число или null. * @return mixed Строка с экранированными спецсимволы, или число или строка "null". */ abstract public function escapeString($str); //////////////////////////// //Магические методы// /////////////////////////// /** * Запрещение клонирования * @throws Exception Клонирование запрещено */ public function __clone(){ throw new Exeption('Клонирование запрещено!'); } /** * Преобразует объект в строковое представление. * @return string Строковое представление объекта */ public function __toString(){ return get_class($this)."://$login:$pass@$host/$db"; } /** * Деструктор. * * Закрывает соединение. Удаляет себя из списка фабрики. */ public function __destruct(){ $this->rollback(); $this->closeConnection(); SQLDBFactory::unsetDB($this->factId); } //////////////////// //Сеттеры, геттеры// //////////////////// /** * Устанавливает значение {@link factId} * @param string $id Новый идентификатор */ public function setId($id){...} /** * Возвращает значение {@link factId} * @return string Текущий идентификатор */ public function getId(){...} /** * Конфигурирует объект в соответствии с массивом конфигурации * @throws FormatException * @param array $config Массив для установки конфигурации. */ protected function setConfig($config){...} /** * Возвращает текущую конфигурацию объекта * @return array массив с конфигурационными переменными */ public function getConfig(){...} /** * Возвращает последний запрос. * @return string Последний запрос */ public function getLastQuery(){...} ////////////// //Запросы// ////////////// /** * Выполняет запрос select. * * Выполняет запрос $sql. Запрос должен быть запросом типа select. * Для предотвращения несанкционированных действий * перед выполнением запрос проверяется на наличие оператора union. * Если оператор union будет найден, то будет выброшено исключение. * Если в запросе необходимо использовать оператор union, * то количество таких операторов нужно указать в параметре $numUnion. * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе. * @return resource Результат запроса */ public function select($sql, $numUnion=0){ $sql=$this->getSelect($sql, $numUnion=0); $this->exec($sql); return $this->res; } /** * Выполняет вставку строки в таблицу. * * @throws SqlException * @param mixed $arr Если $arr массив, то ключи массива трактуются как поля таблицы, * а соответствующие значения как значения этих полей. Значения проходят обработку {@link escapeString} * Если $arr это строка, то она трактуется как sql-запрос для выполнения. * @param string $tab Таблица, в которую нужно вставить значения. * @return mixed id только что вставленной записи */ public function insert($arr, $tab=null){ $sql=$this->getInsert($arr, $tab); $this->exec($sql); return $this->getLastID(); } /** * Выполняет обновление данных в таблице. * * @throws SqlException, FormatException * @param mixed $arr Если $arr массив, то ключи массива трактуются как поля таблицы, * а соответствующие значения как значения этих полей. * Если $arr это строка, то она трактуется как sql-запрос для выполнения. * @param string $tab Таблица, в которой выполняется обновление. * @param mixed $where Условие, при котором выполняется обновление, или id записи для обновления * @return int Количество обновленных строк. */ public function update($arr, $tab=null, $where=null){ $sql=$this->getUpdate($arr, $tab, $where); $this->exec($sql); return $this->affectRows(); } /** * Выполняет удаление из таблицы. * * @throws SqlException, FormatException * @param string $tab Таблица из которой удалять или sql-запрос. * @param mixed $where Если $where - целое, * то переменная трактуется как значение id, той строки которую надо удалить. * Если $where строка, то переменна трактуется как усовие удаления строки. * Если $where ничего из вышеперечисленного, то $tab считается sql-запросом. * @return int Количество удаленных строк. */ public function delete($tab, $where=null){ $sql=$this->getDelete($tab, $where); $this->exec($sql); return $this->affectRows(); } ////////////////////////// //Запросы значений// ////////////////////////// /** * Возвращает первую строку из результата запроса $sql в виде ассоциативного массива. * * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе * @return array Ассоциативный массив, содержащий значения из первой строки результата запроса */ public function getAssoc($sql,$numUnion=0){...} /** * Возвращает первую строку из результата запроса $sql в виде пронумированного массива. * * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе * @return array Пронумированный массив, содержащий значения из первой строки результата запроса */ public function getRow($sql,$numUnion=0){...} /** * Возвращает первый столбец из результата запроса $sql в виде пронумированного массива. * * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе * @return array Пронумированный массив, содержащий значения из первого столбца результата запроса */ public function getColumn($sql,$numUnion=0){...} /** * Возвращает первую строку из результата запроса $sql в виде объекта * * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе * @return object Объект, содержащий значения из первой строки результата запроса */ public function getObj($sql,$numUnion=0){...} /** * Возвращает единственное значение из результата запроса $sql. * * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @param int $numUnion Количество операторов union в запросе * @return mixed Значение из первой строки результата запроса */ public function getVal($sql,$numUnion=0){...} /** * Возвращает единственное значение из результата запроса $sql. * * В отличии от {@link getVal} функция вызывает не {@link select}, а непосредственно {@link exec}. * Таким образом запрос не проверяется. Также запрос не сохраняется в свойство {@link sql}. * * @access protected * @throws SqlException, FormatException * @param string $sql Запрос для выполнения * @return mixed Значение из первой строки результата запроса */ protected function getSystemVal($sql){...} //////////////////////////// //Подгтовка запросов// /////////////////////////// /** * Проверяет запрос select. * @see select * @throws SqlException, FormatException * @param string $sql Запрос для проверки * @param int $numUnion Количество операторов uniond в запросе * @return string Проверенный запрос */ public function getSelect($sql, $numUnion=0){ $sql=trim($sql); $this->checkQuery($sql, $numUnion); $this->checkSelect($sql); return $sql; } /** * Формирует и проверяет запрос insert. * @see insert * @throws SqlException, FormatException * @param mixed $arr Запрос для проверки или массив со значениями * @param string $tab Таблица для вставки значения * @return string Проверенный запрос */ public function getInsert($arr, $tab=null){ $sql=""; if (is_array($arr)){ // Если таблица задана неверно, то выбросить исключение if (empty($tab) || !is_string($tab)) throw new FormatException("Не задана таблица для вставки строки","Неверный тип данных"); $keys=""; $vals=""; $keys="(".implode(",",array_keys($arr)).")"; // Создаем строку с именами полей // Создаем строку со значениями полей foreach($arr as $key=>$val){ $keys .=$this->escapeKeys($key).","; $vals .=$this->escapeString($val).","; } $vals="(".trim($vals,",").")"; $keys="(".trim($keys,",").")"; //Создаем запрос $sql="insert into ".$tab.$keys." values".$vals; } else{ $sql=trim($arr.""); } $this->checkQuery($sql); $this->checkInsert($sql); return $sql; } /** * Формирует и проверяет запрос update. * @see update * @throws SqlException, FormatException * @param mixed $arr Запрос для проверки или массив со значениями * @param string $tab Таблица, в которой обновляются значения * @param string $where Условие, по которому обновляются значения, или id записи для обновления * @return string Проверенный запрос */ public function getUpdate($arr, $tab=null, $where=null){ $sql=""; if (is_array($arr)){ if (empty($tab) || !is_string($tab)) throw new FormatException("Не задана таблица для вставки строки","Неверный тип данных"); $sets=$this->getAssignmentString($arr, ","); //Определяем условие обновления if (is_array($where)){ $expr=" where ".$this->getAssignmentString($where, " and"); } elseif (is_int($where)){ $expr=" where id=".$where; } elseif (!empty($where)) { $expr= " where ".$where; } else{ $expr=''; } $sql="update $tab set".$sets.$expr; //Создаем запрос } else{ $sql=trim($arr.""); } $this->checkQuery($sql); $this->checkUpdate($sql); return $sql; } /** * Формирует и проверяет запрос delete. * @see delete * @throws SqlException, FormatException * @param string $tab Запрос для проверки или таблица, в которой обновляются значения * @param mixed $where Условие, при котором удаляется запись, или id записи для удаления * @return string Проверенный запрос */ public function getDelete($tab, $where=null){ $sql=""; if (is_int($where)){ $sql="delete from $tab where id=".$where; } elseif (is_string($where)){ $sql="delete from $tab where ".$where; } else{ $sql=trim($tab.""); } $this->checkQuery($sql); $this->checkDelete($sql); return $sql; } /** * Подготовливает выполнение sql-запроса * * Функция запоминает sql-запрос в свойстве класса. * Логирует и выводит его на экран, если это указано в настройках $vf["db"]["sqlLog"] и $vf["db"]["sqlShow"]. * Производит перекодировку запроса, если нужно. * Выбрасывает исключение в случае ошибки на sql-сервере. * * @access protected * @param string sql-запрос для выполнения */ protected function exec($sql, $save=true){ global $vf; if ($save){ $this->sql=$sql; } if ($vf["db"]["sqlShow"]) echo $sql, "<br>"; if ($vf["db"]["sqlLog"]) logMsg($sql,"SQL Log","sqlLog"); if ($this->needEnc){ $sql = iconv($this->encFile, $this->encDB,$sql); } $this->res=$this->query($sql); if (!$this->res){ throw new SqlException($this->getErrorCode()." ".$this->getErrorMsg(), "Ошибка на сервере", $sql); } } /** * Функция создает строку присвоения/сравнения из массива. * * Функция создает строку присвоения/сравнения из массива. * Ключи массива трактуются как поля таблицы, а соответствующие значения, как те значения которые нужно присвоить/сравнить. * <code> * <?php * $arr["id"]=50; * $arr["title"]="Новая книга"; * $arr["izd"]=null; * * $DB->SQLDBFactory::getDB(); * $str=$DB->getAssignmentString($arr, ","); * echo $str; * ?> * </code> * * * @param array $arr Массив из которого нужно сделать строку присвоения/сравнения * @param string $delim Строка, которая вставляется между ассоциированными парами. * @return string Искомая строка */ protected function getAssignmentString($arr, $delim){ $rez=""; foreach($arr as $key=>$val){ $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim; } $rez=substr($rez,0,-strlen($delim)); return $rez; } /////////////////////////// //Служебные методы// /////////////////////////// /** * Обрамляет имя поля в специальные символы. * * В большинстве БД для использования некоторых символов (например, пробелов) в имени поля нужно все поле обрамить спецсимволами. * Именно это и делает данная функция * * @param string $str Имя поля * @return string имя поля заключенное в спецсимволы */ public function escapeKeys($key){...} ////////////////////////// //Перекодирование// ///////////////////////// /** * Запоминает кодироки сайта и БД для перекодирования запросов и их результатов * @throws FormatException * @param string $encFile Кодировка сайта * @param string $encDB Кодировка БД */ public function setEncodings($encFile, $encDB){...} //////////////// //Проверки// /////////////// /** * Проверяет запрос * @throws SqlException, FormatException * @param string $sql Запрос для проверки * @param int $unionCol Количество операторов union */ protected function checkQuery($sql, $numUnion=0){ if (!is_string($sql)) throw new FormatException("В качестве запроса передана не строка", "Неверный тип данных"); $this->checkDoubleTir($sql); $this->checkDoubleQuery($sql,$numUnion); } /** * Проверяет есть ли в запросе два тире подряд или /* * @throws SqlException * @param string $sql Запрос для проверки */ protected function checkDoubleTir($sql){...} /** * Проверка на вложенный или присоединенный запрос * @throws SqlException * @param string $sql Запрос для проверки * @param int $unionCol Количество операторов union */ protected function checkDoubleQuery($sql,$unionCol=0){...} /** * Проверка того, что запрос является запросом Select * * @throws SqlException * @param string $sql Запрос для проверки */ protected function checkSelect($sql){...} /** * Проверка того, что запрос является запросом Insert * * @throws SqlException * @param string $sql Запрос для проверки */ protected function checkInsert($sql){...} /** * Проверка того, что запрос является запросом Update * * @throws SqlException * @param string $sql Запрос для проверки */ protected function checkUpdate($sql){...} /** * Проверка того, что запрос является запросом Delete * * @throws SqlException * @param string $sql Запрос для проверки */ protected function checkDelete($sql){...} /** * Функция возвращает true, если данные в позиции $otkuda из строки $gde не взяты в одинарные кавычки * * @param string $gde Строка в которой происходит проверка * @param int $otkuda Позиция для которой происходит проверка * @return boolean Резултат проверки */ protected function notInQutes($gde,$otkuda){...} ?>