Ctrl +  Позднее

6 мая 2011, 13:35

MySQL: error #1235

Когда пытаешься выполнить например такой запрос:
UPDATE `learn_answer` 
SET `QUESTION_ID` = QUESTION_ID - 1 
WHERE `learn_answer`.`ID` IN (
	SELECT ID
	FROM `learn_answer`
	WHERE `QUESTION_ID` > 367
)

Получаешь чудо ошибку. Ошибка эта гласит:
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


Когда идём в мануал, там сразу же лежит решение. Нам просто нужно использовать АЛИАС, что бы бля сделать тоже самое:
UPDATE `learn_answer` 
SET `QUESTION_ID` = QUESTION_ID - 1 
WHERE `learn_answer`.`ID` IN (
	SELECT * FROM (
		SELECT ID
		FROM `learn_answer`
		WHERE `QUESTION_ID` > 367
	) Alias
)

29 апреля 2011, 14:58

PHP: detect UTF8 :D

function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);

}
php   utf8

14 апреля 2011, 8:33

Новый PHP новые правила :) Лечим быстро растущий еррор_лог

На одном проекте, написанном н-лет назад обновили апачь+пхп+мускул+нгинксс, и скорость толстения логов просто поражала. Например за сутки лог апача из-за ошибок пхп выростал до 2ух гиг :)

За 1 заход простого юзера плюс 1-20МБ, это конечно замечательно, но нужно было как-то «пофиксить». Самым толстым ворнингом был такой:
Warning: strtotime()/strftime()/date() [function.strftime]: It is not safe to rely on the 
system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() 
function. In case you used any of those methods and you are still getting this warning, you most likely 
misspelled the timezone identifier.

Пхп, просто хотел знать дефаулт тайм-зоун, и ругался на все функции которые работают с датой :) В начале «главного» скрипта пишем:
date_default_timezone_set('UTC');


Следующий ворнинг:
PHP Deprecated:  Function ereg()/eregi()/ereg_replace() is deprecated in *

Это значит что, эти функции ereg()/eregi()/ereg_replace() нихт_арбайтен, то есть не работают, вообще. Да, в новом пхп их убили, почитать что убили можно здесь

«-Что же делать?», воскликнет читатель. Есть два пути.
  • заменить все дохлые функции живыми аналогами
    // Все меняем на preg_match
    ereg("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/", $this->file_src_name, $extension);
    // да, на preg_match
    $this->file_dst_name_body = ereg_replace("[^A-Za-z0-9_]", "", $this->file_dst_name_body);
    $this->file_dst_name_body = preg_replace("/[^A-Za-z0-9_]/", "", $this->file_dst_name_body);
    // тут появится модификатор regexpа
    eregi("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/i", $this->file_src_name, $extension);
  • в настройках включить поддержку старых функций, которая отрубает поддержку новых
    mbstring.func_overload = 7
Если код старый и ТОЛСТы, можно обойтись и заменой в хтакцесс, а если нет, то лучше да ;)
bugs   php

9 апреля 2011, 16:52

CSS: nth-child параметры псевдокласса

Значение Номера элементов Описание
1 1 Первый элемент, является синонимом псевдокласса :first-child.
5 5 Пятый элемент.
2n 2, 4, 6, 8, 10 Все четные элементы, аналог значения even.
2n+1 1, 3, 5, 7, 9 Все нечетные элементы, аналог значения odd.
3n+2 2, 5, 8, 11, 14
-n+3 3, 2, 1
5n-2 3, 8, 13, 18, 23
even 2, 4, 6, 8, 10 Все четные элементы.
odd 1, 3, 5, 7, 9 Все нечетные элементы.

6 апреля 2011, 11:17

MySQL: utf8_unicode_ci и utf8_general_ci

Увидел в проекте странный коллейшон у базы utf8_unicode_ci. Решил почитать что за зверь, и нашёл на сайте мускула простой ответ:
For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “ß” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.
Дам вольный перевод:
Для всех юникодовых кодировок операции сравнения происходят быстрее с _general_ci (на 30%), но они менее правильные чем с _unicode_ci (ещё генерал_си не чувствительна к регистру). _unicode_ci поддерживает отображения, в виде разложения, то есть для одного символа “ß” одной языковой группы может соответствовать пара других символов “ss” другой языковой группы. _general_ci есть наследственным коллейшеном, что не поддерживает расширений, сокращений или игнорируемых символов.


