Общения с программистами в реале нет вообще ( одни админы вокруг ) .
А хочется, чтобы кто-нибуть посмотрел код.. посоветовал чего-нибуть..
Cтиль.. подход.. чего не так..
Было у меня одно задание, есть и мое решение..
Кому не лень.. вот здесь лежит http://files.mail.ru/RZXHI8 ( задание, код )
спасибо
Спустя 3 минуты, 49 секунд (27.10.2011 - 17:53) Семён написал(а):
Да уж, действительно
Цитата |
Кому не лень.. |
Спустя 4 минуты, 15 секунд (27.10.2011 - 17:58) Игорь_Vasinsky написал(а):
прикрепи сюда файлы (в расширенном ответе)
Спустя 7 минут, 14 секунд (27.10.2011 - 18:05) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 27.10.2011 - 14:58) |
прикрепи сюда файлы (в расширенном ответе) |
Вы не можете загружать такой тип файлов
Какой тип могу ?
Спустя 10 минут, 28 секунд (27.10.2011 - 18:15) Игорь_Vasinsky написал(а):
архив
Спустя 2 минуты, 34 секунды (27.10.2011 - 18:18) johniek_comp написал(а):
вирус там
Спустя 2 минуты, 12 секунд (27.10.2011 - 18:20) YVSIK написал(а):
vitaly777 нуС!! дык код то будет или пора закрыть тему??
Спустя 1 минута, 41 секунда (27.10.2011 - 18:22) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 27.10.2011 - 15:15) |
архив |
в rar 'e не прошло..
переделал в zip.
Спустя 8 минут, 48 секунд (27.10.2011 - 18:30) YVSIK написал(а):
vitaly777 хорошо сколько это будет?? если вам к примеру это сделают
все поправяти ну и тд.
а так навскидку вот цитата !!
все поправяти ну и тд.
а так навскидку вот цитата !!
Цитата (Семён @ 27.10.2011 - 17:53) | ||
Да уж, действительно
|
попробуй переведи!!
Спустя 3 минуты, 33 секунды (27.10.2011 - 18:34) johniek_comp написал(а):
YVSIK
так это его код, он сюда на проверку пришел смотри первый пост ТС-а.
так это его код, он сюда на проверку пришел смотри первый пост ТС-а.
Спустя 6 минут, 5 секунд (27.10.2011 - 18:40) vitaly777 написал(а):
Цитата (YVSIK @ 27.10.2011 - 15:30) |
vitaly777 хорошо сколько это будет?? если вам к примеру это сделают все поправяти ну и тд. а так навскидку вот цитата !! |
Может я не правильно написал.. но делать ничего не надо..
Всё уже сделано и отправлено куда надо.
За советы тут деньги надо платить ?
Тогда извените.. я ошибся форумом.
Спустя 14 минут, 27 секунд (27.10.2011 - 18:55) Игорь_Vasinsky написал(а):
echo '<a href=\'admin/ \'>admin</a>';
а почему не так?
echo '<a href="admin/">admin</a>';
А так в принципе молодец, придерживаешься стиля, всё по полочкам, распределил по файлам.
В суть не вникал., но там в принципе и кода не много.
в
Свернутый текст
class mysql_connect
{
private $host;
private $login;
private $password;
private $base_name;
private $port;
protected $link_mysql;
function __construct ( $host, $log, $pass, $base, $prt )
{
$this -> host = $host;
$this -> login = $log;
$this -> password = $pass;
$this -> base_name = $base;
$this -> port = $prt;
$this -> link_mysql = mysqli_connect ( $this->host, $this->login, $this->password, $this->base_name, $this->port );
if ( !$this -> link_mysql )
{
die ( 'Can\'t connect to MYSQL <br />' . mysqli_connect_error () );
}
$mysql_request = 'SET NAMES utf8';
if ( !$result = mysqli_query ( $this->link_mysql, $mysql_request ) )
{
die ( 'cant change uncode<br />' . mysqli_error ( $this->link_mysql ) );
}
}
имя класса mysql_connect - а юзаешь во всю mysqli, кстати - привязка к кодировке UTF-8
далее
Цитата |
$arr_result = mysqli_fetch_array( $result, MYSQLI_ASSOC ); |
почему сразу не mysqli_fetch_assoc ? Если в планах использовать индексный массив - то MYSQLI_ASSOC - можно было бы рассматривать в качестве аргумента метода
Обратил внимание на
mysqli_free_result( $result );
- молодец, многие, как и я в прочем, принебрегают этим моментом.
Вот это безобразие
Свернутый текст
public function get_stat_by_id_loan()
{
$mysql_request = 'CALL get_data_by_id_loan(\'' . $_GET['id_loan'] . '\')';
if ( !$result = mysqli_query ( $this->link_mysql, $mysql_request ) )
{
die ( 'can\'t CALL get_data_by_id_loan() <br />' . mysqli_error ($this->link_mysql) );
}
$arr_result = mysqli_fetch_array( $result, MYSQLI_ASSOC );
echo '<table>
<th colspan="4"> Данные по клиенту</th>
<tr>
<td>Имя</td>
<td>' . $arr_result['first_name'] . '</td>
<td>Зарегистрирован</td>
<td>' . $arr_result['reg_time'] . '</td>
</tr>
<tr>
<td>Фамилия</td>
<td>' . $arr_result['second_name'] . '</td>
<td>Кредитов всего</td>
<td>' . $arr_result['@var_counted_loans'] . '</td>
</tr>
</table>
<table>
<th colspan="4"> Данные по кредиту</th>
<tr>
<td>Дата заявки</td>
<td>' . $arr_result['request_time'] . '</td>
<td>Период, дней</td>
<td>' . $arr_result['period'] . '</td>
</tr>
<tr>
<td>Дата выдачи</td>
<td>' . $arr_result['takemoney_time'] . '</td>
<td>Срок погашения</td>
<td>' . $arr_result['payback_time'] . '</td>
</tr>
<tr>
<td>Сумма кредита</td>
<td>' . $arr_result['amount_money'] . '</td>
<td>Осталось дней</td>
<td>' . $arr_result['@var_count_left_days'] . '</td>
</tr>
<tr>
<td>Размер интресса</td>
<td>' . $arr_result['intress'] . '</td>
<td>Статус кредита</td>
<td>' . $arr_result['status'] . '</td>
</tr>
</table>';
//prepare for next request to mysql.
mysqli_free_result( $result );
mysqli_next_result( $this -> link_mysql );
}
Вёрстке абсолютно делать нечего в методе класса, - это вёрстка
Потом
Свернутый текст
if ( preg_match('/^[a-zA-Z0-9_]*$/', $_POST['first_name']) == 0 || strlen( $_POST['first_name'] ) > 20 )
{
die ('Wrong letters for the first name or too big ! ( > 20 )<br />');
}
Я сам не люблю так юзеров обламывать, если например выше иидёт разметка -то на этом моменте - ты её порвал.
Вот.. как-то так.
Спустя 11 минут, 10 секунд (27.10.2011 - 19:06) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 27.10.2011 - 15:55) |
Вот.. как-то так. |
Огромное спасибо за потраченное время
все советы приму к сведению..
Спустя 2 минуты, 51 секунда (27.10.2011 - 19:09) Игорь_Vasinsky написал(а):
я JS и CSS не смотрел вообще
Спустя 5 минут, 21 секунда (27.10.2011 - 19:14) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 27.10.2011 - 15:55) |
echo '<a href=\'admin/ \'>admin</a>'; а почему не так? echo '<a href="admin/">admin</a>'; |
где-то вычитал что с двойными кавычками все происходит медленнее, чем
с одинарными..
Спустя 16 минут, 40 секунд (27.10.2011 - 19:31) Игорь_Vasinsky написал(а):
на микроны?
Спустя 2 минуты, 26 секунд (27.10.2011 - 19:33) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 27.10.2011 - 16:31) |
на микроны? biggrin.gif |
иногда я чувствую, что меня несет.. ))
Спустя 3 часа, 19 минут, 15 секунд (27.10.2011 - 22:52) imbalance_hero написал(а):
vitaly777
Медленнее, но это настолько мизерно, что 1 твой запрос лишний к БД изменит абсолютно всю ситуацию, и кавычки там решать уже не будут.
В целом, я не смотрел код, мне лень качать, боюсь вирусов. Если есть желание, чтобы я глянул, есть на форуме теги [ php], справа вверху под выравниванием, используй их и выложи код тут
Медленнее, но это настолько мизерно, что 1 твой запрос лишний к БД изменит абсолютно всю ситуацию, и кавычки там решать уже не будут.
В целом, я не смотрел код, мне лень качать, боюсь вирусов. Если есть желание, чтобы я глянул, есть на форуме теги [ php], справа вверху под выравниванием, используй их и выложи код тут
Спустя 7 часов, 46 минут, 26 секунд (28.10.2011 - 06:39) twin написал(а):
В данном случае кавычки находятся внутри апрострофов, поэтому будут интерпретированы как обычные строковые символы. И это никоем образом не скажется на скорости. Не делал тестов естественно, не нужно этого, но подозреваю, что эканирование то как раз и отожрет времени больше.
Что касается самого скрипта.
Совершенно неверная компановка. Вопервых, забудь такое расширение .inc Им пользовался дедушка гитлер наверное еще. Исполняемые файлы должны иметь расширение .php
Это намного безопаснее раз, редакторы подсвечивают - два.
И зачем ты все классы спихал в один файл? Классы на то и классы, чтобы разграничить область видимости. Ну а коли разграничил, используй то, что необходимо в данный момент. На кавычках экономишь, а пихать всю библиотеку в оперативку считашь правильным.
Теперь сами классы. Вот изучил ты наследование, схватил верхушку и пихаешь где не поподя. Ну с какого перепуга класс statistic стал наследником класса mysql_connect? Да и остальные тоже.
Ты знаешь перевод слова extends? Расширение. Наследник должен расширять возможности базового класса. А никак не юзать организованный в нем коннект. Я еще могу понять edit_database, хоть какой то намек.
Это называется большая связанность у тебя, ты не в силах теперь использовать класс statistic отдельно, в другом приложении, в отрыве от класса mysql_connect. И на кой тогда это организованно классом?
Вообще от этой работы на версту разит таким
Что касается самого скрипта.
Совершенно неверная компановка. Вопервых, забудь такое расширение .inc Им пользовался дедушка гитлер наверное еще. Исполняемые файлы должны иметь расширение .php
Это намного безопаснее раз, редакторы подсвечивают - два.
И зачем ты все классы спихал в один файл? Классы на то и классы, чтобы разграничить область видимости. Ну а коли разграничил, используй то, что необходимо в данный момент. На кавычках экономишь, а пихать всю библиотеку в оперативку считашь правильным.
Теперь сами классы. Вот изучил ты наследование, схватил верхушку и пихаешь где не поподя. Ну с какого перепуга класс statistic стал наследником класса mysql_connect? Да и остальные тоже.
Ты знаешь перевод слова extends? Расширение. Наследник должен расширять возможности базового класса. А никак не юзать организованный в нем коннект. Я еще могу понять edit_database, хоть какой то намек.
Это называется большая связанность у тебя, ты не в силах теперь использовать класс statistic отдельно, в другом приложении, в отрыве от класса mysql_connect. И на кой тогда это организованно классом?
Вообще от этой работы на версту разит таким
Цитата |
Посмотрите какой я крутой, знаю ООП! |
Реймонд как то сказал:
Цитата |
Это может оказаться полезным в случае, если предметная область является действительно сложной и требует множества абстракций, и вместе с тем такой подход может обернуться неприятностями, если программисты реализуют простые вещи сложными способами, просто потому, что им известны эти способы и они умеют ими пользоваться. |
В данном случае ООП лучше было бы не юзать совсем. Потому что этот инструмент у тебя выполняет совершенно несвойственные ему функции. Напихал в классы разметки... Зачем? Почему не сделать это цивилизованно, шаблонами?
Переменные не инициализируешь, зато в классах не брезгуешь обращаться к суперглобальному массиву напрямую.
Метод add_user() вообще отдельная тема. С какого перепуга ты диктуешь мне, какой должен быть пароль? Почему это я не могу использовать в нем ничего кроме цифр и латиницы? Да еще и не длиннее 6 символов? На кого ты работаешь? :)
Это что вообще такое:
function __construct ( $host, $log, $pass, $base, $prt )??? В наследнике то?
{
parent::__construct( $host, $log, $pass, $base, $prt );
}
Вобщем наворотил, что называется, индусского кода, а элементарные вещи побоку. Я не нашел ни одной функции htmlspecialchars(), а ведь это основы безопасности. И попробуй возразить, что это админка и юзеры не могут попасть в базу. Могут, еще как. Хакнут (тьфу, тьфу), напихают в неё XSS и подставишь ты своих пользователей. Очень неаккуратно, особенно учитывая тот факт, что приложение разрабатывается для финансовых операций.
Вобщем вирдикт таков. Брось пытаться выглядеть круче, чем ты есть. ООП это не круто вовсе, стократ лучше написать красивый и надежный процедурный код, чем вот такую кашу. Тем более что тут этот подход вообще не оправдан.
Если эта работа предназначена для того, чтобы произвести впечатление на несведущего заказчика - пять с плюсом. Если для работы или как ответ на задание, два с минусом.
Однако задел у тебя очень неплохой, респект. Просто не гони коней. Прежде чем писать на ООП, нужно научиться идеально кодить на процедурке.
Спустя 3 часа, 36 секунд (28.10.2011 - 09:39) vitaly777 написал(а):
Цитата (twin @ 28.10.2011 - 03:39) |
Вобщем вирдикт таков. Брось пытаться выглядеть круче, чем ты есть. ООП это не круто вовсе, стократ лучше написать красивый и надежный процедурный код, чем вот такую кашу. Тем более что тут этот подход вообще не оправдан. |
Спасибо за потраченное время !
ПС. Написал все в ооп, так как это было сказано в задании..
И кроме как наследовать подключение к MySQL, ничего не придумал.
( чтобы хоть какой-то смысл ООП был )
И вопрос главный.
htmlspecialchars() не использовал, так как все запросы в MySQL идут через
процедуры..
Возможно ли вставить туда что-то свое ?
Ведь при вызове процедуры, там ясно прописано какая переменная на входе
и какой у нее должен быть размер!
В худшем случае процедура просто не выполнится.. как мне кажется.
Спустя 55 секунд (28.10.2011 - 09:40) vitaly777 написал(а):
Цитата (imbalance_hero @ 27.10.2011 - 19:52) |
используй их и выложи код тут |
Да там не один файл.. слишком много место займет на форуме
вирусов нет
Спустя 21 минута, 41 секунда (28.10.2011 - 10:02) vitaly777 написал(а):
Цитата (twin @ 28.10.2011 - 06:39) |
function __construct ( $host, $log, $pass, $base, $prt ) { parent::__construct( $host, $log, $pass, $base, $prt ); } |
Так я вызвал метод __construct родительского класса..
и передал ему все нужные переменные..
ээ.. понимаю, что так делать не надо ?
Спустя 16 минут, 41 секунда (28.10.2011 - 10:19) twin написал(а):
vitaly777
Цитата |
И кроме как наследовать подключение к MySQL, ничего не придумал. |
А просто вызвать класс не пробовал? В конструкторе, а лучше вообще отдельно.
База базой, зачем наследовать этот класс, ты становишься его зложником.
Цитата |
htmlspecialchars() не использовал, так как все запросы в MySQL идут через процедуры.. |
А причем тут вообще запросы? Обрабатывать данные нужно перед отдачей их в поток, когда они уже получены.
echo '<table>
<th colspan="4"> Данные по клиенту</th>
<tr>
<td>Имя</td>
<td>' . htmlspecialchars($arr_result['first_name']) . '</td>
Цитата |
Так я вызвал метод __construct родительского класса.. и передал ему все нужные переменные.. ээ.. понимаю, что так делать не надо ? |
А ты просто удали конструктор в наследнике и запусти. Сильно удивишься. Наследник и так пользуется конструктором базового класса.
Спустя 31 минута, 26 секунд (28.10.2011 - 10:50) vitaly777 написал(а):
Цитата (twin @ 28.10.2011 - 10:19) |
<td>' . htmlspecialchars($arr_result['first_name']) . '</td> |
а.. XSS..
Это на случай, если кто-то запишет в базу данных XSS код.. ?
ну да.. через добавление клиентов теоретически сделать можно
( хотя у меня там проверка на кол-во и спец. символы стоит )
НО согласен. thx!
Когда я сказал про запросы ( через процедуры ) в MySQL
имел в виду SQL injection..
Так вот, действительно такой подход защищает на 100 % от SQL injection ?
Спустя 3 минуты, 35 секунд (28.10.2011 - 10:54) twin написал(а):
vitaly777
Цитата |
Так вот, действительно такой подход защищает на 100 % от SQL injection ? |
Даже если отключить сервер от сети и закопать на 3-х метровую глубину, все равно 100% не получится. Но таки да, если запрещено все, что не разрешено, особо опасаться нечего.