воскресенье, 7 августа 2011 г.

Замена по регулярному выражению в MySQL

Вот так можно делать замену подстроки в строке по регулярному выражению в MySQL.

DELIMITER //

CREATE FUNCTION preg_replace(pattern varchar(10000), replacer varchar(10000), original varchar(10000))
RETURNS varchar(10000)
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR(10000);
DECLARE ch VARCHAR(1);
DECLARE i INT;
SET i = 1;
SET temp ='';
IF original REGEXP pattern THEN
loop_label: LOOP
IF i>CHAR_LENGTH(original) THEN
LEAVE loop_label;
END IF;
SET ch = SUBSTRING(original,i,1);
IF NOT ch REGEXP pattern THEN
SET temp = CONCAT(temp, ch);
ELSE
SET temp = CONCAT(temp,replacer);
END IF;
SET i=i+1;
END LOOP;
ELSE
SET temp = original;
END IF;
RETURN temp;
END//

UPDATE news
SET content = preg_replace('\r+', ' ', content)//

пятница, 5 августа 2011 г.

Yii DAO и маппинг

При работе с фреймворком yii возникла необходимость выполнить сложный sql-запрос. Такой, что проще было использовать DAO, чем Active Record.

Примечание: AR не дает решения для всех задач, касающихся работы с базами данных. Лучше всего его использовать для моделирования таблиц в конструкциях PHP и для несложных SQL-запросов. Для сложных случаев следует использовать Yii DAO.

Но очень расстраивало, что DAO возвращает ассоциированные массивы, а не объекты. Везде на сайте используется ORM, а тут вдруг выборка массивами...

К счастью, было найдено решение при помощи PDO-магии. И оно работает, отдает и заполняет объект, как при использовании AR.


Copy Source | Copy HTML
  1. $command=Yii::app()->db->createCommand($sql);
  2. $command->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Post");
  3. $posts=$command->queryAll();

вторник, 22 марта 2011 г.

Как добавить BOM

Небольшой скрипт, добавляющий UTF BOM к файлу. Да, это умеют многие текстовые редакторы. Но иногда лучше решать подобные задачи инструментально.

Copy Source | Copy HTML
  1. #!/bin/bash
  2. fi=$1;
  3. fo="$1_with_bom"
  4. echo -ne '\xEF\xBB\xBF' > $fo
  5. cat $fi >> $fo
  6. mv $fo $fi

К слову, так можно удалить BOM из строки на php
$str = preg_replace("/\xef\xbb\xbf/","",$str);