Autor | Zpráva | ||
---|---|---|---|
Jack06 Profil |
#1 · Zasláno: 14. 4. 2009, 17:37:26
Dobrý den chtěl bych se zeptat na pár věci:
Mám připojení do databáze soubor config.php function connectDB($db_prefix=''){ try { $join_db = new mysqli('localhost', 'root', 'vertrigo', ''.$db_prefix.'remake'); $join_db->query("SET NAMES 'utf8';"); if(mysqli_connect_errno()){ throw new Exception('connect databases faild!'); } } catch (Exception $e){ echo $e->getMessage(); } return $join_db; } pak připojení do k tabulkám, například: function dbquery($query) { $connect = connectDB(); $result = $connect->query($query); return $result; } A chtěl bych poprosit o rady, jestli se to dá udělat nějak lépe nebo šetrněji k DB a tak. Občas mi to hodí chyby typu: Warning:mysqli::mysqli()[mysqli.mysqli]:(08004/1040): Too many connestions in /neco/config.php on line 3 Warning:mysqli::mysqli()[mysqli.mysqli]:Couldn't fetch mysqli in /neco/config.php on line 4 connect database failed Warning:mysqli::mysqli()[mysqli.mysqli]:Couldn't fetch mysqli in define on line // kde je $result = $connect->query($query); a ještě Warning:mysqli::mysqli()[mysqli.mysqli]: Can't conest to MySQL server on 'mysql5' (111) in /neco/config.php on line 16 // která v configu není Děkuji za rady |
||
Majkl578 Profil |
#2 · Zasláno: 14. 4. 2009, 17:45:32
"Too many connestions" = pretizeni mysql serveru
navic, pri kazdem dotazu se znovu pripojovat k db, chyba. pak se nemuzes divit, ze je pretizena db :) |
||
Jack06 Profil |
#3 · Zasláno: 15. 4. 2009, 19:03:46
Majkl578
Tak jak to mám udělat, aby se to připojilo jednou a ne pořád?? |
||
nightfish Profil |
#4 · Zasláno: 15. 4. 2009, 19:17:13
Jack06
nepřipojovat se v dbquery ale připojit se jednou na začátku, pak provést více dbquery() |
||
Jack06 Profil |
#5 · Zasláno: 15. 4. 2009, 19:25:05
nightfish
Teď to nechápu.. mám na webu kde se potřebuji připojit všude dbquery(prikaz); tzn mám to přez tu funkci.. jak to mám udělat jinak?? na to potřebuji tu funkci protože pak mám další funkce i na dbrows a takové.. |
||
Majkl578 Profil |
#6 · Zasláno: 16. 4. 2009, 20:01:20
kdyz to mermomoci chces takhle (ikdyz objektove by to bylo lepsi), tak treba takto:
function dbquery($query) { static $connect = null; if($connect === null) { $connect = connectDB(); } $result = $connect->query($query); return $result; } |
||
AM_ Profil |
#7 · Zasláno: 16. 4. 2009, 20:32:55
Funkce dbquery je naprosto otřesná. Prostě někam na začátek si dej $connect = new mysqli(server, jmeno, heslo, db); a pak už je v programu voláš $connect->query();
Spousta lidí má tendenci si funkcionalitu MySQL přepisovat do vlastních funkcí, a místo toho, aby ji tím nějak rozšířili nebo zobecnili, pouze vytvoří hromady neefektivního smetí. |
||
Jack06 Profil |
#8 · Zasláno: 17. 4. 2009, 20:27:07
Majkl578
a jak to řešíš objektově?? a pak připojení?? AM_ Proto se ptám jak na to... Díky za odpověď.. |
||
Majkl578 Profil |
#9 · Zasláno: 17. 4. 2009, 21:15:14
Jack06
ja to resim jeste vlastnim rozsireni MySQLi tridy, to nemusis. mysqli je cele objektove. jen ho objektove musis chtit. http://php.net/mysqli treba takto: $db = new MySQLi('server', 'user', 'pass', 'db');//uvodni pripojeni $result = $db->query('...dotaz na db...'); $data = $result->fetch_assoc(); $result->free(); var_dump($data); ....dalsi obdobne dotazy..... |
||
AM_ Profil |
#10 · Zasláno: 17. 4. 2009, 22:40:05
Jack06
Jak říkám, nepsat si kvanta vlastních funkcí, ale něco jako píše Majkl578. K databázi se stačí připojit jednou (to obstará už konstruktor mysqli) a následně voláš metody vytvořené instance mysqli v průběhu celého skriptu. |
||
Jack06 Profil |
#11 · Zasláno: 18. 4. 2009, 10:00:11 · Upravil/a: Jack06
Majkl578
CO přesně má za smysl: $result->free(); a musí být za voláním funkce např fetch_assoc, nebo až za skončením používání proměnných z mysqli a var_dump ? Do objektování jsem se zatím moc nepouštěl, ale rád bych.. a ještě jak udělat aby se mi všude do a z mysqli dávali a tahaly data v utf-8 jako jsem měl script viz víše? // když odstraním z toho mého úvod funkce a return tak to mohu použít a bude to to co píšeš ne?? |
||
AM_ Profil |
#12 · Zasláno: 18. 4. 2009, 12:47:51
V téhle fázi není mezi objekty a procedurami velký rozdíl, $result->fetch_assoc je objektová alternativa mysqli_fetch_assoc($result). Takže to samozřejmě musí být před var_dump, protože nejdřív ty výsledky dotazu musíš dostat do pole, než je vypíšeš.
Metoda free() uvolní paměť objektu $result, na jednodušších stránkách je skoro zbytečné se o to starat, v případě složitější stránky tím uvolníš paměť po již nepoužívaných datech. |
||
Majkl578 Profil |
#13 · Zasláno: 18. 4. 2009, 14:02:42 · Upravil/a: Majkl578
pro utf dej hned za connect
$db->set_charset('utf8'); var_dump je velmi uzitecna funkce, zejmena pri debugovani scriptu (a ve spojeni s xdebug je i vytecne formatovana), vypise ti ruzne uzitecne informace o dane promenne. je to, rekl bych, kvalitnejsi nadstavba printf. |
||
Jack06 Profil |
#14 · Zasláno: 18. 4. 2009, 20:30:51
mám takovej problémek ještě.. přez require_once tahám do scriptu funkci, ve které se potřebuji připojit do databáze a háže mi to že to nejde že je undefined $db->query(
|
||
AM_ Profil |
#15 · Zasláno: 18. 4. 2009, 20:39:18
buď v té funkci nadefinuj global $db; - cesta rychlejší, ovšem méně čistá, nebo jí $db předávej jako parametr - čistější, ovšem mezi parametry musíš při volání vždy zařadit $db.
|
||
Majkl578 Profil |
#16 · Zasláno: 18. 4. 2009, 20:50:35
AM_
a co treba singleton...? |
||
Jack06 Profil |
Mám soubor define.php a v něm:
$db = new mysqli('mysql5', 'superpokec_chat', '***', 'superpokec_chat'); $db->set_charset('utf8'); a kdykoli potřebuju do db tak ho tahám přez require_once , ale pořád mi to hází chyby že jsem překročil limit připojení do databáze.. |
||
Majkl578 Profil |
#18 · Zasláno: 18. 4. 2009, 22:22:35
Jack06
je hezke, ze nam tu ukazujes heslo k databazi...:D pokud i nadame mas problem s pretizenim, musis to resit s hostingem, aby ti navysili pocet pripojeni. |
||
AM_ Profil |
#19 · Zasláno: 18. 4. 2009, 22:33:35
Majkl578
netusim co to je :) |
||
Majkl578 Profil |
#20 · Zasláno: 18. 4. 2009, 22:37:46
AM_
co co je? :-\ |
||
Jack06 Profil |
#21 · Zasláno: 19. 4. 2009, 06:48:36
Majkl578
A takto se to tedy připojí jen jednou i když budu třeba stokrát volat $result = $db->query("SELECT * FROM ".DB_SETTINGS); $settings = $result->fetch_assoc(); |
||
AM_ Profil |
#22 · Zasláno: 19. 4. 2009, 10:31:55
Majkl578
co je singleton... 3 prispevky nad tim |
||
nightfish Profil |
#23 · Zasláno: 19. 4. 2009, 13:56:58
|
||
Majkl578 Profil |
#24 · Zasláno: 19. 4. 2009, 14:51:19
Jack06
ano, pripoji se to pri vytvoreni instance co se tyce zakomponovani singletonu, tak by to k MySQLi (preferuji - objektovy pristup) slo takto: class MyDB extends MySQLi { private static $_instance = null; const SERVER = 'servername'; const USERNAME = 'uzivatelskejmenokdb'; const PASSWORD = 'heslokdb'; const DBNAME = 'jmenodb'; private function __construct() { parent::__construct(self::SERVER, self::USERNAME, self::PASSWORD, self::DBNAME); } public static function _() { if(self::$_instance === null) { self::$_instance = new self(); } return self::$_instance; } } do tech 4 konstant nastavis sve udaje pro pristup k databazi kdyz budes chtit pracovat s databazi, udelas toto: $db = MyDB::_(); tim zavolas statickou metodu a ta ti vrati instanci tridy (pokud neexistovala, tak i sama pripoji k databazi). s tou pak normalne pracujes. muzes dat treba tisic dotazu, porad to bude 1 pripojeni k databazi. |
||
Jack06 Profil |
#25 · Zasláno: 19. 4. 2009, 14:54:31
Majkl578
Tak teď nějak nechápu jak budu volat to co jsem volal stylem: $result = $db->query("SELECT * FROM ".DB_SETTINGS); $settings = $result->fetch_assoc(); |
||
Majkl578 Profil |
#26 · Zasláno: 19. 4. 2009, 14:56:30
Jack06
uplne stejne, jen predtim udelas toto (za predpokladu, ze jsi treba v nejake funkci, kde nemas globalne $db): $db = MyDB::_(); |
||
Jack06 Profil |
#27 · Zasláno: 19. 4. 2009, 14:59:01
Majkl578
Aha takže toto hodím na začátek scriptu, kde používám výběry z mysql, a když to dám do souboru define.php, kterej v každém souboru require_once tak to stačí? a když to teda budu chtít dát do funkce tak hodím global $db do {} ve funkci, chápu? |
||
Majkl578 Profil |
#28 · Zasláno: 19. 4. 2009, 15:01:27
Jack06
tak tak, na zacatek a pak muzes pouzit v celem scriptu. funkci nechapes. global je osklive. to co jsem napsal je vlastne zkrasleni toho procesu. tudiz nepouzijes global $db; $db = MyDB::_(); |
||
Jack06 Profil |
#29 · Zasláno: 19. 4. 2009, 15:04:20 · Upravil/a: Jack06
Majkl578
aha tak děkuji :-) Hned to zkusím :-) //a ještě charset mám přidat kam?? |
||
Majkl578 Profil |
#30 · Zasláno: 19. 4. 2009, 15:09:30 · Upravil/a: Majkl578
$db = MyDB::_(); $db->set_charset('utf8'); |
||
Téma pokračuje na další straně.
|
0