То есть желательно от неё избавиться, хотя могут возникнуть некоторые проблемы с поиском и тегами :)

1 апреля 2011, 20:07

Javascript Capitalize :D

var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1)

1 апреля 2011, 19:42

PHP: отладка в сложнодоступных местах :)

ob_start();

	print_r(get_defined_vars());
	
$output = ob_get_contents(); 
ob_end_clean();

$f = fopen('output.txt', 'w+');

fwrite($f, $output);
fclose($f);

24 марта 2011, 12:45

PHP: strtolower, strtoupper и кириллица

Эти функции на кириллицу просто так не обращают внимания. Строки остаются без изменений, печаль и т. д. В данном случае могут помочь mb_* мультибайтовые аналогичные функции, но если их нет, нужно просто правильно поставить локаль, и простая функция заработает как нужно.
setlocale(LC_ALL, 'ru_RU');
$name = strtolower($name);

20 марта 2011, 23:35

PHP: sort multiple array (ASC, DESC)

function array_orderby(){
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}
$results = array_orderby ($results, "P", SORT_DESC, "GD", SORT_DESC);

В похапе 5.3 мы получим болт а не сортировку, потому пришлось искать замену, и первое что приглянулось, это вот такой код с анонимными функциями и усорт
function sort_multi_array ($array, $key){
  $keys = array();
  for ($i=1;$i<func_num_args();$i++) {
    $keys[$i-1] = func_get_arg($i);
  }
  // create a custom search function to pass to usort

  $func = function ($a, $b) use ($keys) {
    for ($i=0;$i<count($keys);$i++) {
      if ($a[$keys[$i]] != $b[$keys[$i]]) {
        return ($a[$keys[$i]] < $b[$keys[$i]]) ? -1 : 1;
      }
    }
    return 0;
  };
  usort($array, $func);
  return $array;
} 

Здесь мы получим сортировку АСК по всем ключам, что бы сделать обратную используем аррай_реверс, а что бы ключи работали в функции — нужно подумать, может когда будет нужно переделаю, на данном этапе мне достаточно этого.

чиирз

17 марта 2011, 10:46

PHP: превращаем слово единственного числа в множественное

Нужно было, быстро на коленке стряпать такую вот функцию. Изначально она была сделана по примерам возможных слов, и приняла такой вид:
function make_multiple($word) {
	$word = trim($word);
	$lst1 = substr($word,-1);$rest1 = substr($word,0,-1);
	$lst2 = substr($word,-2);$rest2 = substr($word,0,-2);
	$lst3 = substr($word,-3);$rest3 = substr($word,0,-3);
	
	if ($lst3 == "нки") $word = $rest3."нков";
	elseif ($lst2 == "ки" || $lst2 == "ка") $word = $rest2."ок";
	elseif ($lst2 == "ры") $word = $rest2."р";
	elseif ($lst2 == "ия") $word = $rest2."ий";
	elseif ($lst2 == "рь") $word = $rest2."рей";
	elseif ($lst1 == "ы") $word = $rest1."ов";
	
	return $word;
}

Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
function make_multiple($word) {
	$word = trim($word);
	//  массив возможных вариантов
	$ends = array(
		"нки" => "нков",
		"ки" => "ок",
		"ка" => "ок",
		"ры" => "р",
		"ия" => "ий",
		"рь" => "рей",
		"ы" => "ов"
	);
	// ищем самое большое окончание, то есть его длину
	$itrs = max(array_map('strlen', array_keys($ends)));
	$poly = array();
	// строим массив этих окончаний, и слов без них
	for ($i = $itrs; $i > 0 ; $i--) {
		// в таком виде что бы избежать циклов в цикле
		$poly[$i] = array(substr($word,-$i),substr($word,0,-$i));
	}
	// строим нужно слово, когда найдём сопадение
	foreach ($ends as $what => $to) {
		if ($poly[strlen($what)][0] == $what) {
			return $poly[strlen($what)][1].$to;
		}
	}	
	return $word;
}

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

10 марта 2011, 13:49

Мускул апдейт, ORDER BY RAND() не работает / not work

После обновления мускула, просто перестал работать такой запрос, все время одно и тоже число :)
SELECT * FROM your_table ORDER BY RAND() LIMIT 1;
#Теперь нужно так:
SELECT * FROM your_table ORDER BY RAND(NOW()) LIMIT 1;

