?

Log in

No account? Create an account
PHP Developer's Journal [entries|friends|calendar]
PHP Developer

[ website | PHP.NET ]
[ userinfo | livejournal userinfo ]
[ calendar | livejournal calendar ]

Переопределить или добавить любой метод класса в PHP без runkit и т.п. расширений [20 Aug 2014|11:58am]

zupernintendo
- Как без изменения исходного кода переопределить метод в PHP стандартными средствами? Реально?
Короче что-то типа микшенов. Динамически изменяем класс (не созданный объект).

- можно ли навесить на new SomeClass() какойто обработчик чтобы дополнительно менять состояние объекта ( инициализировать свойства)

- В трейтах мы задаем статически: use Pprint;
А есть ли другой способ чтобы типа: add_trait('SomeClass', 'TraitName') ?

UPD:

пока видел способы:
- отлов до загрузки кода класса и модификация потом eval
- отлов до загрузки кода класса и модификация в какойто временный файл и include (как я понял Go AOP использует этот принцип только файлы в стримах а не реальные?)
15 comments|post comment

php_value auto_prepend_file vendor/autoload.php [02 Aug 2014|02:35pm]

zupernintendo
Можно ли и что прописать в .htaccess чтобы из подкаталогов работало автоподключение файла?

Прописываю:
php_value auto_prepend_file vendor/autoload.php

в vendor/autoload.php:
var_dump('[INIT]');

из корня сайта, например /index.php - ок
из подпапки, например /catalog/index.php - пишет не может найти файл vendor/autoload.php.

хочу избавится от прописывания в каждом файле require 'vendor/autoload.php'
require '../vendor/autoload.php' и т.п.
9 comments|post comment

Вопрос [02 Jul 2014|05:58pm]

iultinrom
Хотелось бы узнать, живо ли ещё сообщество, а то приходится по закрытым форумам бегать
22 comments|post comment

[30 Jun 2014|12:42pm]

may_cat_ghost
Коллеги, возможно кто-нибудь сталкивался с проблемами с CURL в php? Симптомы:
- запрос успешно проходит, но данные в теле сообщения не приходят.
- мало того, заголовки говорят, что в теле 59 символов. http://joxi.ru/WSKxU_3JTJAhYwGojX8 однако их нет!
- тело сообщения пытаюсь получить через curl_exec, вот исходники: http://joxi.ru/siKxU_3JTJBfA0ZP9Dw опция RETURN_TRANSFER включена.
6 comments|post comment

PHP / Проверяем уникальность пользователя для голосования без регистрации. [26 Jun 2014|04:48pm]

gr33tx
Оригинал взят у gr33tx в PHP / Проверяем уникальность пользователя для голосования без регистрации.
Однажды появилась задача идентифицировать уникального пользователя сайта для голосования без регистрации.
Задачу решил с использованием кукисов и получения юзер-агента.

код:
// вычисляем уникальность пользователя.
$user_agent = $_SERVER[REMOTE_ADDR].$_SERVER['HTTP_USER_AGENT'];
$user_agent = md5($user_agent);
$cookie = mysql_escape_string( htmlspecialchars(stripslashes ($_COOKIE['u']) ) ); //получили куку
$query = mysql_query("SELECT * from unique_users WHERE hash='$cookie'",$db); //есть ли пользователь в базе с таким куки хэшем
$result = mysql_fetch_array($query);
if (!empty($result[id])) { //если есть то берем его id из базы.
$user_id = $result[id];
mysql_query ("UPDATE unique_users SET last_visit='$user_agent' WHERE id='$user_id'", $db); //куки в порядке, но надо занести   user-  agent в базу.
} else {
 $query = mysql_query("SELECT * from unique_users WHERE hash='$user_agent'",$db); //есть ли пользователь в базе с таким хэшем     агента
 $result = mysql_fetch_array($query);
if (!empty($result[id])) { //если есть, то берем его id из базы и обновляем куку
 $user_id = $result[id];
 setcookie("u", $user_agent, time()+0x7FFFFFFF);
} else { //если нет ни того, ни другого, то проверяем агент по last_visit
   $query = mysql_query("SELECT * from unique_users WHERE last_visit='$user_agent'",$db); //есть ли пользователь в базе с таким     хэшем   агента
   $result = mysql_fetch_array($query);
 if (!empty($result[id])) { //если был такой то записываем ему его хэш
   $user_id = $result[id];
   mysql_query ("UPDATE unique_users SET hash='$user_agent' WHERE id='$user_id'", $db);
   setcookie("u", $hash, time()+0x7FFFFFFF);
 } else { //если совсем свежий пользователь то даем ему новую куку и заносим в базу
     setcookie("u", $user_agent, time()+0x7FFFFFFF);    
     $query = mysql_query ("INSERT INTO unique_users (hash) VALUES ('$user_agent')", $db);
     // Проверяем, есть ли ошибки
    if ($query=='TRUE'){
     $query = mysql_query("SELECT * from unique_users WHERE hash='$user_agent'", $db);
     $result = mysql_fetch_array($query);
     $user_id = $result[id];
     //echo 'new ok '. $user_id;
   }
 }
}
}
echo $user_id; //пользуемся id посетителя для проверки повторов в голосованиях



