PHP сообщество

любители кода :)

$_POST после Error 404

Bloged in Без рубрики от admin Пятница Май 30, 2008 at about 3:40 пп

Єсть проблема с получением массива $_POST после перенаправления ошибкой 404 (ErrorDocument 404 /er.php).
Перенаправление идет сквозь Apache (.htaccess). Как потом в єтом скрипте получить даные POST. $_GET я уже научился получать а POST нет.

Этих вымыть, или новых сделать.

Bloged in Без рубрики от admin Пятница Май 30, 2008 at about 12:11 дп

Где-то с неделю назад, в этом сообществе задавался вопрос как получить товары с заданной ценой из таблицы, где цена лежала в текстовом поле в дружной компании еще каких-то свойств, но в более менее определенном формате. Уважаемые участники сообщества, естественно выразили свое гневное фи, порекомендовали спрашивающему отрастить руки в более подходящем для этого месте и почитать про нормализацию таблиц, БД вообще и подумать над нужностью своего существования на земле. Я тоже так сделал, хотя перед этим, к своему душевному успокоение все-таки написал как из этого уродства что-то выбрать.
А не далее как сегодня, меня попросили присобачить одну небольшую фичу к сайту на одном прекрасном движке для интернет магазина. Так вот, славный интернет магазин, хранит информацию о заказах в сериализованном поле таблицы, в т.ч. и свойство, по которому надо делать выборку (если быть точным , то у него есть поле для этой выборки, но умная система, отчего-то заполняет его не всегда).
И тут возникает вопрос, что делать. Мне известно как минимум три места в коде, где запись добавляется (одна из них, что характерно находиться в файле mail.inc.php), и еще пяток где обновляется.
Строгость написания кода, которой придерживались уважаемые авторы замечательного продукта, наводит на мысль, что подобные же события могут быть прописаны и в еще более экзотических местах, нежели невинный mail.inc.php, а фантазия проявленная создателями в именовании переменных, не оставляет шансов банальному ctrl-f.
Вопрос заключается в том, что же делают уважаемые члены сообщества, при встречи с подобными творениями внеземного разума: добираются до всех пасхальных яиц и приводят код к подобающему виду, забивают и делают умопомрачительную по своей уродливости выборку и увеличиваю энтропию вселенной или же в слезах убегают куда подальше.

Ben? This is Danila. I need help.

Bloged in Без рубрики от admin Четверг Май 29, 2008 at about 3:12 пп

Всем привет.

Учусь программировать на PHP. Работаю с SNMP.

Есть такой код: http://tmp.valiyev.net/help.txt


В нем две функции: первая спрашивает у девайсов сколько у них сетевых интерфейсов, вторая — имя только первого интерфейса. Аутпут такой:

4
8
10
—-
lo0
lo0
fastethernet1

Моя проблема: не знаю, как сделать такой array, чтоб, если, например, у первого девайса четыре интерфейса, то и чтоб тогда он выдавал имена всех четырех. Желаемый аутпут:

4
8
10
—-
lo0
eth0
eth1
eth2
lo0
eth0
eth1
eth2
eth3
eth4
eth5
eth6
fastethernet1
fastethernet2
fastethernet3
fastethernet4
fastethernet5
fastethernet6
fastethernet7
fastethernet8
fastethernet9
fastethernet10

Короче говоря, надо array воткнуть во вторую функцию. Там сейчас вручную прописано:

$ifname[0] = snmpget($sysip[$i], $comm, “IF-MIB::ifDescr.1″);

А хочется что-то вроде:

$host1 = $array(1, 2, 3, 4)
$ifname[0] = snmpget($sysip[$i], $comm, “IF-MIB::ifDescr.1″);
$ifname[0] = snmpget($sysip[$i], $comm, “IF-MIB::ifDescr.2″);
$ifname[0] = snmpget($sysip[$i], $comm, “IF-MIB::ifDescr.3″);
$ifname[0] = snmpget($sysip[$i], $comm, “IF-MIB::ifDescr.4″);

И так далее для остальных.

Паралельные потоки в PHP

Bloged in Без рубрики от admin Среда Май 28, 2008 at about 8:29 пп