Вместо NOW() можно вставить и UNIX_TIMESTAMP(), но блин, может и не помочь, если часто обращаться.

3 марта 2011, 16:36

Универсальный print_r

Окончательный ремейк будет выглядеть вот-так:
if (!function_exists('printr')) {
	function printr($array) {
		$args = func_get_args();
		if (count($args) > 1) {
			foreach ($args as $values)
				printr($values);
		} else {
			if (is_array($array) || is_object($array)) {
				echo "<pre>";
				print_r($array);
				echo "</pre>";
			} else echo $array;
		}
	}
}
printr($arr1,$arr2);

28 февраля 2011, 17:01

UFT8 и PHP

Казалось бы, как только начинаешь использовать мультибайт, тебя спасут теже функции, только с mb_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')
Что-то типа такого, и да, мануалы в помощь.

Для почитать на досуге, советую:



PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
php   utf8

30 января 2011, 22:53

Firefox CSS3 render fail (scroll lag)

На работе я разбаловался довольно мощным компом, потому многих вещей я просто не замечал. Этой весной моему домашнему бучеку будет 5 лет. Я им вполне доволен, 17» экран, 125фпс в ку3 (на настройках для игры) — но, фокс 3.6.13 очень лагает, когда на странице есть цсс3 градиентики и бокс-шадовс. Он просто реально умирает, и проц 100%. В остальных браузерах, вебкиты, говнооперы и ИЕ все ок, «ТАКИХ» лаг нет.

Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.

Частичной панацеей для бокс-шадов есть такая конструкция:
.shadow {-moz-border-image: url("/imgs/shadow.png") 10 / 3px;}
Где картинка выглядит вот-так http://deer.org.ua/images/shadow.png, ну а градиенты картинками, чего очень не хочется.

зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.

27 января 2011, 16:22

Обновления скриптов

27 января 2011, 12:29

Mysql show create

mysql> show create database AAA;
+----------+-----------------------------------------------------------------------------------+
| Database | Create Database                                                                   |
+----------+-----------------------------------------------------------------------------------+
| AAA      | CREATE DATABASE `AAA` /*!40100 DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin */ |
+----------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table charset_test2;
+---------------+------------------------------------------------------------------------------+
| Table         | Create Table                                                                 |
+---------------+------------------------------------------------------------------------------+
| charset_test2 | CREATE TABLE `charset_test2` (
  `str` varchar(20) collate cp1251_bin default NULL,
  `str2` varchar(20) character set cp1251 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin |
+---------------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

26 января 2011, 19:02

PHP&MYSQL:Сравнение нескольких таблиц в БД и генерация скрипта обновления

Полгодика назад я написал артикль на тему сравнение таблиц в двух БД (и больше), основная идея которого была в том, что бы быстро сравнить 2 таблицы одинаковой системы с разными версиями и обновить старую БД. Делал всё руками, так как изменений было не много.

А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)

Полная генерация «апдейт ескуель»:
  • альтер чендж
  • альтер адд
  • криейт тейбл
  • адд индексес
  • ремув индексес
  • сам УИ импрувементс


25 января 2011, 11:35

PHP: get google.PR end yandex.QI (тИЦ)

Обновил скрипт, что и как смотреть в старой статье.


25 января 2011, 11:13

javascript: выколиглаз

Вставьте этот код в адресную строку :)




20 января 2011, 17:58

Прикол с аддоном IE Tab Plus

Дебажив сайты, случайно обнаружил, что у меня на всех сайтах грузятся одни и те же скрипты, которых я как бы не заказывал, а именно:
  • htt ps://www.superfish.com/ws/sfw.jsp?clientVersion=1.2.0.7&dlsource=ietab&userId=RzSKuZipQ5KcdowsVZukzg&statsReporter=false
  • htt ps://www.superfish.com/ws/js/sf_conduit.js?ver=4.0.1
  • htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/dojo.xd.js
  • htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/io/script.xd.js
  • htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/window.xd.js
  • htt ps://www.superfish.com/ws/getSupportedSitesJSON.action?ver=2.1&callback=SF_isURISupported
Версии могут отличатся. Я немного под офигел, погуглил, и узнал что во всём виноват аддон, которым я не пользовался уже месяца 3, а именно IE Tab Plus.
зы: я помню, о том что бы расписать как работает анимация в цсс3, сделаю это на выходных :)
Ctrl +  Ранее