Создаем таблицу в базе с тремя полями: id (авто инкремент), hash и last_visit
По шагам:
1. Если у посетителя есть кука, то проверяем, была ли она в базе. Если да, то берем соответствующий id пользователя и отмечаем его куку в поле last_visit чтобы опознать его в следующий по юзер-агенту если он вдруг подчистит куки.
2. Если не совпала кука, но совпал агент, то сохраняем ему эту же куку и берем id.
3. Если не совпало ни то, ни другое, то проверяем, был ли этот агент по полям last_visit нашей таблицы. Если этот хитрец уже был, то заносим его агент в первое проверочное поле hash и отдаем ему опять его куку.
4. Если такого агента нет ни в первом поле hash, ни в поле last_visit, значит это новый посетитель. Занесем его агент в поле hash и отдадим новую куку.
18 comments|post comment

PHP разработчик [20 Jun 2014|01:22pm]
lamks
Друзья. Ищу PHP разработчика, не уставшего работать с сайтами - возможно из веб студии.
Сотрудник нужен на интернет площадку. Проект крупный. Задача - работа со спецпроектами под крупных клиентов компании. Спецпроекты - сайты разных тематик: тестирование, консультации, дневники, конкурсы и т.д.
Условия - 100К чистыми+бонус за работу.
Территориально: м.Сухаревская, г.Москва.
Кто заинтересован, пишите на почту: aleksey.v.markov@gmail.com
post comment

mysql_insert_id() и запрос UPDATE [19 Mar 2014|02:36pm]

phorror
Оно, конечно, больше в ru_mysql, но там публикация премодерируемая, да и вообще.

В документации к этой функци написано, что Returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE statement. В точно такой же формулировке оно перекочевало и в похапешный мануал.

Так вот, вопрос: что это за UPDATE statement, который меняет автоинкремент?

Если речь о вызове LAST_INSERT_ID() с параметром, то вызывать её можно не только в апдейте, но и в селекте. Или даже в делите исхитриться.
В общем, непонятно - то ли в документации косяк, либо я чего-то не знаю про апдейт.
8 comments|post comment

Прямо государственная цензура [19 Mar 2014|09:50am]

dragga_ar
это не перебор в настройках сообщества -- любой коммент с ссылкой в спам гнать?
Неприятно.
10 comments|post comment

Доступ к странице по паролю [19 Mar 2014|11:28am]

art_volna
Здравствуйте!
Не могу понять, где ошибка. Помогите, пожалуйста, разобраться.
Необходимо, чтобы при вводе определённого пароля в поле формы (файл login.php) открылась страница secret.php.

Файл login.php
<?php
    if(!empty($_POST))
    {
        header('location: secret.php?key=' . $_POST['login']);
        exit();
      
    }
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Наш сайт</title>
        <meta charset="cp1251" />
    </head>

    <body
        <form method="POST">Введите пароль<br/>
        <input type="text" name="login" /><br/>
        <input type="submit" name="submit" value="Вход" />
        </form>
    </body>
</html>


Файл secret.php
<?php
if($_GET['key'] != 'www111')
{
    header('location: login.php');
    exit();
}
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Наш сайт</title>
        <meta charset="cp1251" />
    </head>

    <body
        <p>Секретная страница</p>
    </body>
</html>
30 comments|post comment

PDO эмуляция через mysql или mysqli [21 Jan 2014|07:09pm]

zupernintendo
Есть ли обертка какая-то чтобы эмулировать PDO через mysql или mysqli функции?
1 comment|post comment

htmlspecialchars вырезает double-backslash [12 Dec 2013|04:18pm]

rootkid
всем привет, или subj или лыжи не едут, помогите

%cat script.php
<?php
$str = 'qwerty\\asdfgh\n';
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