Есть скрипт который по очереди обращается допустим к 3м сайтам и получает оттуда некие данные, обрабатывает и отдает пользователю.
Дело в том, что каждое обращение к сайту и получение оттуда данных занимает секунд 10-20 допустим.
Получается что на выполнение скрипта может понадобится минута, что несколько многовато)
Было бы логично, для уменьшения времени выполнения обращаться к 3-м сайтам одновременно, дождаться получения и уже после обработать результаты. Можно было бы сократить время в 2-3 раза.
Но проблема в том, что я не представлю, как это сделать.
Как одновременно заставить обратиться к 3м сайтам, как дождаться, чтобы все 3 обращения завершились.
Спасибо.

// решено

Bloged in Без рубрики от admin Вторник Май 27, 2008 at about 10:09 дп

Как в spreadsheet_excelwriter'e группировать ячейки?
excel.png - Picamatic - upload your images
Если таки нельзя - есть ли альтернатива, способная это осуществить?

Решение состоит из 2х функций + последней версии Spreadsheet_Excel_Writer + патч:
Worksheet::setOutline:
setOutline (true, false)
Worksheet::setRow:

$worksheet1->setRow(2, NULL, NULL, 0, 1); // создаём группу 1го уровня
$worksheet1->setRow(3, NULL, NULL, 0, 2); // создаём группу 2го уровня
$worksheet1->setRow(4, NULL, NULL, 0, 2);
$worksheet1->setRow(5, NULL, NULL, 0, 2);
$worksheet1->setRow(6, NULL, NULL, 1, 3, 1); // создаём свёрнутую группу 3го уровня
$worksheet1->setRow(7, NULL, NULL, 1, 3, 1);
$worksheet1->setRow(8, NULL, NULL, 1, 3, 1);

excel2.png - upload images with Picamatic
UPD: но есть косяк - группы 3+ уровня становятся открытыми, после открытия 2го уровня.
UPD2: написал небольшой патч для Worksheet.php, добавляющий параметр fCollapsed для setRow. переписал пример под него.

*** Worksheet.php       2008-05-27 22:38:56.000000000 +0700
--- Worksheet_new.php   2008-05-28 11:11:46.000000000 +0700
***************
*** 2120,2127 ****
      * @param mixed   $format XF format we are giving to the row
      * @param bool    $hidden The optional hidden attribute
      * @param integer $level  The optional outline level for row, in range [0,7]
      */
