Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Элегантный стиль написания php-скриптов 
:(
    Опции темы
s_a_s_h_a
Дата 4.3.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Здравствуйте. Предлагаю в этой теме поговорить об элегантном, красивом, оптимизированом, понятном стиле написания 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 видел только, что устанавливается соединение и потом все функции работают с этой БД, пока соединение не будет закрыто.

PM MAIL   Вверх
Farik
Дата 4.3.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.2.2005

Репутация: нет
Всего: 1



Если поле одно, то
Код
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 требуется указание при любом использовании, но класс сам за тебя таскает идентификатор соединения.

Это сообщение отредактировал(а) Farik - 4.3.2005, 10:30
PM MAIL   Вверх
s_a_s_h_a
Дата 4.3.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Поясняю на примере перла, что я имел ввиду

Код

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 что-нибудь такое возможно?

Это сообщение отредактировал(а) s_a_s_h_a - 4.3.2005, 15:40
PM MAIL   Вверх
korob2001
Дата 4.3.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



s_a_s_h_a smile
Ты хочешь работать сразу с двумя базами?????


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
s_a_s_h_a
Дата 4.3.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Вообще нет, но чисто теоретически. Хотя что такого, если например нужны будут какие-нибудь действия с уже существующими базами, тогда буду.
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



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();



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Mal Hack
Дата 4.3.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



А зачем открывать два соединения на одного пользователя. Это же сервер грузить будет.
Почему бы через тот же класс не сменить просто базу mysql_select_db() ??
PM ICQ   Вверх
yUAC
Дата 4.3.2005, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 9.6.2004

Репутация: 3
Всего: 3



Мдя. Господа...

Код

$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']);
?>

PM MAIL   Вверх
skalex
Дата 5.3.2005, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 8
Всего: 23



Можно не изобретать велосипед и воспользоваться уже готовыми библиотеками.
Некоторую информацию можно получить например здесь: http://detail.phpclub.net/article/2001-03-13
PM   Вверх
IZ@TOP
Дата 5.3.2005, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



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

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


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.