%php script.php
qwerty\asdfgh\n
         ^^^
пропал один бэкслеш, как чинить?


%php -v
PHP 5.4.10 (cli) (built: Dec 26 2012 17:03:30)
19 comments|post comment

О выборе хостинг-провайдера [07 Dec 2013|12:17am]

hjayu
Знаю, что к выбору хостинга нужно отнестись довольно-таки серьезно. Поэтому решил проконсультироваться со знающими людьми. Надеюсь, на ваши советы.
А то наслышан, как сайты бывает лагают по страшному, особенно, если посещаемость значительно увеличивается. И есть ли смысл сразу брать дорогой хостинг? Или первое время можно даже бесплатным воспользоваться?
13 comments|post comment

тормозит phpmyadmin [11 Nov 2013|06:10pm]

white_thesis
Hi

Cтранным образом начал тормозить phpmyadmin. Левая панель (navigationframe) встает раком на полминуты..минуту. Я вставил в код вывод отметок времени, но конкретное место торможения поймать не удается, потому что оно ПЛАВАЕТ. Эти полминуты теряются то в одной точке выполнения, то в другой. Абсурд.
Но в целом видно, что проблемы вызывает получение списка баз и сводной информации по таблицам баз.

Хостер nic.ru. Их собственный (https://phpmyadmin.nichost.ru/), которым они и предлагают пользоваться, работает без тормозов, но настройки его мне недоступны - это не лучший вариант решения.

Может кто-нибудь помочь мне умным советом?
8 comments|post comment

php.net пару дней раздавал трояна [25 Oct 2013|03:36pm]

dil
Сайт был немножечко хакнут, и примерно с 22 по 24 октября раздавал трояна по имени Tepfer, которого мало кто из антивирусных программ распознаёт.
23 октября сайт был заблокирован в Google Safe Browsing. Сейчас уже вроде бы разблокирован, но если кто его посещал в последнее время, проверьтесь на всякий случай.

Ссылки по теме:
http://www.theregister.co.uk/2013/10/24/php_site_malware_warning_flap/
http://www.tripwire.com/state-of-security/top-security-stories/php-net-web-pages-serving-malware/
http://php.net/archive/2013.php#id2013-10-24-2

кросспост из securityblogru
7 comments|post comment

display_errors и другие булевские переменные [17 Oct 2013|10:53am]

dil
В документации написано, что display_errors, начиная с 5.2.4 стал string со значениями "stderr" или "stdout", а раньше был boolean. Но нет никаких пояснений относительно того, как новые версии воспринимают старые значения.
Хуже того, в начале той же страницы с документацией написано, что значение по умолчанию у этого параметра - "1".

У меня есть машина с PHP 5.3.10, в php.ini написано display_errors=Off. При запуске никакой ругани в логах не наблюдается.

Вопрос нумер 1: а как оно при этом работает? Оно включено или выключено? Если включено, то куда пишет? И как это можно угадать?

Вопрос нумер 2: как идеологически правильно указывать булевские значения в php.ini? Аффтары официальной документации сами с собой не могут договориться по этому вопросу. Они используют то "0"/"1" в кавычках, то без кавычек, то On/Off, то on/off.
12 comments|post comment

Визуально строки одинаковые а при сравнении false [18 Sep 2013|09:04pm]
tayoursky
Как то так... беру значение из базы сравниваю из файла xml условие выдает false смотрю что приходит одинаково на глаз, проверяю по байтам разница в один байт.... в базе 36 в xml файле 35.... сижу гадаю из xml объект с массивом из базы подстрока в ячейке.... думал перевод строки-нет не он. Что может еще быть?
14 comments|post comment

php & xml [17 Sep 2013|05:00pm]
tayoursky
//для полного понимания начну с самого начала. Необходимо сознадть xml файл с определенными узлами корневыми и дочерними для каждой записи из базы допустим работников..
// для этого берем данные из базы и из имеющегося классификатора адресов xml файла
appendChild($xml->createElement('ArrayOf')); // создаем корневой узел документа
libxml_use_internal_errors(true); // показываем ошибки выводимые библиотекой для работы с xml файлами
$territ = simplexml_load_file("territories.xml");// ID регионов и Name регионов берем из этого xml-справочника
$kladr = simplexml_load_file("KLADR.xml");// ID районов и названий берем из этого xml-справочника
while($res = mysql_fetch_array($ath, MYSQL_ASSOC)){ // элементы будут создаваться в цикле на каждого работника
$User = $ArrayOf->appendChild($xml->createElement('User')); // создаем корневой узел для работника

$User->appendChild($xml->createElement('Name',$res['firstname']));// создаем в корневом элементе узел Name и сразу вставляем значение

$User->appendChild($xml->createElement('Patroname',$res['midname']));//отчество

$User->appendChild($xml->createElement('Surname',$res['lastname']));//фамилия

$User->appendChild($xml->createElement('Birthdate',$res['birthday']));//дата рождения
// дальше нужны коды места где проживает работник для этого нам нужно из territories.xml достать эти коды
foreach($territ->Territory as $ter){ //перебираем файл справочник и...
if($ter->Name==$pieces3[1] OR $ter->Name==$pieces3[1].' область'){ //...если есть в справочнике запись похожая на данные этого работника
$Region->appendChild($xml->createElement('ID',$ter->ID));//....выводим ID этого региона в узле ID
$Region->appendChild($xml->createElement('Name',$ter->Name));//.... и название нормальное (полностью)
$Region->appendChild($xml->createElement('Parent',$ter->Parent));//....а также дополнительные индексы и КЛАДР региона ниже
$Region->appendChild($xml->createElement('Order',$ter->Order));
$Region->appendChild($xml->createElement('OUZ',$ter->OUZ));
$Region->appendChild($xml->createElement('KLADR',$ter->KLADR));//как мне сохранить $ter->KLADR и использовать дальше в теле цикла while??
// все отлично работает и вставляется но дальше мне нужен район а одинаковых районов в регионах много и для этого есть в
//файле справочнике KLADR.xml у районов код Parent, который относится к коду $ter->KLADR из региона
}
}
foreach($kladr->KLADR as $kld){ //перебираем файл справочник и... находим нужный район и его префиксы

if($kld->Name==$rayon[ray] and ***$kld->Parent==$ter->KLADR****){ //если район совпадает с данными полученными из базы и с кодом региона ***есил бы я мог сохранить полученный кладр региона я бы сделал такую проверку и выводился бы район из нужного региона***
$District->appendChild($xml->createElement('ID',$kld->ID));//....выводим ID этого района
$District->appendChild($xml->createElement('Name',$kld->Name));//.... и название нормальное (полностью)
$District->appendChild($xml->createElement('Prefix',$kld->Prefix));//....а также префикс и парент района ниже
$District->appendChild($xml->createElement('Parent',$kld->Parent));
}
}
}

//конец цикла while
$xml->formatOutput = true;
$xml->save('work.xml');//сохраняем всё в этот файл нашей папки

?>
20 comments|post comment

неявно меняется текущий каталог [05 Sep 2013|10:55pm]

white_thesis
хост, сайт, запрос типа www.site.ru/someshit/shit1.php, в скрипте порождается объект, у класса которого есть деструктор.

На одном их четырех разных хостингов в процессе исполнения деструктора текущим каталогом оказывается не корень сайта и не каталог скрипта, а почему-то корень файловой системы - /

Это нормально или как?
12 comments|post comment

Подскажите как проверить переменную на наличие 2-х цифр в ней или 4? [19 Aug 2013|03:49pm]
tayoursky
Если в переменной 09 то конкатенируем к ним 20 получается 2009 если в переменной уже 2009 то так и выводим...
38 comments|post comment

Про утечку ресурсов в генераторах PHP [13 Aug 2013|05:46pm]

david_m
Очень интересный и полезный момент сегодня всплыл в комментариях на Хабре. В PHP 5.5, как известно, сделали поддержку функций-генераторов, по типу питоновских. Там раньше были итераторы, но с адовым синтаксисом (как всё в SPL), а теперь ввели оператор 'yield' и всё волшебным образом упростилось.

Например, можно написать такой генератор, читающий построчно файл:

function getLines($file) {
    f = fopen($file, 'r');
    while ($line = fgets($f)) {
        yield $line;
    }
    fclose($f);
}

'yield' означает «вернуть значение и продолжить с этого места при следующем вызове функции». Имея такой генератор, можно сделать вот такую печать файла:

foreach (getLines("file.txt") as $line) {
     echo $line;
}

Удобно? Очень удобно. Оператор 'yield' выдаст все строки файла, а потом, когда файл закончится, произойдёт обычный 'return' из функции, который закроет генератор (и закончит цикл).

Но как известно, если всё идёт хорошо, значит, вы чего-то не заметили…Collapse )
63 comments|post comment

navigation
[ viewing | 20 entries back ]
[ go | earlier/later ]