Autor Zpráva
xlifer
Profil
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
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0