Autor Zpráva
Mufna
Profil
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
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
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
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
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
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
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
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
A co třeba používat konstanty, ty mají globální viditelnost?
Mufna
Profil
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;
  }

?>

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: