Xo66uT7 Сентябрь 2011MySQL, codelifehack

Времени писать полноценные посты практически нет, ввиду большой загруженности проектами, поэтому буду пробовать новый формат, который я решил назвать codelifehack, это всевозможные полезные советы в областях и языках программирования с которыми мне приходится работать.
Итак первый.

Частично скрываем email’ы, которые получаем из БД.

Что делает?

Скрывает часть символов в email, чтобы нельзя было его использовать в плохих целях.

Пример.

SELECT
 INSERT(user_info.email, 3, 4, '...') AS modif_email,
 user_info.name,
 user_info.surname
 FROM
 user_info

Нас здесь интересует строчка:

SELECT
 INSERT(user_info.email, 3, 4, '...') AS modif_email,

Функция (именно функция, есть еще другой INSERT) INSERT заменяет 4 символа начиная с третьего на символы “…” (три точки) в строке user_info.email. Краткое описание функции INSERT(str,pos,len,newstr)

Возможная проблема при использовании.

Наша замена может попасть на символы которые при замене выдадут полноценный email, пока коллизий не выявлено.

Применение.

Нам нужно построить рейтинг пользователей, но по понятным причинам мы не можем показывать на сайте email’ы наших пользователей.
Нам нужно показать что мы знаем email пользователя (который оставил предложение о продаже на сайте) и при определенных условия мы готовы его показать.
Ну и конечно же ваш вариант.

 
zend_framework

В любом нормальном проекте не избежать форматирования даты, чтобы не тратить время на реализацию своих методов и функций я хочу рассказать как быстро отформатировать дату средствами MySQL и Zend_Date.

Форматирование с помощью Zend_Date.

Для быстрого форматирования даты при выводе ее пользователю я предлагаю создать помощник вида.
Для этого создаем простой viewHelper (application/view/helpers), я назвал его DateHelper:

<?php
/**
 *
 * @author Roman
 * @version
 */
require_once 'Zend/View/Interface.php';
/**
 * DateHelper helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_DateHelper
{
    /**
     * @var Zend_View_Interface
     */
    public $view;
    /**
     *
     */
    public function dateHelper($date_value, $format)
    {
        $locale = Zend_Registry::get('Zend_Locale');
        $date = new Zend_Date($date_value, false, $locale);
        return $date->toString($format);
    }
    /**
     * Sets the view field
     * @param $view Zend_View_Interface
     */
    public function setView (Zend_View_Interface $view)
    {
        $this->view = $view;
    }
}

Теперь мы можем использовать его в view скрипте следующим образом:

$unformated_data = "2011-01-30 12:21:11";
$this->dateHelper($unformated_data, "dd MMMM"); ?>

Дата будет отформатирована в “30 January“. Для того чтобы дата выводилась с учетом локали (языка) нужно в файле Bootstrap.php добавить метод:

protected function _initLocale()
{
    $locale = new Zend_Locale('ru_RU');
    Zend_Registry::set('Zend_Locale', $locale);
}

В данном случае наш помощник вида выведет “30 января“. Модификаторы даты можно посмотреть тут.

Форматирование средствами СУБД MySQL.

Если вы получаете дату из базы, то не стоит забывать о встроенном форматировании даты в MySQL и других СУБД.

DATE_FORMAT('2011-01-30 12:21:11', '%d %M') AS FIELD_1

Функция DATE_FORMAT вернет нам “30 January“, подробнее модификаторы можно посмотреть тут

 
Xo66uT29 Август 2010MySQL

Хочу написать об очень полезной возможности MySQL, которая очень помогает в рефакторинге старой БД, точнее в переносе данных из старой БД в новую, имеющую другую структуру. В данном случае нам надо вставить в новую таблицу данные, которые мы выбираем из старой.

Давайте создадим для начала две таблицы:

CREATE database testdb;
USE testdb;

CREATE TABLE table1 (id int(10) auto_increment, fname varchar(20), lname(20), primary key(id));
CREATE TABLE table2 (id int(10) auto_increment, firstname varchar(20), lastname(20), age int, primary key(id));

Теперь добавим немного данных в таблицу для работы:

INSERT INTO table2 (firstname, lastname, age)
 VALUES
 ('Ivan', 'Ivanov', 12),
 ('Petr', 'Petrov', 13),
 ('Alex', 'Kuznetsov', 39),
 ('Vladimir', 'Ivanov', 42)

Теперь мы можем внести во вторую таблицу данные из первой отфильтрованные по WHERE, притом обратите внимание вносятся все данные, которые мы выбираем из второй таблицы, то есть запрос INSERT повторяется для каждой строчки из второй таблицы.

INSERT INTO table1 (fname, lname) SELECT firstname, lastname FROM table2 WHERE age <= 39;
 
Xo66uT8 Февраль 2010MySQL

Для одного из проектов понадобилось узнать имя поля у таблицы содержащего в себе первичный ключ. Погуглив ничего путного не нашел, ответ нарыл случайно в lists на официальном сайте. Запрос оказался очень интересным, оказывается выборку надо производить из вспомогательных полей самого MySQL.
Запрос для базы с именем db, и таблицы с именем tbl.

SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
AND t.table_schema='db'
AND t.table_name='tbl';

При желании имя БД можно опустить, но это чревато тем, что можно получить несколько результатов, если есть таблицы с одинаковым именем в разных БД.

UPD:
Спасибо Максиму, решение намного проще и изящнее.

SHOW COLUMNS FROM `table` WHERE `key`=’pri’;