Не могу сообразить. information_schema лежит на одном уровне с моей БД, если я открываю GUI для управления сервером MySQL. Когда я создаю объект PDO я явно указываю к какой БД подключиться. Вы имеете в виду, что я могу создав PDO объект для myDbName, указать в запросе "SELECT name FROM anotherDbName.users" получить из неё результат (при условии, что хватает прав)?
Можете подсказать как это объединить с SELECT запросом? Сколько ни пробовал этот вариант ничего не получается. Например, для такого запроса
'SELECT uName, uSurname, uPhone, uMail FROM users INNER JOIN contacts ON users.user_id = contacts.user_id WHERE uSurname = 'Петров' ORDER BY user_id ASC'
В данном случае нужно получить мета информацию по 4 полям и заджойнить её с пришедшей информацией из SELECT. В селекте вернется несколько юзеров у которых фамилия "Петров".
Immortal_pony: понял почему сразу не подошел этот вариант. Объект PDO создает подключение к одной БД, а information_schema это другая БД. Как вы считаете. Что будет правильнее:
1) При каждому запросе создавать подключение к двум БД, делать выборку, а потом сливать массивы средствами PHP.
2) Перенести SELECT * FROM information_schema WHERE TABLE_SCHEMA = 'myDatabaseName' в мою базу данных. В таком случае будет один запрос к БД, JOIN средствами MySQL, что явно быстрее должно быть, чем слияние массивов в цикле средствами PHP.
Второй вариант на мой взгляд правильней, но я не знаю как автоматизировать обновление этой "информационной таблицы", в случае изменения структуры базы данных. p.s. В этой таблице есть ещё пара колонок, поэтому начисто переписывать таблицу не вариант. Например, есть колонка "русское название поля".
Вся эта история нужна для этого (псевдокод)
echo '
Это позволяет на клиенте лучше понимать какой тип поля, что в него можно писать, что нельзя, какая максимальная длинна и т.д.
Сейчас схема такая
1. Есть отдельная таблица в которой для каждого поля в этой БД созана уникальная запись
через SHOW TABLES -> SHOW COLUMNS FROM
2. После внесения изменений в структуру БД эта таблица обновляется (пока вручную)
3. Далее делается полный SELECT из неё и сериализованный массив пишется в файл
4. Во всех местах где нужно получить этот массив делается такой запрос
$templator = unserialize(file(TEMP_DIR.'cache/templator.txt')[0]);
5. Ну и далее по циклу для получения всей доп инфы
foreach ($data as $k => $v) {
if (isset($templator[$k])) {
$data[$k] = $templator[$k];
$data[$k]['value'] = $v;
}
}
В итоге получается что-то такое (на самом деле в массиве больше данных, но сейчас это не так важно)
'orders.order_id' => [
'value' => '113',
'type' => 'int',
'length' => '11'
]
6. Замерял скорость вывода массива из файла (код привел выше) vs каждый раз запроса массива из БД по всей таблице (которая сериализована в файле). Разница по скорости в 200 раз различается в пользу чтения из файла. (бд находится тут же на VDS'ке).
7. Сам не люблю костыли, поэтому и задал изначально вопрос, есть ли расширение для PHP или нативная функция в PDO которые позволяют это всё сделать одним запросом.
8. Как сделать join я так и не понял, но не уверен, что это будет быстрее чем моя реализация.
Вот например по такому запросу если делать join
SELECT "тут 15 полей" FROM "тут JOIN на 4 таблицы" и это не по 1 значению, а например 300 строк.
То есть 300 строк на 15 полей, это нужно 4500 join'ов (нам же по каждому полю нужно получить информацию).
Евгений: Спасибо за наводку, но это не подходящий вариант. На него много ругаются, что метод с багами. Лично у меня он часть информации нулями выводит, например мах длинну строки. Видимо что-то с драйверами. На данный момент рассматриваю 2 варианта. array_merge_recursive приходящего массива от SELECT и массива хранящегося в файле, в котором есть параметры всех полей (файл заранее подготовлен, как выгрузка из базы). Второй вариант, при каждом запросе делать join со schema хотя это наверное извращение и будет медленней первого варианта.
Вы не поняли вопроса. Я знаю как получить данные столбцов. Я знаю как сделать отдельно запрос SELECT. Я хочу узнать, есть ли готовая реализация, когда при SELECT * FROM fruits, мне возвращается не только массив значений, но и информация по каждому полю, как я привел в примере. Если нужно писать функцию на php которая будет сливать "2 массива в один" я знаю как это сделать. Но будет намного быстрее, если существует уже готовая нативная функция в MySQL или PDO
Вы не поняли вопроса. Я знаю как получить данные столбцов. Я знаю как сделать отдельно запрос SELECT. Я хочу узнать, есть ли готовая реализация, когда при SELECT * FROM fruits, мне возвращается не только массив значений, но и информация по каждому полю, как я привел в примере. Если нужно писать функцию на php которая будет сливать "2 массива в один" я знаю как это сделать. Но будет намного быстрее, если существует уже готовая нативная функция в MySQL или PDO
Пришел к выводу, что этот гемор весь излишний. Настроил автодеплой последней версии приложения из Bitbucket при переходе по спец. ссылке. Теперь человеку даже логиниться не надо, а у меня в свою очередь в настройках принимающего файла жестко прописаны инструкции, что нужно сделать при обращении к нему. Т.к. кроме меня ни у кого нет доступа на сервер, то сервак никак от косяков сотрудника не пострадает
Victor Alenkov: ОГО! Вот в этом и было дело! Всё заработало, огромное Вам спасибо, Виктор!))
Да, я его изначально и клонировал через https, не знал даже, что из-за этого может быть подобная "блокировка"
Victor Alenkov: Тут Как пушить на github чтобы не вводить каждый раз логин и пароль? пишет чел pid ssh-agent'а должен быть 59566 у меня другой, хотя мне кажется не в этом причина.
+ рекомендует ssh-add ~/.ssh/id_rsa использовать, тоже сделал, ещё до предыдущего поста.
Есть подозрение, что это как-то связано с настройками моей VPS'ки, но в чем именно не могу понять. Пакеты все установлены какие нужно, доступы и так чуть ли не везде 777 для теста сделал, владелец везде рут, тоже для теста.
Раньше делал -t параметр, не знал, что регистра важен, спасибо.
Сделал всё точно так как вы и описали, вот что выдает
authenticated via a deploy key.
You can use git or hg to connect to Bitbucket. Shell access is disabled.
This deploy key has read access to the following repositories:
__myBitbucketLogin__/__myRepoName__: is_rsa -- root@58284.local
------------------------------------------------------------------------------------------------------------
Проблема частично решена. Удалил ключ из "Ключей развертывания" репозитория и вписал в "ssh-ключи" в настройках своего аккаунта.
Да! Теперь при проверке в консоли есть ответ
logged in as myUsername.
Но при попытке сделать гит пул от того же рута, который и создавал ssh пару ключей всё равно запрашивается логин и пароль.
В первом случае возможен был только гит пулл, что гуд на продакшн сервере, сейчас же из него можно пушить, что уже не айс. Ну не зря же сделали ключи только для деплоя?
Victor Alenkov: Сделал так, все равно не работает. Не понимаю в чем дело.
Вот что вписал в конфиг файл
Host bitbucket.org
IdentityFile ~/.ssh/git_rsa
User git
Так создавал ключи:
cd ~/.ssh
ssh-keygen -t rsa
Название git_rsa
Создаю из под рута. git pull делаю из директории которая принадлежит www-data и пул будет делать тоже www-data, хотя сейчас от рута делаю пул.
Публичный ключ выглядит так
ssh-rsa AAAAB3Nza ... 8jj root@58284.local
Может перед @ не рута нужно писать, а git или www-data? И после @ писать реальный IP сервера?
Гит пулл делаю из репозитория командой 'git pull' может параметры тут какие-то нужно добавить?
Victor Alenkov:
Собственно окончание из консоли ssh -v bitbucket.org:
You can use git or hg to connect to Bitbucket. Shell access is disabled.
This deploy key has read access to the following repositories:
__myLogin__/__myRepo__: --nameOfMyKey__ key -- root@58284.local
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
Connection to bitbucket.org closed.
Transferred: sent 2936, received 1888 bytes, in 0.3 seconds
Bytes per second: sent 10566.2, received 6794.6
debug1: Exit status 0
------------
Host bitbucket.org github.com
IdentityFile ~/.ssh/git_rsa
User git
Нужно ли для этого создавать в системе git юзера и с какими правами?
А что на счет того, что мне нужно разместить ключи для нескольких репозиториев? Нельзя же с одним именем их все использовать или внутрь git_rsa можно несколько ключей приватных запихнуть?
Хочу даже возможность обзора структуры директорий на сервере закрыть, т.к. чем больше информации об этом, тем больше риск на случай вредоносных действий. На данный момент при заходе через proftpd в свою директорию он не знает вообще что за её пределами (как я уже сказал git pull у него не робит в этом и проблема).
Далее - www-data имеет права для записи в других директориях где лежит production копия. Подпапка сотрудника условно лежит в www/myEmployee/... Олег Цилюрик предложил делать это через стандартные права (rwx), но при этом варианте www-data может всё же выходить выше по древу от www директории. Ну и придётся колдовать с правами для юзеров, мол группа ввв-дата одна, а доступ к продакшен папке для тестового юзера закрыть.
Опять же в таком случае, придётся жестко следить за правами доступа (раз в год и к закрытой папке может быть открыт доступ), а в случае с proftpd не важно какие они, человек в принципе не знает об этой папке.
На настройку proftpd ушло около 10 минут. С варгантом/докером не работал, сколько может уйти на решение озвученной проблемы если делать это с нуля включая изучение технологии?
Попробовал использовать системные команды от www-data, вроде не работают те что я называл выше. git команды вполне. Насколько будет безопасно создать для чела юзера в группе www-data, но с доп. ограничением внутри его подпапки? И можно ли как-то сделать, чтобы он не видел вышележащих директорий? Всё таки шариться там он вполне может