!     function setRow($row, $height, $format = null, $hidden = false, $level = 0)
      {
          $record      = 0x0208;               // Record identifier
          $length      = 0x0010;               // Number of bytes to follow
--- 2120,2128 ----
      * @param mixed   $format XF format we are giving to the row
      * @param bool    $hidden The optional hidden attribute
      * @param integer $level  The optional outline level for row, in range [0,7]
+     * @param bool    $collapsed  =true if the row is collapsed in outlining
      */
!     function setRow($row, $height, $format = null, $hidden = false, $level = 0, $collapsed = false)
      {
          $record      = 0x0208;               // Record identifier
          $length      = 0x0010;               // Number of bytes to follow
***************
*** 2154,2159 ****
--- 2155,2163 ----
          // collapsed. The zero height flag, 0x20, is used to collapse a row.

          $grbit |= $level;
+         if ($collapsed) {
+             $grbit |= 0x0010;
+         }
          if ($hidden) {
              $grbit |= 0x0020;
          }

captcha

Bloged in Без рубрики от admin Вторник Май 27, 2008 at about 3:12 дп

Посетила меня минут 10 назад, с первого взгляда гениальная мысль (ведь уже спать пора, а так не хочеца…), которая по сути своей касается такой простой штуки как captcha. И касается она вот как.

По сути обычная капча работает по довольно примитивному способу: серверсайд генерит каринку, которую мы вставляем куда-то в рядом с полем, а после смотрим, совпадают ли у нас значения в капче и форме. Вроде все счастливы, но проблема в том, что такую капчу довольно просто распознать даже не человеку. А ту, которую довольно сложно распознать даже не человеку, человеку распознать тоже бывает довольно сложно.

По сути, теперь рассказываю как будет работать, так сказать captcha 2.0 pre aplha:
1. Серверсайд генерит какое-нибудь число (ну например оно у нас будет в пределах от 1000 и до 9999). Допустим 2000.
2. Серверсайд рандомно создает алгоритм преобразования этого чилса (несколько математических\логически и других операций с числом). На JS. Например:
value = value / 2;
value = value * 4;
value = value + 96
value = replaceEveryNumberAtChar(value, /*массив какое число заменить на какой символ*/);
3. Допустим после всего мы получили такое забавное число как B0D8, которое с помощью JS-а рисуем пользователю.

4. Юзер видит нашу капчу, вбивает ее и мы получаем на сервере значение B0D8, которое после пары преобразований (а мы сохраняем в сессии каких) сравниваем. И если все хорошо - значит капча пройдена.

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

Group_Concat

Bloged in Без рубрики от admin Воскресенье Май 25, 2008 at about 6:12 пп

Начиная с версии 4.1 в mySql существует функция Group_Concat. Временами она бывает весьма полезна, может кому-нибудь пригодится. 
Вот выдержка из PHPInside (#19' 2007)

Формат записи прост:
GROUP_CONCAT (выражение)
Данная функция возвращает строку результата с объединенными значениями из группы, не
равными NULL. Где это может пригодиться?
Для примера рассмотрим получение массива в PHP без введения циклов внутри самого PHP-кода.
CREATE TABLE services (
id INT UNSIGNED NOT NULL,
client_id INT UNSIGNED NOT NULL,
KEY (id));
INSERT INTO services
VALUES (1,1),(1,2),(3,5),(3,6),(3,7);
SELECT id,client_id FROM services WHERE id = 3;
+—-+———–+
| id | client_id |
+—-+———–+
| 3 | 5 |
| 3 | 6 |
| 3 | 7 |
+—-+———–+
SELECT id,GROUP_CONCAT(client_id) FROM services WHERE id = 3 GROUP BY id;
+—-+————————-+
| id | GROUP_CONCAT(client_id) |
+—-+————————-+
| 3 | 5,6,7 |
+—-+————————-+

Что бы нам пришлось сделать на PHP в обычной ситуации:
CODE:
<?php
$res=$mysqli->query(”SELECT id,client_id FROM services WHERE id = 3″);
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {
$result[] = $row['client_id'];
}
$res->free();
?>
PHP Inside'19 >> В фокусе >> Использование GROUP_CONCAT в GROUP BY
И в ситуации с group_concat:
<?php
$res=$mysqli->query(”SELECT id,GROUP_CONCAT(client_id) as clients FROM
services WHERE id = 3 GROUP BY id”);
$row = $res->fetch_array(MYSQLI_ASSOC))
$result = explode(',', $row['clients']; // $row['clients'] contains
string 5,6,7
$res->free();
?>
Второе решение будет более быстрым, так как мы убираем лишние проходы по циклу средствами
PHP и передаем эту задачу на более быстрый уровень MySQL.
Иногда бывает полезно использовать результат конкатенации в выражении IN:
<?php
$res=$mysqli->query(”SELECT id,GROUP_CONCAT(client_id) as clients FROM
services WHERE id = 3 GROUP BY id”);
$row = $res->fetch_array(MYSQLI_ASSOC))
$result = $row['clients']; // $row['clients'] contains string 5,6,7
$res->free();
$resclients=$mysqli->query(”SELECT id,client_name FROM clients WHERE
id = IN ($result)”);
// handle $resclients
?>
Конечно, последний пример может быть реализован и с помощью JOIN, но иногда нам нужны
временные ID в коде, к примеру в случаях выполнения запроса на другом сервере.
И последнее: иногда вы можете добавлять ORDER BY NULL после GROUP BY, чтобы избежать
ненужной сортировки с filesort.

Я ее использую когда есть дерево, хранящееся в базе в формате id, parent_id и его надо вытащить целиком начиная с рута (т.е. с parent_id=0 или null). Как правило это построение древовидного меню. Выглядит это примерно вот так:
select parent_id, group_concat(id) as childs from tree Group By parent_id;
В результате получаем табличку вида:
parent_id | childs
0 | 1,2
1 | 3, 5
2 | 4, 8
и т.д.
Т.е. для каждого узла получаем id его прямых потомков через разделитель. По сути структуру, которая полностью описывает дерево. 
Применимо далеко не всегда, например пока не придумал, как получать по отдельности ветки дерева (подозреваю что подобным способом никак) но когда надо выдернуть целиком дерево очень удобно - один запрос вместо рекурсии.

ООП и ПХП а также про дураков на костылях

Bloged in Без рубрики от admin Воскресенье Май 25, 2008 at about 3:23 дп

1. Всякий, кто блюдет несдвигаемые “принципы” несмотря ни на что - американка, которая “does not kiss on the first date” (хотя вполне себе потаскуха, а не девочка-одуванчик), “специалист”, который _знает_, что если программист поработал в банке, то “на веб” его нанимать уж точно нельзя, или модератор, который “банит мат несмотря на и без предупреждения”, посрав на осмысленность комментариев и отклики читавших - есть, ведомо, дурак.

Дурак не простой, но такой, что ходит с “принципом” нераздельно, как калека с костылем. Его костыль - это “mein Kampf”, идейная борьба и егойная инициатива, за которую хоть все покрушить совсем не жалко.

Прошу прощения Мне показалось было, что “модератор” оставил мне комментарий как бы с сожалением, но не стал банить. Поэтому я убрал пункт первый. Сейчас я заметил заголовок того комментария - “ban_set …” - пидорок не просто дурак, не просто дурак с инициативой, он-таки болен гнойным модеритом - “я сказал, и моё слово последнее”.
Прошу прощения за ошибку, не разглядел. Восстанавливаю пункт первый

2. Поэтому, далее, восстанавливаем справедливость и нашу осмысленную но стертую запись:

    [8540484]Это неправда. Правда же проста:
    [info]anonym_mouse
    2008-05-24 03:00 pm UTC (link)
    .
    Правда всегда проще лжи. Правда в том, что:

    1. ПХП никаким боком не ООП-язык. Это процедурный язык, имитирующий Пёрл и
    собирающий в одну упаковку нужные для Веб-программирования пёрл-библиотеки.
    (Сам пёрл - язык, имитирующий awk, shell, sed и т.д. - на высоком уровне и
    сильно неряшливо. Стал популярен за то, что всё в одном месте и уровень
    высокий)

    2. Запихивать всё в ООП, во что бы н и стало, хотя по смыслу задачи ООП - “не
    пришей к пизде рукав” - как вижу стандарт в России (похоже никакому
    программированию кроме ООП, которое продают как “современное” больше не
    учат).
    * ООП - не “лучший” вид программирования, не всеобщий, не самый последний писк
    и т.д.

    3. Фундаментальная проблема с ООП в том, что оно ПРОТИВОРЕЧИТ ЕСТЕСТВЕННОМУ
    МЫШЛЕНИЮ, тогда как - поскольку программирование практически чистое мышление
    и кручение абстракциями - оно должно бы НЕ противоречить, а наоборот
    ИСПОЛЬЗОВАТЬ естественный обороты.
    Поскольку мышление выражается в языке, то проще всего это объяснять на
    лингвистических примерах.
    http://anonym-mouse.livejournal.com/1294.html

    4. Пишите на ПХП процедурно.
    Добавьте к этом хорошую методологию вроде literate programming сверху, для
    организации кусков.
    http://anonym-mouse.livejournal.com/2323.html

    (Reply to this)(Thread)

Имеет ли смысл ООП в web и wap

Bloged in Без рубрики от admin Суббота Май 24, 2008 at about 8:15 дп

Знакомлюсь с ооп. Впринципе понимаю плюсы которые меня ждут если перейду. Самое главное что понял, Обьект это переменная, а не сборник функций и переменных. Но вопрос не в этом.
Допустим, для формирования страницы, я использую 20 классов.
Допустим каждый класс содержит 15 функций.
Допустим для вывода страницы из каждого класса нужно по одной функции.

В итоге получаем что грузяться все классы. 300 функций, а используеться из них только 20 функций. Помоему нерационально. Или есть какие нибудь еще варианты?

2.
Допустим есть у меня класс danye. В нем данные по конекту и отправке запросов, разбору запросов к базе данных.
Этот класс расширяеться для каждой таблицы своим классом. Правильно?

Если вдруг понадобиться использовать вместо mysql oracle или файлы, то придеться переписать каждый каждый класс для каждого запроса, и основной класс. Имеет ли это смысл?

Прием платежей картами Visa, MasterCard

Bloged in Без рубрики от admin Четверг Май 22, 2008 at about 3:34 пп

Коллеги, где-то в сообществе проскальзывала ссылка на российский гетвей, предоставляющий возможность внедрения на сайт механизма оплаты кредитками. Никто не помнит?

Upd: Всем спасибо за ссылки… assist.ru, creditcard.ru и искал…