Autor Zpráva
xlifer
Profil
Nemůžu přijít na to, proč se mi dovnitř funkce ulozitZaznam() nepředává vytvořené přípojení k DB? MySQL mi hlasí chybu 1146, což je neexistující tabulka a ukazuje to právě na problém, kdy "pripojeni_2" přebilo "pripojeni_1", protože proběhlo jako poslední.

Když uvnitř funkce vytvořím znovu "pripojeni_1" znvou, tak je to v pořádku.

$pripojeni_1 = mysql_connect($server1, $user1, $pass1);
...
$pripojeni_2 = mysql_connect($server2, $user2, $pass2);
...

function ulozitZaznam($sql, $spojeni=1)
{
  $res = mysql_query($sql, $GLOBALS["pripojeni_".$spojeni]);
  ...
}

ulozitZaznam("INSERT INTO...", 2);
ulozitZaznam("INSERT INTO...");
lionel messi
Profil
xlifer:
1. Správne sa píše $_GLOBALS["pripojeni_".$spojeni].
2. $pripojeni_1 nikde nedefinuješ ako globálnu premennú.
xlifer
Profil
lionel messi:
1. Správne sa píše $_GLOBALS["pripojeni_".$spojeni].

To platí pro GET, POST, SESSION, SERVER, REQUEST, FILES, ENV, COOKIE, ale na $GLOBALS určitě ne.
Viz manual PHP: $GLOBALS

lionel messi:
2. $pripojeni_1 nikde nedefinuješ ako globálnu premennú.
Jak to? Hned na začátku je $pripojeni_1 = ... nebo to musí být jako $GLOBALS["pripojeni_1"] ?
Joker
Profil
xlifer:
Tohle je teda mimořádně ošklivý způsob, jak předávat data dovnitř funkce.

Proč se tam nepředává jednoduše ta proměnná s tím připojením?
xlifer
Profil
Joker:
Souhlasím, může to být uděláno napřímo, ale je to pouze pracovní verze, nicméně to neřeší problém.

Lepší?

function ulozitZaznam($sql, $spojeni="pripojeni_1")
{
  $res = mysql_query($sql, $GLOBALS[$spojeni]);
  ...
}
Lonanek
Profil
xlifer:
Lepší?
Ne.

Osobně bych řešil:
$pripojeni_1 = mysql_connect($server1, $user1, $pass1);
...
$pripojeni_2 = mysql_connect($server2, $user2, $pass2);
...
 
function ulozitZaznam($sql, $spojeni=0)
{
  if ($spojeni == 0)
  {
    // nebyly zadany parametry pripojeni
    return false;
   }
  $res = mysql_query($sql, $spojeni]);
  ...
}
 
ulozitZaznam("INSERT INTO...", $pripojeni_1);
ulozitZaznam("INSERT INTO...", $pripojeni_2);
Joker
Profil
xlifer:
Souhlasím, může to být uděláno napřímo, ale je to pouze pracovní verze, nicméně to neřeší problém.
Řeší, problém nebude vůbec existovat.
Není důvod to tak dělat ani do pracovní verze, není to ani zjednodušení. Je to chybný návrh, který je ještě navíc pracnější, než ten správný.
Funkce bude:
function ulozitZaznam($sql, $spojeni)
…přičemž $spojeni bude ten resource objekt. Celá ta opičárna se skládáním řetězce a vytahováním z globálních proměnných tím odpadne.


Jinak sice ten kód je jen ukázka, ale další poznámky:
- mysql_* funkce jsou zastaralé a v novém kódu by se neměly používat.
- Snad je to jen ukázka, ale ta funkce ulozitZaznam nedává moc smysl. Bude to víceméně alias pro mysql_query.
xlifer
Profil
Joker:
- mysql_* funkce jsou zastaralé a v novém kódu by se neměly používat.
A co se používá v novém kódu? mysqli_* ?

…přičemž $spojeni bude ten resource objekt. Celá ta opičárna se skládáním řetězce a vytahováním z globálních proměnných tím odpadne.
Takže jestli dobře chápu, tak když budu do funkce předávat přímo ten resource objekt, tak to bude fungovat bez problému, který řeším? Pokud ano, tak jsem konečně došel k závěru začátku, na co jsem se vlastně ptal :-)
Martin2
Profil *
xlifer:
Zdá se, že tvoříš něco, co by mělo být řešeno objektově. Globální funkce bys posledních 10 let vůbec neměl potřebovat. Nikdy, na nic a za žádných podmínek.

Možná bys mohl zkusit nějaký framework, vyřeší spoustu problémů s tvorbou závislostí.
xlifer
Profil
Martin2:
Zdá se, že tvoříš něco, co by mělo být řešeno objektově. Globální funkce bys posledních 10 let vůbec neměl potřebovat. Nikdy, na nic a za žádných podmínek.
Nemyslím si, ale chápu vývoj doby, ale pak je k zamyšlení, proč funkce() zcela z nových verzí PHP nevypustí, když už je to tak 10 let mimo mísu, jak se říká... (Pokud jsi teda nemyslel globální proměnné?) Určitě záleží vždy na konkrétní situaci a projektu, osobně moc nepreferuji frameworky i když je to určitě skvělá výpomoc, ale vždy to dopadne tak, že framework řeší 100% oblasti, ale já s toho potřebuji třeba jen 5%, takže sebou tahám nářadí, které v projektu nepoužiju, ale můžu... Mám pocit, že dnes má spousta projektů naložen celý náklaďák nářadí a jezdí utahovat šrouby, takže by jim stačil malý kufřík se základním nářadím...
Martin2
Profil *
xlifer:
pak je k zamyšlení, proč funkce() zcela z nových verzí PHP nevypustí
Rozumný vývoj nevytváří zpětné nekompatibility, když k tomu nemá důvod. To ale není argument takové vlastnosti používat v nových programech.

Pokud jsi teda nemyslel globální proměnné?
Ne, myslel jsem globální funkce. Tedy funkce definované v globálním prostoru.

že framework řeší 100% oblasti, ale já s toho potřebuji třeba jen 5%,
Framework řeší typicky propojení HTTP požadavku s objekty, které jej zpracují a objekty, které se starají o programovou logiku, zpracování dat a sestavení výsledku k zobrazení. To jsou činnosti, které potřebuje ke své funkci každá webová aplikace.

takže sebou tahám nářadí, které v projektu nepoužiju
Starost amatérských PHP programátorů o zátěž serveru je až dojemná. Věz, že, pokud bychom brali v úvahu třeba Nette, je overhead kvalitního frameworku skoro neměřitelný.
Keeehi
Profil
Martin2:
Věz, že, pokud bychom brali v úvahu třeba Nette, je overhead kvalitního frameworku skoro neměřitelný.
Navíc právě Nette bylo rozpadnuto do spousty menších projektů, takže pokud řešíš každý kilobajt tak si ho můžeš poskládat jen z těch částí, které vyuziješ.

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: