На моей текущей работе возникла проблема с текущим сервером, на котором находится высоконагруженый сервис. Выгорело половина сервера, а значит процессор стал 8-ми ядерным из 16-ти и mysql, которая требовательна к ресурсу, перестала тянуть нагрузку. Было принято решение переехать на новый сервис. Переезд прошел удачно и я решил так же обновиться с mysql 5.5 до mysql 5.6 версии и тут я столкнулся со следующей проблемой…
Рубрика: MySQL
MySQL
Nginx + php5-fpm + mysql конфиг. Будет обновляться.
Пример, чтобы сохранить конфиг nginx 1.8, php5-fpm 5.6 и mysql 5.6
Читать далее
Mysql: несколько полезных команд для восстановления пользователя и другие
Случилась давеча беда. Перестал подключатся пользователь с другого сервера к базе mysql. Однако phpmyadmin работает под этим пользователем и другие приложения работают. Первая мыль была – не пускает хост. В процессе выяснения пользователь похерился, и перестало работать все.
Согласование временных зон между приложением и mysql.
Достаточно избитая во всевозможных блогах, в постах на хабре тема. Даже на офф сайте Mysql даны разъяснения и достаточно пруф линков. И все же есть несколько граблей, на который можно наступить, о которых мало где написано.
Перенести записи в категорию одним запросом
Всякие там плагины типа Butch Move и т.д. отстой, заманаешься клацать. Стандартный интерфейс вордпресса тоже сосет. Надо всего-то
1 2 3 4 5 |
UPDATE wp_term_relationships SET term_taxonomy_id = '1250' WHERE term_taxonomy_id = '1' AND object_id IN (SELECT ID FROM wp_posts WHERE post_date <= '2011-05-28' AND post_type = "post"); |
Та-да !!! :)
Перенести в категорию 1250 все, у которых категория 1 и посты раньше даты 2011-05-28 и тип post.
А вот так можно скрыть записи с какой-то даты
1 2 3 |
UPDATE `wp_posts` SET `post_status` = 'private' WHERE `post_date` < '2011-07-23' AND `post_status` = 'publish' |
Третья и завершающая про PDO теоретически и PHP форумы
Вопрос, который я задал в предыдущем посте продублировал на 5 форумов. Все форумы тематические, по PHP. Зачем я это сделал?
- Найти ответы.
- Проверить эти форумы на активность и юзабельность.
В итоге ответы нашел сам, в чужом коде. А о форумах выводы сделал.
Ответы были крайне просты. Надо было мне внимательнее читать документацию. Последний ид оказался свойством самого класса PDO.
http://ru.php.net/manual/ru/pdo.lastinsertid.php
А кол-во последних измененных строк получаются по методу стейтмента
http://ru.php.net/manual/ru/pdostatement.rowcount.php
Теперь о форумах:
http://www.php.ru/forum/ – не получил ответа. вообще никакого ответа, т.е. низкая активность?
http://phpclub.ru – сначала пытаются троллить, вместо диалога, потом наводками. в итоге ответ написал я сам. так же не понравился дизайн, добавление ответа через аякс.
хотя позже диалог завязался, подтянулись участники, меняю мнение.
Форум Школы Программирования – мертвый.
http://phpforum.ru – тут то и увидел код, натолкнувший на ответ. понравилось у них, особенно дизайн.
http://pyha.ru/forum/ – наверное зе бест. и дизайном и атмосферой. чего только стоит оценка ответов – ХУЙНЯ, а форум новичков назван “для идиотов”
В итоге я смогу закончить работу над своим драйвером и использовать его постоянно в ядре сайтов.
Драйвер БД через PDO
Решил сделать драйвер БД через PDO. С mydql напрямую все просто и однозначно, но не с PDO.
Возникло пару вопросов.
Драйвер должен состоять всего из 4-х ф-й : select, insert, update, delete. Логика их работы не имеет значения. Вызов просто $this->db->select(); в чем и профит.
У PDO есть ф-я query() которая просто для select и возвращает стейтмент, который можно потом fetch(). А что если в селекте есть параметры? Их же надо экранировать. Использовать sprintf() в связке с mysql_real_escape_string() когда речь идет о PDO не кошерно.
Сначала я написал ф-ю
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<? public function Select($query) { try { $stmt = M_PdoDB::query($query); $result_rows = array(); while ($row = $stmt->fetch()) { $result_rows[] = $row; } return $result_rows; } catch (PDOException $e) { echo $e; return false; } } ?> |
И завис. Как же быть с параметрами? Для экранирования в PDO используется ф-я prepare(), куда передается sql запрос с параметрами WHERE например ‘id = :id ‘. Далее делаем bindParam(‘:id’, $my_id); и выполняем execute().
Хорошо, можно переписать мою ф-ю иначе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<? public function Select($query, $param = array()) { try { $stmt = M_PdoDB::prepare($query); if ($param) { foreach ($param as $k => &$v) { $stmt->bindParam(':' . $k, $v); } } $stmt->execute(); ?> |
Но тогда надо помнить всегда про PDO, передавать sql в формате типа ‘:id’ и параметры array( “id” => $id);
Есть ли какое-то более элегантное решение?
И что делать с запросами Insert и Update где я хочу узнать кол-во измененных столбцов? execute() возвращает true или false.
Можно использовать exec() но снова – как тогда быть с параметрами?
PHP PDO. Краткое руководство
Автор 27 Апрель 2011 | Дмитрий Андреев, собственно я спер у него.
На днях решил разобраться с php PDO. Это интересно и необходимо изучать новые технологии. Русской документации нигде не нашел, потому и решил выложить. Надеюсь эта статья будет Вам интересна.
Вакансия… Вот к чему я стремлюсь.
PHP-программист
$2000
30.12.11 17:51:38 Одесса
ЗАДАЧИ:
Участие в разработке интересных уникальных сервисов и дальнейшее их развитие.
Исключающий запрос в mysql: not in против left join.
Добрый день.
Ситуация такая. Во первых мы имеем дело с большой таблицей debtors 3000-5000 записей. Мне нужно выбрать из этой таблицы записи только те, которые не входят в записи, получаемые другим запросом.