Dodany: 12 maja, 2014 | Kategoria: Apache, PHP
Załóżmy, że mamy stronę: mojadomena.pl i vip.mojadomena.pl – ale na obu jest logowanie. Ciastka z mojadomena.pl będą wtedy przesłaniać te z vip.mojadomena.pl. W PHP można jednak problem obejść:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| // fix subdomain cookies
// based on from http://stackoverflow.com/a/9678857/1823945
// little changes by gnysek.pl
function skip_top_level_cookies()
{
if (!empty($_SERVER['HTTP_COOKIE'])) {
$domains_counter = array();
foreach (explode(';', $_SERVER['HTTP_COOKIE']) as $cookie_variable_string) {
$key_value = explode('=', $cookie_variable_string);
$cookie_var_name = trim($key_value[0]);
if (!array_key_exists($cookie_var_name, $domains_counter)) {
$domains_counter[$cookie_var_name] = 1;
}
$http_cookie_variables[$cookie_var_name][$domains_counter[$cookie_var_name]] = (!empty($key_value[1])) ? urldecode(trim($key_value[1])) : '';
$domains_counter[$cookie_var_name]++;
}
$levelDomain = substr_count($_SERVER['HTTP_HOST'], '.');
$newCookies = array();
foreach ($http_cookie_variables as $cookieName => $cookie) {
if (array_key_exists($levelDomain, $cookie)) {
$newCookies[$cookieName] = $cookie[$levelDomain];
} else {
$newCookies[$cookieName] = $cookie[1];
}
}
$_COOKIE = $newCookies;
}
return true;
}
if (substr_count($_SERVER['HTTP_HOST'], '.') > 1) {
skip_top_level_cookies();
} |
Tagi: cookie, order, priority, subdomain cookie, top-domain cookie Brak komentarzy »
Dodany: 8 kwietnia, 2013 | Kategoria: PHP
Potrzebowałem zaimportować plik CSV do bazy danych. Niby proste zadanie, odpaliłem PhpMyAdmina, mieliło mi plik kilka minut, po czym wysypało się na timeoucie po 5 minutach i wstawieniu 3 tys. rekordów – na 12639 dostępnych. To stanowczo za długo. Poszperałem więc po sieci, jak zwykle pomocny okazał się stackoverflow i dzięki temu dostałem takie oto zapytanie, do odpalenia w mysql z terminala (lub cmd):
LOAD DATA LOCAL INFILE "plik.csv"
INTO TABLE twoja_tabela
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
Załadowało się w ułamku sekundy.
Terminal to jednak terminal :)
1 Komentarz »
Dodany: 21 stycznia, 2013 | Kategoria: PHP
Miałem jakiś czas temu problem z phpMyAdminem pod chrome, po zaistalowaniu WAMPPa, wyświetlał się komunikat:
Zablokowane przez politykę bezpieczeństwa treści
Ta strona posiada politykę bezpieczeństwa treści, która nie pozwala na osadzenie jej w taki sposób.
Rozwiązaniem jest edycja
\libraries\header_http.inc.php
i usunięcie/zakomentowanie linijki zawierającej ustawianie nagłówka:
"X-Content-Security-Policy"
Tagi: bezpieczeństwa, content, mysql, php, phpmyadmin, policy, polityka, security, treści Brak komentarzy »
Dodany: 9 października, 2012 | Kategoria: Magento, PHP
Potrzebowałem znaleźć, gdzie jest ograniczana kolekcja produktów w widoku kategorii, przez co zamiast X produktów wyświetla się np. 9.
1 2
| class Mage_Catalog_Block_Product_List {
... |
162 163
| // set collection to toolbar and apply sort
$toolbar->setCollection($collection); |
Tagi: apply, category, filter, magento, page, pagination, toolbar Brak komentarzy »
Dodany: 5 listopada, 2011 | Kategoria: PHP
Miniaturka obrazków do youtube:
http://img.youtube.com/vi/VIDEO_ID/1.jpg
Tagi: php, thumbnail, youtube Brak komentarzy »
Dodany: 27 lipca, 2011 | Kategoria: Magento, PHP
Gdy wstawimy blok do pliku layoutu, będzie on wczytany przy generowaniu strony (nawet jeśli go nie wyświetlamy w templatce) i sprawdza cache. Dzisiaj miałem taki problem, ze aby nie nadpisywać całego magento i wyswietlania kategorii, najprościej było po prostu ustawić pewien parametr w templatce a potem ten drugi blok miał go odczytywać aby utworzyć klucz dla cache. Tu pojawił się problem, bowiem aby skorzystac z getChildHtml() musiałem ustawić blok w layoucie, co powodowało, ze generował się klucz do cache z parametru, którego jeszcze nie było i sypało błędem.
Poszukałem rozwiazania w googlach i było prawie dobre – niestety okazało się, że metoda setData wcale nie ustawi zmiennej $this->_template, a $this->_data[’template’] dla bloku, przez co output HTMLowy się nie wykonywał ($this->getTemplate() zwracało NULL).
Zatem prawidłowe rozwiązanie to:
echo $this->getLayout()
->createBlock('Name_Module_Block_Type', 'name')
->setTemplate('name/module/type.phtml')
->toHtml();
Tagi: block, createBlock, include, layout, magento, module, setTemplate, toHtml Brak komentarzy »
Dodany: 16 lipca, 2011 | Kategoria: PHP
Ostatnio przy okazji szukania pewnego błędu w kodzie byłego pracownika w pracy natknęliśmy się na ciekawą rzecz. Mianowicie w pewnej pętli foreach definiowana była zmienna tekstowa, a kawałek dalej sprawdzane było czy jest zdefiniowany w tej zmiennej pewien klucz tablicy – jeśli nie, przeskakujemy do kolejnej iteracji. W pierwszej chwili oczywistym wydało się, że skoro zmienna jest stringiem, a sprawdzamy czy istnieje klucz tablicy, to isset zwróci false i tak naprawdę pętla zawsze skacze do kolejnej iteracji.
Otóż nie. Ponieważ string jest tablicą zawierającą kolejne znaki tekstu, okazało się, że użycie klucza nieliczbowego rzutowane jest na 0, zatem funkcja isset nie sprawdza, czy istnieje klucz, ale czy istnieje pierwszy znak w owym stringu. Zatem:
1 2 3 4 5 6 7 8
| $var = 'foobar';
var_dump( $var );
var_dump( isset($var) );
var_dump( $var['test'] );
var_dump( isset($var['test']) );
var_dump( isset($var[0]['test']) );
var_dump( empty($var['test']) ); |
drukuje
1 2 3 4 5 6
| string(6) "foobar"
bool(true)
string(1) "f"
bool(true)
bool(false)
bool(false) |
Ach to typowanie dynamiczne w PHP :)
Tagi: array_key_exists, in_array, isset 1 Komentarz »
Dodany: 22 stycznia, 2011 | Kategoria: Yii
Wyświetlanie widoku z innego kontrolera/folderu/ścieżki w tym obecnym.
Sprawiło mi to trochę problemu, a sprawa taka prosta…
$this->render('/index'); – wyrenderuje nazwaKontrolera/index.php
$this->render('//index'); – wyrenderuje views/index.php
$this->render('//folder/plik'); – wyrenderuje views/folder/plik.php
Tagi: controller, kontroler, render, view, widok, yii Brak komentarzy »
Dodany: 22 stycznia, 2011 | Kategoria: Yii
Modele korzystające z AR zwracają dane bezpośrednio z bazy, co jednak gdy chcemy np. przerobić datę tam zapisaną z postaci unix na ludzką ??
Teoretycznie najprościej było by po wczytaniu rekordu zaktualizować go (np. $this->time = date('H:i:s', $time) w afterFind()), ale ma to jedną wadę – do formularzy edycyjnych trafi ta zmodyfikowana data, a przecież do bazy trafia ona jako INT, więc się wszystko sypnie.
Odpowiedź prosta – napisać nową metodę gettera w modelu, która zwraca datę, np. getCzytelnaData():
1 2 3
| public function getCzytelnaData() {
return date('H:i:s', $this->data);
} |
Potem możemy wypisać taką datę w widoku zamiast $this->data które zwraca np. 1123123123, to $this->czytelnaData (metoda magiczna CActiveRecord::__get), a do widgetów wpisujemy jako pole z modelu 'czytelnaData’ :) Takiego pola nie ma w bazie, ale to nie znaczy, ze nie musi być w modelu – w ten sposób mozna sporo bajerów zrobić ;)
Tagi: activerecord, getter, model, yii Brak komentarzy »