Статья в помощь таким же нубам, как и не я. Поэтому при наездах попрошу сильно не умничать.
Решил я для себя набросать компонент для музыкальной странички. Но вот что то шибко много получилось запросов к БД. И тогда я решил сначала их поделить, но затем подумав пришёл к выводу, что будет лучше вообще посадить компонент на другую базу. Что бы «не мешался под ногами». А так как программер из меня не ахти, пришлось затарится травой и сесть курить манны.
Примерно к окончанию вторых суток я понял, что «лучше б маленьким я сдох», ибо настала пора выбрать какое использовать расширение для моего подключения. И здесь пришлось принимать во внимание не только качество этих самых расширений, но и уровень моей подготовки. Поэтому как бы мне не хотелось попробовать этот класс, но у него все пояснения только на чешском. Был просмотрен ещё зтот, но что то я не проникся. В конце концов встал выбор Mysqli или PDO. Последний критиковали поменьше, поэтому выбор пал на него. Да и хотелось попробовать что то новое, с одной стороны, а с другой, что бы присутствовала совместимость. Мануал на русском здесь. Статья на хабре здесь. В двух словах из контекста.
Расширение Объекты данных PHP (PDO) определяет простой и согласованный интерфейс для доступа к базам данных в PHP.
PDO обеспечивает абстракцию (доступа к данным). Это значит, что вне зависимости от того, какая конкретная база данных используется, вы можете пользоваться одними и теми функциями для выполнения запросов и выборки данных.
Сказано-сделано. Ещё пару дней курения и хождения по простором страны Google и оформился классдля подключения базы к нашей, горячо любимой системе. Как говорится в какой то рекламе, «теперь стало ещё легче», или как то так. Короче я сделал так.
Поставил на hosts Ubuntu Server 14.04. и такой же на гостевую на Vbox.
Залил на них мой сайт.
Для начала я решил попробовать перенести скрипт для работы с файлами(загрузка, проверки, редактирование и т. п.) и сами файлы на гостевой сервер. Так как на гостевой мне нужна была только страница загрузки файлов моего компонента, поэтому все лишние модули, компоненты и таблицы я удалил.
Закинул класс в соответственное для него место на хосте/core/classes/.
Способов для подключения второй базы есть несколько. Я выбрал следующий. В/includes/ поместил файл конфигурации conf.ini с настройками для подключения.
Здесь, думаю всё понятно.
Код для подключения такой:В методе класса он превращается в такой:Далее, все подготовительные запросы, я решил тоже помещать в этот класс, так как пока тестируемый компонент только один. А так, удобней им наверное будет в model.php. Разница в синтаксисе не большая. Для примера:
Mysqli
PDO
Вот собственно и всё. Ещё немного о безопасности. В системе встречаются не подготовленные запросы. Т.е. запросы формирующиеся в самом скрипте.В основном это INSERT. Например в файле /components/users/file.php
В таких случаях безопасней использовать placeholder. Для PDO данный запрос выглядит так
Двухшаговый способ дает все преимущества prepared statements(связываемые переменные).
Использование prepared statements укрепляет защиту от SQL-инъекций.
Так как теоритически становится невозможно провести SQL-инъекцию через данные, используемые в placeholder’ах. Вот так выглядет более «безопасный» вариант.
Вот теперь пожалуй и всё. Надеюсь моя писанина поможет тому, кто думает попробовать тоже, что и я.
Решил я для себя набросать компонент для музыкальной странички. Но вот что то шибко много получилось запросов к БД. И тогда я решил сначала их поделить, но затем подумав пришёл к выводу, что будет лучше вообще посадить компонент на другую базу. Что бы «не мешался под ногами». А так как программер из меня не ахти, пришлось затарится травой и сесть курить манны.
Примерно к окончанию вторых суток я понял, что «лучше б маленьким я сдох», ибо настала пора выбрать какое использовать расширение для моего подключения. И здесь пришлось принимать во внимание не только качество этих самых расширений, но и уровень моей подготовки. Поэтому как бы мне не хотелось попробовать этот класс, но у него все пояснения только на чешском. Был просмотрен ещё зтот, но что то я не проникся. В конце концов встал выбор Mysqli или PDO. Последний критиковали поменьше, поэтому выбор пал на него. Да и хотелось попробовать что то новое, с одной стороны, а с другой, что бы присутствовала совместимость. Мануал на русском здесь. Статья на хабре здесь. В двух словах из контекста.
Расширение Объекты данных PHP (PDO) определяет простой и согласованный интерфейс для доступа к базам данных в PHP.
PDO обеспечивает абстракцию (доступа к данным). Это значит, что вне зависимости от того, какая конкретная база данных используется, вы можете пользоваться одними и теми функциями для выполнения запросов и выборки данных.
Сказано-сделано. Ещё пару дней курения и хождения по простором страны Google и оформился классдля подключения базы к нашей, горячо любимой системе. Как говорится в какой то рекламе, «теперь стало ещё легче», или как то так. Короче я сделал так.
Поставил на hosts Ubuntu Server 14.04. и такой же на гостевую на Vbox.
Залил на них мой сайт.
Для начала я решил попробовать перенести скрипт для работы с файлами(загрузка, проверки, редактирование и т. п.) и сами файлы на гостевой сервер. Так как на гостевой мне нужна была только страница загрузки файлов моего компонента, поэтому все лишние модули, компоненты и таблицы я удалил.
Закинул класс в соответственное для него место на хосте/core/classes/.
Способов для подключения второй базы есть несколько. Я выбрал следующий. В/includes/ поместил файл конфигурации conf.ini с настройками для подключения.
db_driver=mysql db_user=nik db_password=123456 [dsn] host=music2 port=3306 dbname=music2 [db_options] PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8 [db_attributes] ATTR_ERRMODE=ERRMODE_EXCEPTION
Код для подключения такой:
$DBH = new PDO("mssql:host=$host;dbname=$dbname", $user, $pass); // красавец!
public static function getLink ( ) { $ini = PATH.'/includes/config.ini' ; $driver = $parse [ "db_driver" ] ; $dsn = "${driver}:" ; $user = $parse [ "db_user" ] ; $password = $parse [ "db_password" ] ; $options = $parse [ "db_options" ] ; $attributes = $parse [ "db_attributes" ] ; foreach ( $parse [ "dsn" ] as $k => $v ) { $dsn .= "${k}=${v};" ; } [b]$db_link = new PDO ( $dsn, $user, $password, $options ) ; [/b] foreach ( $attributes as $k => $v ) { } return $db_link ; }
Mysqli
public function get_table($table, $where='', $fields='*'){ $sql = "SELECT $fields FROM $table"; if ($where) { $sql .= ' WHERE '.$where; } $result = $this->query($sql); if ($this->num_rows($result)){ while($data = $this->fetch_assoc($result)){ $list[] = $data; } return $list; } else { return false; } }
PDO
public function get_table($table, $where='', $fields='*'){ $db_link = self::getLink(); $sql = "SELECT $fields FROM $table"; if ($where) { $sql .= ' WHERE '.$where; } $result = $db_link->query($sql); while($data = $result->fetch()){ $list[] = $data; } return $list; }
$sql = "INSERT INTO cms_user_files(user_id, filename, pubdate, allow_who, filesize, hits, vimage,time,title) VALUES ({$usr['id']}, '$name', NOW(), 'all', '$size', 0, '$vimage','$time', '$uname')";
$STH = $DBH->prepare("INSERT INTO cms_user_files(user_id, filename, pubdate, allow_who, filesize, hits, vimage,time,title) VALUES ({$usr['id']}, '$name', NOW(), 'all', '$size', 0, '$vimage','$time', '$uname')"); $STH->execute();
Использование prepared statements укрепляет защиту от SQL-инъекций.
Так как теоритически становится невозможно провести SQL-инъекцию через данные, используемые в placeholder’ах. Вот так выглядет более «безопасный» вариант.
$STH = $DBH->prepare( "INSERT INTO cms_user_files(user_id, filename, pubdate, allow_who, filesize, hits, vimage,time,title) VALUES (?,?,?,?,?,?,?,?,?)"); $STH->execute($data);
Реклама #
r2 10 лет назад #
Lora 10 лет назад #
r2 10 лет назад #
Lora 10 лет назад #
r2 10 лет назад #
1. Создаете файл /core/classes/mydb.class.php
2. Определяете в нем класс, наследуемый от cmsDatabase:
Lora 10 лет назад #
Fuze 10 лет назад #
Вы в объекте модели (это так же обычный класс) создаете свойство inDB_S, в которое помещаете объект своего класса работы с базой. Если это свойство вы не определили как приватное, то к нему можно обращаться через объект модели извне, например $model->inDB_S->название_метода(); Или же внутри самого класса модели, в его методах через $this, при условии, что метод, из которого вы обращаетесь к свойству объекта не статический.
Lora 10 лет назад #
r2 10 лет назад #
Lora 10 лет назад #
Fuze 10 лет назад #
Lora 10 лет назад #
В любом случае спасибо за помощь.
r2 10 лет назад #
Lora 10 лет назад #
maxisoft 10 лет назад #
Lora 10 лет назад #
Fuze 10 лет назад #
В общем, в вашем случае, что пытается до вас донести r2, нужно сделать примерно вот так (актуально для InstantCMS 1.10.4 и php 5.3):
1. в системном классе cmsDatabase изменить строки
2. Создать свой класс (имя файла например mydb.class.php), для подключения другой базы
в конструкторе:
Lora 10 лет назад #
Lora 10 лет назад #
Fuze 10 лет назад #
Lora 10 лет назад #
Lora 10 лет назад #
Alexneva 10 лет назад #
Lora 10 лет назад #