Autor | Zpráva | ||
---|---|---|---|
Mufna Profil |
#1 · Zasláno: 21. 8. 2009, 17:26:17
Zdravím Vás. prosím zkuste mi poradit, už se s tímhle problémem mořím celý den a po pravdě jsem v koncích, protože už nevím, co je kde špatně. Dotaz na databázi si "nevezme" prefix tabulek z configu a tím pádem to vyhodí chybu, že tabulka neexistuje (samozřejmě, že neexistuje, protože tam chybí ten prefix).
Mám nějaký kořenový adresář a v něm php soubor s dotazem: <?php require_once("libs/admin_fce.php"); require_once("libs/admin_fns.php"); require_once("html/admin_html.php"); $res=query("SELECT * FROM ".$tbl_prefix."tabulka WHERE atd. atd. "); funkce pro spojení s DB v admin_fce.php jsou konstruovány takto: // *** DB query *** function query($sql) { require('config.php'); // myslim, ze to zde byt nemusi, ze zoufalstvi jsem to zkusil, ale stejne nic require('messages.php'); init_db(); $res=@mysql_query($sql); if (!$res) { echo $db_error_msg[0],mysql_error(); exit; } return $res; // zavrit mysql_close() } // *** Init DB *** function init_db() { require('config.php'); require('messages.php'); $dbc = @mysql_connect($db_host,$db_user,$db_passwd) OR die($db_error_msg[1].mysql_error()); $dbs = @mysql_select_db($db_name) OR die($db_error_msg[2].mysql_error()); $sql="SET character_set_connection=utf8"; mysql_query($sql); $sql="SET character_set_client=utf8"; mysql_query($sql); $sql="SET character_set_results=utf8"; mysql_query($sql); $sql="SET character_set_server=utf8"; mysql_query($sql); } a ještě je samozřejmě přítomen v "libs/" config.php, který je OK včetně určení prefixu tabulek: $tbl_prefix='wr_'; |
||
TomášK Profil |
#2 · Zasláno: 21. 8. 2009, 17:44:03 · Upravil/a: TomášK
Problém je myslím s kontextem proměnné.
fucntion init_db() { $tbl_prefix = 'xxx'; // proměnná funkce } // zde končí její platnost mysql_query("...".$tbl_prefix."..."); // tbl prefix je zde definovaná poprvé a inicilizuje se prázdný řetězec (možná null nebo něco takového) Řešení je vložit require s configem venku z funkce. Edit: připojovat se k databázi při každém volání dotazu není šťastný nápad. Raději jednou na začátku a pak použít existující spojení. |
||
Alphard Profil |
#3 · Zasláno: 21. 8. 2009, 17:47:05
Mufna:
Problém bude asi v předávání parametru hodnotou. Proměnné se zřejmě nahrazují při předání funkci, kdy ještě $tbl_prefix neobsahuje žádnou hodnotu. Ve chvíli, kdy už načtete konfiguraci, tak neni co nahrazovat. Nejsem si tím ale jistý. Řešením by mohlo být nastavit prefix jako řetězec a nahradit ho ve funkci query() např. pomocí str_replace() $res=query("SELECT * FROM :prefix:tabulka WHERE atd. atd. "); Zároveň byste si ulehčil zápis. Celkově mi ale váš layer pro práci s databází připadá nepoužitelný. Každý dotaz (funkce query()) volá funkci init_db() kde, kde se neustále opakuje připojení k databázi i šílená baterie 4 dotazů na nastavení utf8. Přitom set names ve většíně případů stačí. Teď vidím, že TomášK byl rychlejší, ale mazat už to nebudu. |
||
Mufna Profil |
#4 · Zasláno: 21. 8. 2009, 17:52:27
TomášK
Problém je myslím s kontextem proměnné. No ale $db_host, $db_user, $db_passwd jsou taky proměnné, které se získavají z requirovaného config.php, a s tím problém není, tzn. pokud jsou jejich hodnoty správně, pak se provede funkce init_db() OK. Zkoušel jsem to i třeba takto (i když bych radši ten prefix definoval mimo tyhle funkce): function query($sql) { // require('config.php'); $tbl_prefix = 'wr_'; require('messages.php'); init_db(); $res=@mysql_query($sql); if (!$res) { echo $db_error_msg[0],mysql_error(); exit; } return $res; // zavrit mysql_close() } a ani tohle nefunguje. |
||
Mufna Profil |
#5 · Zasláno: 21. 8. 2009, 17:55:26
TomášK
připojovat se k databázi při každém volání dotazu není šťastný nápad. Raději jednou na začátku a pak použít existující spojení. Šlo by to nějak v těch mých konstrukcích zařídit ? |
||
Alphard Profil |
#6 · Zasláno: 21. 8. 2009, 18:05:29
Mufna:
„Zkoušel jsem to i třeba takto (i když bych radši ten prefix definoval mimo tyhle funkce):“ Úplně stejný problém, musel byste ho definovat mimo funkci před dotazem. „Šlo by to nějak v těch mých konstrukcích zařídit ?“ V kombinaci se statickou proměnnou by snad šlo simulovat Singleton. |
||
Mufna Profil |
#7 · Zasláno: 21. 8. 2009, 18:53:51
Alphard
V kombinaci se statickou proměnnou by snad šlo simulovat Singleton. Aha, takže už jsme u OOP. Takže to radši (když už) kompletně předělat |
||
Alphard Profil |
#8 · Zasláno: 21. 8. 2009, 19:30:26
Mufna:
„Aha, takže už jsme u OOP.“ Skoro, s tou statickou proměnnou by to šlo ještě na úrovni funkcí, ale k ničemu dobrému to nepovede. „Takže to radši (když už) kompletně předělat“ Nechtěl jsem to říci přímo. A než získáte trochu více zkušeností (nic ve zlém), tak můžete používat třeba dibi. |
||
Mastodont Profil |
#9 · Zasláno: 21. 8. 2009, 20:10:21
A co třeba používat konstanty, ty mají globální viditelnost?
|
||
Mufna Profil |
#10 · Zasláno: 22. 8. 2009, 00:39:33
Alphard
A než získáte trochu více zkušeností (nic ve zlém), tak můžete používat třeba dibi. Ok, podívám se na to, díky za tip Trochu jsem si ten svůj "layout - nelayout" zkusil překopat, relativně ho zjednodušit, kdyby to zatím aspoň fungovalo, no ale s tou funkcí query() aby brala z konfigu prefix, jsem nějak nepohnul. PHP soubory teď začínají: <?php session_start(); require_once("libs/functions.php"); require_once("html/html.php"); atd. ?> functions.php <?php $libdir = dirname(__FILE__); require_once($libdir."/db_functions/db_config.php"); // bez tohodle řádku jsem se alespoň připojil k DB, ale s tímto řádkem kupodivu (pro mě) skončil pokus o spojení chybou "nepodařilo se připojit k DB" require_once($libdir."/db_functions/db_connection.php"); require_once($libdir."/db_functions/db_prot.php"); require_once($libdir."/functions/ip_check.php"); ?> a db_connection.php, kam jsem nacpal i tu funkci query(). <?php require('db_config.php'); // ta jsem to zkusil šoupnout sem, i když je to už krkolomný, ale stejně nic, dokonce se po přidání tohohle řádku zase nezdaří ani připojení k DB function query($sql) { require('db_messages.php'); $res = @mysql_query($sql); if (!$res) { echo $db_error_msg[0],mysql_error(); exit; } return $res; // mysql_close() } function db_connect() { require_once('db_config.php'); require('db_messages.php'); $conn = @mysql_connect($db_host,$db_user,$db_passwd); if (!$conn) { echo $db_error_msg[1],mysql_error(); } $db = @mysql_select_db($db_name); if (!$db) { echo $db_error_msg[2],mysql_error(); } if ($conn && $db) { mysql_query('SET NAMES "utf8"', $conn); } return $conn; } ?> |
||
Časová prodleva: 15 let
|
0