Николай М.
1895 сообщений
#16 лет назад
Хотя я всегда любил Делфи, всьотаки пришлось также и пощупать на своей шкуре и ПХП причём более близко. Возникла задача: автоматизировать контроль и на предмет вместимого БД MySQL. И вот что у меня получилось (повторяю это первый раз я пишу чтото на ПХП, но интерисует жосткая критика, а то чуствую написано тупо):

<?php
$tt=microtime();
echo '<head>';
echo '<meta http-equiv="Content-Type" content="text/html;&nbsp;charset=cp-1251" />';
echo '<title>Untitled Document</title>';
echo '</head> <body>';


$dblocation = "127.0.0.1";
$dbname = "information_schema";
$dbuser = "root";
$dbpasswd = "j66";
$tables='test';

$dbcnx = @mysql_connect($dblocation, $dbuser, $dbpasswd);
if (!$dbcnx)
{
echo "<p>К сожалению, не доступен сервер mySQL</p>n";
exit();
}
if (!@mysql_select_db($dbname,$dbcnx) )
{
echo "<p>К сожалению, не доступна база данных</p>n";
exit();
}

mysql_query("SET NAMES 'cp1251'");

$query="select DISTINCT(TABLE_NAME) as `tt`, Table_Comment as 'tc' from Tables where Tables.TABLE_SCHEMA='$tables' order by Tables.TABLE_SCHEMA";
/* Выполнить запрос. Если произойдет ошибка - вывести ее. */
$res = mysql_query($query) or die(mysql_error());

/* Как много нашлось таких */
$number = mysql_num_rows($res);

echo "<h1><Center>Сводная информация по БД</h1></Center><br>n";

/* Напечатать всех в красивом виде*/
if ($number == 0) {
echo "<CENTER><P>Таблиц нет!</CENTER>n";
}
else
{
echo "Найдено: <b>$number</b> таблиц.<br>n";
echo "<table width='100%' border='1' cellpadding='1' cellspacing='-1'>n";
echo '<tr bgcolor="#CCFFCC">';
echo "<td>Ordinal_Position</td>";
echo "<td>Collumn_Name</td>";
echo "<td>Collumn_Type</td>";
echo "<td>Is_Nullable</td>";
echo "<td>Collumn_Default</td>";
echo "<td>Collumn_Key</td>";
echo "<td>Extra</td>";
echo "<td>Collumn_Comment</td>";
echo "</tr>n";
/* Получать по одной строке из таблицы в массив $row, пока строки не кончатся */
while ($row=mysql_fetch_array($res))
{
echo '<tr bgcolor="#FFFF99"><td colspan="8"><b>';
echo $row; echo "</b>";
if ($row<>null)
{
echo " - <em>"; echo $row; echo "</em>";
}
echo "</td></tr>n";


/* Получаем описаловки мля :)*/
$tbl_name=quoted_printable_decode($row);
$deep_query="select COLUMNS.ORDINAL_POSITION as 'op', COLUMNS.COLUMN_NAME as 'cn', COLUMNS.COLUMN_DEFAULT as 'cd', COLUMNS.IS_NULLABLE as 'cin', COLUMNS.COLUMN_TYPE as 'ct', COLUMNS.COLUMN_KEY as 'ck', COLUMNS.EXTRA as 'ce', COLUMNS.COLUMN_COMMENT as 'cc' from COLUMNS where COLUMNS.TABLE_SCHEMA='$tables' and COLUMNS.TABLE_NAME='$tbl_name' order by COLUMNS.TABLE_NAME, COLUMNS.ORDINAL_POSITION";

$deep_res=mysql_query($deep_query) or die(mysql_error());
$deep_number=mysql_num_rows($deep_res);
while ($deep_row=mysql_fetch_array($deep_res))
{
echo "<tr>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
echo "<td>"; echo $deep_row; echo"</td>";
}
echo "</tr>n";
}
echo "</table>n";
echo "</CENTER>";
}

