« 1 2 »
Autor Zpráva
Jack06
Profil
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
"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
Majkl578
Tak jak to mám udělat, aby se to připojilo jednou a ne pořád??
nightfish
Profil
Jack06
nepřipojovat se v dbquery
ale připojit se jednou na začátku, pak provést více dbquery()
Jack06
Profil
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
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
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
Majkl578
a jak to řešíš objektově?? a pak připojení??

AM_
Proto se ptám jak na to... Díky za odpověď..
Majkl578
Profil
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
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
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
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
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
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
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
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
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
Majkl578
netusim co to je :)
Majkl578
Profil
AM_
co co je? :-\
Jack06
Profil
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
Majkl578
co je singleton... 3 prispevky nad tim
nightfish
Profil
AM_
netusim co to je :)
tak nebuď líný a studuj
Majkl578
Profil
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
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
Jack06
uplne stejne, jen predtim udelas toto (za predpokladu, ze jsi treba v nejake funkci, kde nemas globalne $db):
$db = MyDB::_();
Jack06
Profil
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
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;
ale
$db = MyDB::_();
tim ziskas tu samou instanci jako ma zbytek scriptu.
Jack06
Profil
Majkl578
aha tak děkuji :-)
Hned to zkusím :-)

//a ještě charset mám přidat kam??
Majkl578
Profil
$db = MyDB::_();
$db->set_charset('utf8');
« 1 2 »

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: