Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Элегантный стиль написания php-скриптов


Автор: s_a_s_h_a 4.3.2005, 09:38
Здравствуйте. Предлагаю в этой теме поговорить об элегантном, красивом, оптимизированом, понятном стиле написания php-скриптов. Я совсем недавно решил разобраться с php и некоторые вещи из мануалов мне не очень понравились, но т.к. читал я не все, что уже успело написать человечество и не видел самих скриптов на php, то надеюсь, что можно писать код по-другому. И вот первый вопрос.

Работа с MySQL

Если надо получить одну строчку при селект-запросе, то хотелось бы что-нибудь по типу перла:

Код

my ($p1,$p2)=$dbh->selectrow_array("select P1,P2 from TABLE where ID=$id");


вместо

Код

$result=mtsql_query("select P1,P2 from TABLE where ID=$id");
while($row=mysql_fetch_array($result,MYSQL_ASSOC))
{
$p1=$row["P1"];
$p2=$row["P2"];
}


и ещё
из перла:
Код

$sth=$dbh->prepare("select P1,P2 from TABLE");
$sth->execute;
while(my ($p1,$p2)=$sth->fetchrow_array)
{
}

+ то, что переменные $p1,$p2 используются только в теле цикла.

И как быть если в одном скрипте надо работать с несколькими базами данных. В перле, например, создается "указатели" на БД и можно с ними работать. А в мануале по php видел только, что устанавливается соединение и потом все функции работают с этой БД, пока соединение не будет закрыто.

Автор: Farik 4.3.2005, 10:29
Если поле одно, то
Код
echo mysql_result(mysql_query("SELECT name FROM work.employee"),2);


но сама по себе функция медленная, поэтому при двух и более полях использовать не стоит

Для твоей задачи следует наверное всё таки написать свой класс c реализацией метода подобного "короткого" доступа, тк ни в mysql ни в mysqli такие вещи не предусмотрены, если уж так хочется сократить саму запись, то можно попробовать так
Код

while (list($id, $name, $salary) = mysql_fetch_row(mysql_query("SELECT id, name, salary FROM employees", $conn))) {
echo "bla bla";
}

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

Цитата

В перле, например, создается "указатели" на БД и можно с ними работать. А в мануале по php видел только, что устанавливается соединение и потом все функции работают с этой БД, пока соединение не будет закрыто.

Не очень понял...
Соединение устанавливается, возвращается идентификатор. В mysql, если не указывать идентификатор в функции, будет работать с последним открытым. В mysqli требуется указание при любом использовании, но класс сам за тебя таскает идентификатор соединения.

Автор: s_a_s_h_a 4.3.2005, 15:39
Поясняю на примере перла, что я имел ввиду

Код

use DBI;
my $dbh1=DBI->connect("DBI:mysql:BD1:localhost","LOGIN1","PASSWORD1");
my $dbh2=DBI->connect("DBI:mysql:BD2:localhost","LOGIN2","PASSWORD2");

my ($p1,$p2)=$dbh1->selectrow_array("select P1,P2 from T12");
my ($p3,$p4)=$dbh2->selectrow_array("select P3,P4 from T34");


На php что-нибудь такое возможно?

Автор: korob2001 4.3.2005, 15:55
s_a_s_h_a smile
Ты хочешь работать сразу с двумя базами?????

Автор: s_a_s_h_a 4.3.2005, 16:18
Вообще нет, но чисто теоретически. Хотя что такого, если например нужны будут какие-нибудь действия с уже существующими базами, тогда буду.

Автор: IZ@TOP 4.3.2005, 17:56
s_a_s_h_a, ну так юзай свой класс.
Я вот например написал класс для работы с MySQL (впррочем кто себе еще не написал?).
А потом юзай:

Код
$db1 = new db("host,user,pass,base,persistent");
$db2 = new db("host,user,pass,base2,persistent");

$db1->sendQuery('select * from table where id = ${0 i}', $_GET['id']);
list($s, $d) = $db1->nextRow();

Автор: Mal Hack 4.3.2005, 19:54
А зачем открывать два соединения на одного пользователя. Это же сервер грузить будет.
Почему бы через тот же класс не сменить просто базу mysql_select_db() ??

Автор: yUAC 4.3.2005, 21:25
Мдя. Господа...

Код

$lnk1=mysql_connect(...);
mysql_select_db('dbname1',$lnk1);
$lnk2=mysql_connect(...);
mysql_select_db('dbname2',$lnk2);

mysql_query('select smth from sometable_from_db1',$lnk1);
mysql_query('select anyth from sometable_from_db2',$lnk2);


Насчет своего класса базы данных:

Код

<?

$SQL=new sql;
$SQL->connect(); //настройки берутся из глобальных массивов

$result=$SQL->res('select * from table1 where id=?',$_GET['id']);
?>

Автор: skalex 5.3.2005, 09:23
Можно не изобретать велосипед и воспользоваться уже готовыми библиотеками.
Некоторую информацию можно получить например здесь: http://detail.phpclub.net/article/2001-03-13

Автор: IZ@TOP 5.3.2005, 09:52
Цитата(Mal @ 4.3.2005, 20:54)
А зачем открывать два соединения на одного пользователя. Это же сервер грузить будет.

Я просто по примеру из перла сделал. Разумеется для таких нужд можно юзать $db->selectBase(string baseName). Либо использовать несколько указателей на соединения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)