| Autor | Zpráva | ||
|---|---|---|---|
| xlifer Profil |
#1 · Zasláno: 23. 6. 2011, 10:54:29 · Upravil/a: xlifer
Při používání dvou databázi přistupuji ve funkci k identifikátoru připojení přes global $idenfitikator, je nějaké možné jiné řešení, když nemůžu použít poslední vytvořené spojení, protože se pracuje se dvěma.
<?php
$link_db1 = mysql_connect("db-1", "uziv_jmeno1", "tajne1");
$link_db2 = mysql_connect("db-2", "uziv_jmeno2", "tajne2");
function vypis() {
global $link_db1;
$result = mysql_query("SELECT * WHERE 1=1",$link_db1)
}
?>Související dotatz je, zda global musí být vždy na začátku funkce nebo je možné global vyvolat v podmínce podle potřeby, příklad: <?php
function vypis($db)
{
if ($db==1) {
global $link_db1
}
if ($db==2) {
global $link_db2
}
}
?> |
||
| Jozin Profil |
#2 · Zasláno: 23. 6. 2011, 11:37:51
Zdravím, tak je více možností: (nepíšu tam zpracování vstupu do funkce... prostě klasicky, reference a sql dotaz)
<?php
//první možnost předávat parametrem referenci
function vypis($db, $sql) {
mysql_query($sql, $db);
}
vstup: vypis($link_db1, "select * from blabla");
//druha moznost pouzit $GLOBALS
function vypis($db, $sql) {
if($db == 1) $db = $GLOBALS['link_db1'];
else $db = $GLOBALS['link_db2'];
mysql_query($sql, $db);
}
vstup: vypis(1, "select * from blabla");
Toto jsou tak nejběžnější možnosti. Když se nad nimi zamyslíš, tak první možnost je lepší. Proč? Protože, když dojde k tomu, že přejmenuješ referenční proměnné, nebo přidáš další databázové spojení, tak funkci lze dále používat. Kdežto druhá možnost přímo počítá s existencí takto pojmenovaných a existujících spojeních. Druhé řešení by se takto dalo ošetřit, že místo čísla by se zadával právě klíč $GLOBALS tzn místo 1 'link_db1'. Je to prostě na tom, jak ti to vyhovuje. K jednomu cíli vždy vede moc a moc cest. Při programování většího projektu budeš stát hodněkrát před otázkou, kterou cestu si vybrat. |
||
| xlifer Profil |
#3 · Zasláno: 23. 6. 2011, 11:45:43
Díky za radu, porozumněl jsem jí zcela :-)
A ještě pro upřesnění, pokud bych tedy někde dříve již použil definici global $promenna; tak je to moc spatně, když vezmeme v potaz, že raději je lépe přistupovat přes $_GLOBALS["promenna"] ? Podle mě je to stejné, akorát to není zrovna "cool". |
||
| Jozin Profil |
#4 · Zasláno: 23. 6. 2011, 12:09:09 · Upravil/a: Jozin
Je to to samé, globální proměnné nemám rád tak ani tak :-D. Je to věc názoru. Podle mě je lepší předávat "globální proměnnou" jako parametr, nejsem pak vázaný na jméno té proměnné nýbrž na její obsah.
EDIT: když si vezmeš situaci, kdy delší dobu vyvýjíš systém takto a pak si uvědomíš, že název globální proměnné link_db1 se ti nelíbí a přejmenuješ to na mysql1. Všechny funkce budeš muset přepsat. Když to používáš jako parametr, tak zase všude, kde si použil link_db1 jako parametr budeš muset přejmenovat. To se dá zase ošéfovat třeba další funkcí, která vrací právě link a pokud neexistuje spojení, tak ho naváže. |
||
| Majkl578 Profil |
#5 · Zasláno: 23. 6. 2011, 17:33:48 · Upravil/a: Majkl578
Obojí je špatně, není to čistý návrh. Správněji bys měl identifikátor předávat v parametru nebo, lépe, použít např. MySQLi (nebo přímo nějakou abstrakční vrstvu, např. dibi), které je objektově zaměřené a k tomuto se hodí lépe.
|
||
| Jozin Profil |
#6 · Zasláno: 23. 6. 2011, 17:35:55
Majkl578:
V prvním řešení předávám idetifikátor. Jenže pokud už tak má napsané 99 % funkcí, tak je trošku kontraproduktivní přepisovat všechny funkce a potom i script, který tyto funkce obsluhuje. |
||
| Majkl578 Profil |
#7 · Zasláno: 23. 6. 2011, 17:46:01
Jozin:
Taková úprava by byla kontraproduktivní jen ze současného pohledu - z dlouhodobého hlediska je nezávislost té funkce na globálním kontextu výhodou (ať už kvůli přejmenování proměnné nebo něčemu jinému). Nicméně samozřejmě nemusí být nutné vše přepsat ihned, ale třeba až časem a prozatimně si udělat fallback na původní řešení (což zajistí zpětnou/dopřednou kompatibilitu), např.: function test($x = NULL)
{
if ($x === NULL) {
global $foo;
$x = $foo;
}
echo $x;
}
$foo = '_';
test(); // _
test('w'); // w |
||
| Jozin Profil |
#8 · Zasláno: 23. 6. 2011, 17:49:53
Majkl578:
To je sice pravda, ale až by dělal další projekt, tak tam přece nebude zavádět deprecated globální proměnné, jako je uvedeno tady global $foo. Je to tak jako tak jedno, je jeho věc, jak to chce dělat. Popravdě nemám rád, když systém sahá do databáze kdekoli... Raděj udělám model, který se bude starat o databázi a pak se jen ptám, na informace, které potřebuji modelu. Je to transparentní a model se dá lehko obměnit. |
||
|
Časová prodleva: 15 let
|
|||
0