$rout_query="select distinct(routines.ROUTINE_TYPE) as 'rt' from routines";
$rout_res = mysql_query($rout_query) or die(mysql_error());
$number=mysql_num_rows($rout_res);
if ($number == 0)
{
echo "<CENTER><P>Хранимок и функций и т.д. нет!</CENTER>n";
}
else
{
while ($rout_row=mysql_fetch_array($rout_res))
{
$rout_type=$rout_row;
$deep_rout_query="select routines.ROUTINE_TYPE as 'rtt', routines.SPECIFIC_NAME as 'sn', routines.DTD_IDENTIFIER as 'di', routines.DEFINER as 'd', routines.CREATED as 'c', routines.LAST_ALTERED as 'la', routines.ROUTINE_DEFINITION as 'rd', routines.Routine_comment as 'rc' from routines where routines.ROUTINE_TYPE='$rout_type' and routines.Routine_schema='$tables'";
$deep_rout_res=mysql_query($deep_rout_query);
$deep_rout_numbers=mysql_num_rows($deep_rout_res);
switch ($rout_type)
{
case 'PROCEDURE': echo "<p>Найдено: <b>$deep_rout_numbers</b> процедур.<br>n"; break;
case 'FUNCTION': echo "<p>Найдено: <b>$deep_rout_numbers</b> функцый.<br>n"; break;
default : echo "<p>Найдено: <b>$deep_rout_numbers</b> $rout_type.<br>n"; break;
}
echo "<table width='100%' border='1' cellpadding='1' cellspacing='-1'>";
echo '<tr bgcolor="#CCFFCC">';
echo "<td>Specific_Name</td>";
echo "<td>DTD_Identifier</td>";
echo "<td>Definer</td>";
echo "<td>Created</td>";
echo "<td>Last_Altered</td>";
echo "<td>Routine_Definition</td>";
echo "<td>Routine_Comment</td>";
echo "</tr>";
while ($deep_rout_row=mysql_fetch_array($deep_rout_res))
{
echo "<tr>";
echo "<td><b>"; echo $deep_rout_row; echo"</b></td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "<td>"; echo $deep_rout_row; echo"</td>";
echo "</tr>";
}

echo "</table>n";

}
}

mysql_close($dbcnx);

$tt=microtime()-$tt;
echo "<p>Время генерации страници: <b>$tt </b>n";
echo "</body>n </html>";
?>


Вы также можете его сразу и проверить, только нужно подправить парочку параметров в верху. Также к уважаемым метрам ПХП вопросы:
1. Как автоматизировать писание "n"; ?
2. У меня валыдиный код? Как это вообше проверять?
3. Почему моё "время генерации" иногда становиться <0 ?
4. у меня поле типа Text, если я его вивожу, то оно виходит всьо в одну строку, как заставить его выводить так как в БД ?

Сори на нубскые вопросы. :unsure:
Николай М.
1895 сообщений
#16 лет назад
При вставке текста, почемуто потерялось форматирование, никак не могу нормально вставить (
Вадим Т.
3240 сообщений
#16 лет назад
MMM_Corp, понимаете, принципы написания качественного кода не очень зависят от того или иного языка программирования.

На Delphi Вы бы эту же задачу тоже так же бы делали бы? В одном классе и одном методе, вот так, писали бы линейно кучу кода? Вероятнее:
- как то логически бы разбили бы этот функционал на классы и методы
- сингатуры этих классов и методов наверное покрыли бы комментами, и т.д.
- при этом отделили бы логику от представления
- параметры соединения (имя БД, логин ипароль) наверное вынесли бы в отдельный конфиг
- возможно, использовали бы какие-либо логичные для данной ситуации паттерны, например MVC
- возможно, использовали бы сторонние библиотеки (для Delphi - компоненты).

Так вот, в PHP - все те же самые принципы.

На вопросы отвечаю:

1. "\n" - автоматизировать не нужно, нет никакого смысла.
2. на валидность код проверяете так же, как и в Delphi, если бы не было бы IDE и писали бы Delphi код в блокнотике. то есть пишите, запускаете, проверяете нет ли ошибок. хотя некоторые IDE все же ряд ошибок PHP кода могут определять сразу.
3. "время генерации" < 0, потому что microtime() возвращает массив значений, а не вещественное число, определяющее текущее время, а вот microtime(true) возвращает текущее время в виде вещественного числа, но только для PHP 5 (в PHP 4 - только массив).
4. последний вопрос не понял что и где... разбираться в этом запутанном коде пришлось бы, а время терять неохота, пусть кто-то другой поймет в чем тут дело, если захочет

А то что касается PHP, читаем очень внимательно это:



Николай М.
1895 сообщений
#16 лет назад
Не знаю как бы я это решал на делфи... болото совсем другое, но уверен меньше руки убивал на код)

Что косаеться форматирования, то я уже писал что при вставке сюда... форматирование почему то тереться.
Как редактор использую Zend Studio, может есть чтото более продвинутое чем этот примитив ?

Классы и методы... хм... я слышал что на ПХП можно писать класами, но вот примеров не нашол, ну не все сразу Тем более что код писалса в практических целях а не для развлечения.

1. А... ну... тогда всьо в просмотре кода страницы будет в одну строку, видел так мелкомягкие делают, разве это нормально?
2. Хм... прикол в том что в Делфи код на ходу проверяется, потом компилируеться, и только потом выполняется, но я уже начинаю верить что ПХП-исти пишут в блокноте, потому что один фиг в чом писать, нет иснтрументов как в делфи, нет единого IDE.
3. Ок, буду знать, юзаю 5.2.5, всьо пашет
4. Обьясняю:
В БД, есть поле, оно имеет тип Text, в нем нафигачено куча текста, я его питаюсь вивести через echo..., но к сожалению результат на странице - одна громадная строка, хотя в БД там строк много, тобиш оно почемуто слепило всьо в одну кашу, как мне избавиться от этого странного дефекта.

