Ответы пользователя по тегу PHP
  • Как защитить сайт от прямого перехода?

    @m-haritonov
    <!DOCTYPE html>
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	<title></title>
    	<script type="text/javascript">
    		if (window.top === window)
    			window.top.location = 'http://vk.com/app123456';
    	</script>
    </head>
    <body>
    test
    </body>
    </html>
    Ответ написан
    1 комментарий
  • Таблицы many-to-many и админка?

    @m-haritonov
    Вместо <select multiple> можно использовать множество checkbox'ов:
    <form action="?" method="post">
    	<ul>
    		<li><label><input type="checkbox" name="goods[]" value="132"  /> Товар 1</label></li>
    		<li><label><input type="checkbox" name="goods[]" value="234"  /> Товар 2</label></li>
    		<li><label><input type="checkbox" name="goods[]" value="465"  /> Товар 3</label></li>
    	</ul>
    	
    	<button type="submit">Отправить</button>
    </form>
    
    <pre>
    <?php
    var_dump(@$_POST['goods']); // При выборе первых двух галочек будет содержать: array(132, 234)
    ?>
    </pre>
    Ответ написан
  • Как снизить нагрузку php скрипта?

    @m-haritonov
    <?php
    for ($i = 0; $i <= 100000000; $i++)
    {
    	// Данная задержка у меня на данном примере снижает
    	// загруженность процессора с показателя в 99.9% до 68%
    	if ($i % 50 == 0)
    		usleep(1);
    }
    Ответ написан
    Комментировать
  • Комбинация физической (реальной) кнопки и программы?

    @m-haritonov
    За обработку нажатий клавиш в Вашем случае отвечает JavaScript, а не PHP (т.к. именно JavaScript выполняется на компьютере клиента). Думаю, Вам стоит написать JavaScript обработчики, которые по нажатию определённых комбинаций клавиш клавиатуры (скажем, Ctrl+1 и Ctrl+2) выполняли бы требуемые действия (выбор варианта ответа и отправка формы). А две физические кнопки при нажатии просто посылали бы в браузер коды, соответствующие нажатию на клавиатуре Ctrl+1 и Ctrl+2.

    Пример JavaScript кода для обработки нажатий клавиш:
    <!DOCTYPE html>
    <html>
    	<head>
    		<script type="text/javascript">
    			document.addEventListener('keydown', function(e){
    				// Ctrl+1
    				if (e.ctrlKey && e.which === 49)
    				{
    					alert('Выбор следующего ответа');
    				}
    			});
    			
    			document.addEventListener('keydown', function(e){
    				// Ctrl+2
    				if (e.ctrlKey && e.which === 50)
    				{
    					alert('Отправка формы с выбранным ответом');
    				}
    			});
    		</script>
    	</head>
    	<body>
    	</body>
    </html>
    Ответ написан
    Комментировать
  • Как узнать текст выражения, на котором eval() закончился с фатальной ошибкой?

    @m-haritonov
    Можете попробовать использовать PECL расширение runkit, если есть возможность его установки на сервер. В частности, runkit предоставляет класс Runkit_Sandbox, предоставляющий возможность запуска кода в изолированных условиях (в отдельно выделенной области памяти). См. метод Runkit_Sandbox::eval() в примерах в документации к классу. Также в runkit есть метод runkit_lint — аналог системного вызова «php -l file», но принимающий в качестве аргумента строку с кодом, а не путь к файлу.
    Ответ написан
    Комментировать
  • Вырезать битые символы из юникод XML

    @m-haritonov
    … сообщение удалено (написал не в ту ветку)...
    Ответ написан
    Комментировать
  • Как изучить/разобраться в чужом PHP коде?

    @m-haritonov
    По методике:
    Я начинаю изучение фреймворков с точки входа (скрипта, который вызывается при получении HTTP запроса, в случае веб фреймворка). Смотрю на возможные пути дальнейшего выполнения кода в этом входном скрипте. Затем изучаю каждый из путей выполнения, доходя до точки завершения работы этого пути (т.е. изучаю от входа к выходу, сверху вниз). Пытаюсь понять предназначение каждого из путей и участков кода, которые на этом пути встречаются. В итоге пытаюсь понять как данный фреймворк вписывается в известную мне модель работы веб технологий (HTTP и т.п.), какая часть фреймворка предназначена для устранения дублирования кода и т.п.

    По софту:
    Для статического анализа кода поищите по запросам «php reengineering», «php reverse engineering». Обратный инжинеринг PHP кода есть, например, в Enterprise Architect: www.sparxsystems.com.au/platforms/php_uml.html

    Для динамического анализа кода можете с помощью xdebug сделать профилирование вызова и на основе полученного файла построить граф с помощью специальной программы (например, KCacheGrind). Подробнее здесь: xdebug.org/docs/profiler

    Ещё ссылки на некоторые инструменты: stackoverflow.com/a/4156265/925775 (мне там приглянулся PHP Call Graph)

    P.S.: по софту мог где-то ошибиться, т.к. нет большого опыта в использовании описанных инструментов.
    Ответ написан
    2 комментария
  • Вырезать битые символы из юникод XML

    @m-haritonov
    Попробуйте так:
    <?php
    $text = file_get_contents(__DIR__ . '/20720351_2010_-_1_unicode.xml');
    $text = iconv('UTF-16LE', 'UTF-8', $text);
    // http://stackoverflow.com/a/12265956
    $text = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $text);
    $element = simplexml_load_string($text);
    var_dump($element);
    
    Ответ написан
  • Использование тернарного оператора ?: с подавлением ошибки?

    @m-haritonov
    … удалено (не туда разместил)...
    Ответ написан
    Комментировать
  • Использование тернарного оператора ?: с подавлением ошибки?

    @m-haritonov
    Этот оператор не избавляет от ошибки, а просто скрывает ее вывод.

    Собственно, это и утверждается в документации. И в случае с размещением этого оператора перед $_GET['aaa'] именно игнорирование предупреждения о неинициализованой переменной и требуется, т.к., в соответствии с предназначением данного массива, его значения приходят из вне, а не объявляются внутри программы и отсутствие предупреждений было бы уместнее, т.к. иначе приходится писать дополнительный код, которые не несёт в себе полезной нагрузки.

    Очень не рекомендую. Говорю как ZCE.

    Может, как ZCE, лучше скажите, почему Вы не рекомендуете его использовать? А то сейчас Вы обошлись простым «Это плохо, понятненько?!».
    Ответ написан
    Комментировать
  • Использование тернарного оператора ?: с подавлением ошибки?

    @m-haritonov
    У меня на PHP 5.3.16 при выполнении кода $c = @$a ? : 'default'; никаких E_NOTICE не выдаётся. Возможно, у Вас установлен свой обработчик ошибок (через set_error_handler), который игнорирует оператор "@".
    Ответ написан
    5 комментариев
  • PHPUnit + Selenium: В рамках одного теста пройти по нескольким сайтам

    @m-haritonov
    Если мне не изменяет память, то url() может принимать абсолютные URL адреса (с доменом), а через setBrowserUrl() можно задать пустой базовый путь. Т.е. попробуйте исправить свой код примерно так:

    function setUp() {
        $this->setBrowser('firefox');
        $this->setBrowserUrl('');
    }
    
    function testDo() {
        $this->url('https://www.facebook.com/facebook');
        $this->url('http://www.opera.com/computer');
    }
    
    Ответ написан
  • Неверная кодировка колонтитулов в mPDF?

    @m-haritonov
    Скачал последнюю версию с www.mpdf1.com/mpdf/download, всё работает нормально. Вот код (запускал в кодировке windows-1251):
    <?php
    $html = '
    <p>Текст</p>
    
    <htmlpagefooter name="myFooter" style="display:none">
    	<div class="footer">
    		<table class="tbl3" width=624>
    			<tr>
    				<td>Менеджера</td>
    				<td>Вася Пупкин</td>
    				</tr>
    			<tr>
    				<td>Телефон:</td>
    				<td>222 333 222</td>
    			</tr>
    		</table>
    	</div>
    </htmlpagefooter>
    <sethtmlpagefooter name="myFooter" />';
    
    require_once __DIR__ . '/MPDF57/mpdf.php';
    $mpdf = new mPDF('utf-8', 'A4', '12', '', 10, 10, 7, 7, 10, 10);
    //$mpdf->allow_charset_conversion = true;
    $mpdf->charset_in = 'cp1251';
    $mpdf->list_indent_first_level = 0;
    $mpdf->WriteHTML($html, 0);
    echo $mpdf->Output('mpdf.pdf', 'I');
    die;
    


    Могу посоветовать разве что:
    1. проверить кодировку во всех файлах (шаблон с колонтитулами, случайно, не в отдельном файле лежит?);
    2. обновить библиотеку mPDF на последнюю версию;
    3. добавить "$mpdf->allow_charset_conversion = true;", как рекомендуется в документации.
    Ответ написан
    1 комментарий
  • Drupal7: автозамена кавычек на нормальные в тексте?

    @m-haritonov
    Если говорить безотносительно Drupal, то для обработки HTML в PHP стоит использовать встроенный класс DOMDocument. Стоит, как минимум, потому, что через него (через метод loadHTML) можно пропустить HTML код с целью исправления в нём ошибок HTML форматирования (незакрытые теги и т.п.). Касательно Вашей задачи, с помощью него можно получить доступ именно к текстовым узлам дерева HTML.

    Пример парсинга (без корректного алгоритма по замене кавычек):
    <?php
    $html = '"текст в кавычках" текст "ещё текст в кавычках" <a href="http://ya.ru"><em>неправильный порядок вложенности элементов</a></em> текст <div>незакрытый элемент';
    
    $domDocument = loadHtml($html);
    $xpath = new DOMXpath($domDocument);
    
    // Выбирает только текстовые узлы
    foreach ($xpath->query('/html/body//text()') as $textNode)
    {
    	// Тут можно производить замены кавычек, учитывая текст из предыдущих $textNode
    	$textNode->data = str_replace('"', '«', $textNode->data);
    }
    
    print htmlspecialchars(saveHtml($domDocument));
    
    /*
    Выведет:
    «текст в кавычках« текст «ещё текст в кавычках« <a href="http://ya.ru"><em>неправильный порядок вложенности элементов</em></a> текст <div>незакрытый элемент</div>
    */
    


    Функции, используемые в вышеприведённом коде (содержат различные исправления для соответствующих методов класса DOMDocument):
    <?php
    /**
     * @return DOMDocument
     */
    function loadHtml($html, $charset = 'utf-8')
    {
    	$domDocument = new DOMDocument();
    
    	// Т.к. функция DOMDocument::loadHTML конвертирует сущности "&nbsp;" в обычные пробелы, 
    	// приходится экранировать эти сущности. Засипи вида "&amp;nbsp;" экранируем для того, 
    	// чтобы при обратном преобразовании они по ошибке не превратились в "&nbsp;"
    	$html = str_replace('&amp;nbsp;', '&amp;amp;nbsp;', $html);
    	$html = str_replace('&nbsp;', '&amp;nbsp;', $html);
    
    	// Удаляем символы "\r", т.к. DOMDocument::loadHTML() преобразует их в "&#13;"
    	$html = str_replace("\r", '', $html);
    
    	$html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    		<html>
    			<head>
    				<meta http-equiv="content-type" content="text/html;charset=' . $charset . '"/>
    				<title></title>
    			</head>
    				<body>' . $html . '</body>
    		</html>
    	';
    	
    	// Функция DOMDocument::loadHTML может генерировать сообщения об ошибках, которые нам
    	// не нужны (например, о незакрытом теге), т.к. мы используем данную функцию для 
    	// коррекции HTML кода. Оператор @ ошибки у данной функции не подавляет.
    	$useErrorsOld = libxml_use_internal_errors(true);
    	$domDocument->loadHTML($html);
    	libxml_use_internal_errors($useErrorsOld);
    
    	return $domDocument;
    }
    
    /**
     * @return string
     */
    function saveHtml(DOMDocument $domDocument)
    {
    	// Экспортируем в формате XHTML
    	$html = $domDocument->saveXml();
    
    	$html = str_replace('&amp;nbsp;', '&nbsp;', $html);
    	$html = str_replace('&amp;amp;nbsp;', '&amp;nbsp;', $html);
    
    	$html = preg_replace('/^\s*\<\?xml\s*[^\>]*\>\s*/is', '', $html);
    
    	// Удаляем <![CDATA[]]>, которым оборачивается содержимое тега <script></script> при 
    	// экспорте через DOMDocument::saveXml
    	$html = preg_replace('/(\<script(\s*[^\>]*)?\>)\<\!\[CDATA\[/is', '$1', $html);
    	$html = preg_replace('/\]\]\>(\<\/script\>)/is', '$1', $html);
    
    	return preg_replace('/^.*?<body>(.*?)<\/body>\s*<\/html>$/is', '$1', $html);
    }
    


    P.S.: на хабре HTML сущности в теге <source>...</source> не экранируются для вывода кода в неизменном виде (жесть какая-то), я произвёл экранирование вручную, поэтому учтите, что код может стать некорректным, если программисты хабра исправят этот баг без должной замены в существующих сообщениях.
    Ответ написан
    Комментировать
  • php, опять про кодировки

    @m-haritonov
    Ок. Делаю замену как предлагает Ogra:
    — $body = iconv($data_charset, $send_charset, $body);
    + $body = iconv('utf-8', 'cp1252', $body);
    + $body = iconv('cp1251', 'KOI8-R', $body);
    Теперь тело сообщения вообще пустое.
    Причем $body теряется при utf-8=>cp1252.

    Не удивительно. Вы, во-первых переводите строку из кодировки с более обширным набором символов (utf-8) в кодировку с менее обширным (cp1252). Во-вторых, переводите строку в кодировку cp1252, которая не содержит русских символов. В-третьих, сначала перекодируете строку в кодировку cp1252, а далее почему-то считаете, что у Вас строка теперь не в кодировке cp1252, а в кодирокве cp1251 и перекодируете уже из неё обратно в utf-8.

    Если вкратце, то эта манипуляция с перекодированием не нужна, а декодеру доверять не стоит, т.к. он может иметь большую погрешность.
    Ответ написан
    5 комментариев
  • php, опять про кодировки

    @m-haritonov
    У функции mime_header_encode из Drupal (который Вы, судя по представленным Вами заголовкам письма и используете) нет параметров, задающих кодировки.
    Ответ написан