Кстати результат моего творения можно смотреть здесь
я туда страничку сохранил

еще вопрос...
 $rout_proc=ARRAY('PROCEDURE', 'FUNCTION');
while ($rout_proc_entry=array_count_values($rout_proc))
{

}


почему возникает вайп?
Максим Дурманов
2 сообщения
#16 лет назад
1. Главное как это на экране будет выглядеть, а не при просмотре исходного кода
2. Делфийский код тоже можно в блокноте писать Для ПХП посоветовал бы PHP Designer или PHP Expert Editor (последний бесплатный для ex-USSR)
4. Используйте символ <br> для переноса строки

etc.
В приведенном документе-результате пустые ячейки выводятся без границ. Если они пустые, вставляйте хотя бы туда &nbsp;
Александр Подопригора
27 сообщений
#16 лет назад
Не код а сплошная каша, много еще ночей нужно

Цитата:
Классы и методы... хм... я слышал что на ПХП можно писать класами, но вот примеров не нашол, ну не все сразу


- пример использования ООП в PHP, хорошая книга.

Цитата:
3. "время генерации" < 0, потому что microtime() возвращает массив значений, а не вещественное число, определяющее текущее время, а вот microtime(true) возвращает текущее время в виде вещественного числа, но только для PHP 5 (в PHP 4 - только массив).


/*
$startTime = microtime();

.....

$endTime = microtime();
$s = explode(' ',$startTime);
$start = $s + $s;
$e = explode(' ',$endTime);
$end = $e + $e;

print("Время выполнения: <b>".($end-$start)."</b> c");*/
Алексей П.
3 сообщения
#16 лет назад
По поводу microtime():
В php4:

$startTime = microtime();
...
$endTime = microtime();
$start = array_sum(explode(' ', $startTime));
$end = array_sum(explode(' ', $endTime));
print('Время выполнения: <b>' . ($end-$start) . '</b> c');

в php5 у функции microtime() появился необязательный параметр get_as_float:

$start = microtime(true);
...
$end = microtime(true);
print('Время выполнения: <b>' . ($end-$start) . '</b> c');

ну и в виде класса:

class ExecTime
{
private $start;
public function __construct()
{
$this->start = microtime(true);
}

public function ElapsedTime()
{
return microtime(true) - $this->start;
}

public function Reset()
{
$this->start = microtime(true);
}
}

$timer = new ExecTime();
...
print('Время выполнения: <b>' . $timer->ElapsedTime() . '</b> c')
Николай С.
710 сообщений
#16 лет назад
В начале вы использовали такой код:

$dbcnx = @mysql_connect($dblocation, $dbuser, $dbpasswd);
if (!$dbcnx)
{
echo "<p>К сожалению, не доступен сервер mySQL</p>n";
exit();
}
if (!@mysql_select_db($dbname,$dbcnx) )
{
echo "<p>К сожалению, не доступна база данных</p>n";
exit();
}

затем такой:

$deep_res=mysql_query($deep_query) or die(mysql_error());


Уж лучше писать в одном стиле.

Цитата:

4. у меня поле типа Text, если я его вивожу, то оно виходит всьо в одну строку, как заставить его выводить так как в БД ?


Откройте сгенерированный код блокнотом (в IE View->Source) - увидете, что все сгенерировалось верно. При отображении в браузере надо не забывать проразметку html.

Ну и подобное

echo "Найдено: <b>$number</b> таблиц.<br>n";
echo "<table width='100%' border='1' cellpadding='1' cellspacing='-1'>n";
echo '<tr bgcolor="#CCFFCC">';
echo "<td>Ordinal_Position</td>";
echo "<td>Collumn_Name</td>";
echo "<td>Collumn_Type</td>";
echo "<td>Is_Nullable</td>";
echo "<td>Collumn_Default</td>";
echo "<td>Collumn_Key</td>";
echo "<td>Extra</td>";
echo "<td>Collumn_Comment</td>";
echo "</tr>n";


прекрасно выглядит и без echo

?>
Найдено: <b>$number</b> таблиц.<br>
<table width='100%' border='1' cellpadding='1' cellspacing='-1'>
<tr bgcolor="#CCFFCC">
<td>Ordinal_Position</td>
<td>Collumn_Name</td>
<td>Collumn_Type</td>
<td>Is_Nullable</td>
<td>Collumn_Default</td>
<td>Collumn_Key</td>
<td>Extra</td>
<td>Collumn_Comment</td>
</tr>
<?php
Николай М.
1895 сообщений
#16 лет назад
SolNikolay, Цитата:
прекрасно выглядит и без echo
отдельное Вам спасибо!
Что косаеться класов, то они очень похожи на явовскые, г... сенкс, теперь я буду знать что к чему, на яве когдато давно писал
Всем спасибо за коментарии и за критику.