$DB = array(); /* function mysql_or_mysqli($funcName){ global $CONF; return "mysql".($CONF['usaMysqli']?"i":"")."_".$funcName; } function mysql_tnx_connect($a, $b, $c){ $func = mysql_or_mysqli("connect"); return $func($a, $b, $c); } function mysql_tnx_select_db($a, $b){ global $CONF; if($CONF['usaMysqli']) return $b->select_db($a); else return mysql_select_db($a, $b); } function mysql_tnx_query($a, $b){ global $CONF; $func = mysql_or_mysqli("query"); return $CONF['usaMysqli'] ? $func($b, $a) : $func($a, $b); } function mysql_tnx_fetch_assoc($a){ $func = mysql_or_mysqli("fetch_assoc"); return $func($a); } function mysql_tnx_fetch_array($a){ $func = mysql_or_mysqli("fetch_array"); return $func($a); } function mysql_tnx_fetch_row($a){ $func = mysql_or_mysqli("fetch_row"); return $func($a); } */ function mysqli_tnx_init(){ //viene chiamata appena disponibile la conf del sito //in alcuni casi particolari potrebbe essere chiamata attraverso una db_q* fatta nell'indi.inc.php (ordinalo) global $_DB, $DB, $CONF; if(!$_DB){ require($CONF["libPath"]."mysqliTnx.php"); if(PHP_MAJOR_VERSION >= 7 && strpos($DB['host'], ":") === false){ //forzare php ad usare tcp/ip invece che file socket, necessario per il tunnel tra il server php 5 e quello php 7 // $DB['host'] .= ":3306"; } $_DB = @new mysqliTnx($DB['host'], $DB['username'], $DB['password']);//triggera 6 errori in caso di db offline: https://demo.tnx.it/tnx/?testaDbOffline=1 (ne triggero uno sotto) if($_DB->connect_error){ trigger_error($_DB->connect_error); return false; } $_DB->set_charset($CONF['mcharset'] == "UTF-8" ? 'utf8' : 'latin1'); if($DB['database']) $_DB->select_db($DB['database']);//fa anche setSchema } } function mysql_tnx_connect($a, $b, $c){ global $CONF, $_DB; if($CONF['usaMysqli']){ mysqli_tnx_init(); //se chiamo mysqli_connect crea una seconda connessione e quindi potrei anche usare le funzioni mysql_ vecchie! return $_DB; } else{ $return = @mysql_connect($a, $b, $c);//triggera due errori (quindi due mail), faccio 1 io sotto, test: https://demo.tnx.it/intercultura/?mailQueueProcess=1&testaDbOffline=1 if($return === false){ trigger_error(mysql_error()); } return $return; } } function mysql_tnx_close($a = null){ global $CONF, $DB; if(class_exists("ConnectionManager")){ $db = ConnectionManager::getDataSource('default'); $db->close(); } if(!$a) $a = $DB['link']; if($CONF['usaMysqli']) $return = $a->close(); else $return = mysql_close($a); if($return) unset($DB['link']); return $return; } function mysql_tnx_select_db($a, $b = null){ global $CONF, $DB; if($CONF['debugAllQueries']){ echo '
seleziono '.$a.''; } if(!$b) $b = $DB['link']; if($CONF['usaMysqli']){ mysqli_tnx_init(); $return = $b->select_db($a); } else $return = mysql_select_db($a, $b); if($return) $DB["current_database"] = $a; return $return; } function mysql_tnx_free_result($a){ global $CONF; if($CONF['usaMysqli']) return mysqli_free_result($a); else return mysql_free_result($a); } function mysql_tnx_num_fields($a){ global $CONF; if($CONF['usaMysqli']) return $a->field_count; else return mysql_num_fields($a); } function mysql_tnx_num_rows($a) { global $CONF, $DB; if($CONF['usaMysqli']){ return $a->num_rows; } return mysql_num_rows($a); } function mysql_tnx_field_name($a, $i){ global $CONF; if($CONF['usaMysqli']){ $f = $a->fetch_fields(); return $f[$i]->name; } else return mysql_field_name($a, $i); } function mysql_tnx_errno($a = null){ global $CONF, $DB; if($CONF['usaMysqli']){ if(!$a) $a = $DB['link']; return $a->errno; } else return mysql_errno($a); } function mysql_tnx_ping($a = null){ global $CONF, $DB; if($CONF['usaMysqli']){ if(!$a) $a = $DB['link']; return $a->ping(); } else return mysql_ping($a); } function mysql_tnx_error($a = null){ global $CONF, $DB; if($CONF['usaMysqli']){ if(!$a) $a = $DB['link']; return $a->error ? $a->error : $a->connect_error; } else { if ($a) return mysql_error($a); return mysql_error(); } } function mysql_tnx_insert_id($a = null) { global $CONF, $DB; if(!$a) $a = $DB['link']; if($CONF['usaMysqli']){ return $a->insert_id; } return mysql_insert_id($a); } function mysql_tnx_affected_rows($a = null) { global $DB, $CONF; if($CONF['usaMysqli']){ if(!$a) $a = $DB['link']; return $a->getAffectedRows(); } return mysql_affected_rows($a); } function mysql_tnx_escape_string($a){ return mysql_tnx_real_escape_string($a); } function mysql_tnx_real_escape_string($a){ global $CONF, $DB; if($CONF['usaMysqli']) return mysqli_real_escape_string($DB['link'], $a); else{ if(!$DB["link"]) db_q("select 1");//inizializzo il db (nei vecchi siti facendo un escape di una variabile prima di qualsiasi query viene tentato e quindi fallito l'accesso con i parametri di default) return mysql_real_escape_string($a); } } function mysql_tnx_query($a, $b = null){ global $CONF, $DB; if($CONF['debugAllQueries']){ echo '
'.$a.''; } if(!$b) $b = $DB['link']; if($CONF['usaMysqli']){ return $b->query($a); } else return mysql_query($a, $b); } function mysql_tnx_fetch_assoc($a){ global $CONF, $_DB; if($CONF['usaMysqli']){ if($a === false) return false;//capita che mysql_tnx_fetch_assoc sia chiamato sul risultato di db_q che può essere false, quindi $a->fetch_array sabbe un fatal e non si leggerebbe l'errore return $a->fetch_array(MYSQLI_ASSOC); } else return mysql_fetch_assoc($a); } function mysql_tnx_fetch_array($a, $b = null){ global $CONF, $_DB; if($b) trigger_error("Mappare le costanti mysql con quelle mysqli"); if($CONF['usaMysqli']) return $a->fetch_array(MYSQLI_BOTH); else return mysql_fetch_array($a); } function mysql_tnx_fetch_row($a){ global $CONF, $_DB; if($CONF['usaMysqli']) return $a->fetch_array(MYSQLI_NUM);//MYSQLI_NUM will behave identically to the mysqli_fetch_row() else return mysql_fetch_row($a); } function db_q3($query) { global $DB; if($DB["link"] == "") { if (!$link = @mysql_tnx_connect($DB[host], $DB[username], $DB[password])) { return false; } else { if (!@mysql_tnx_select_db($DB[database], $link)) { return false; } else { //IMPOSTI LINK $DB["link"] = $link; } } } if (!$result = @mysql_tnx_query($query, $DB["link"])) $result = FALSE; return $result; } function arrayToSql($array, $glue = ",\n"){ foreach($array as $k=>$v) $array[$k] = '`'.$k.'`=\''.addslashes($v).'\''; return implode($glue, $array); } function db_err() { global $DB; $number = mysql_tnx_errno($DB["link"]); return !$number ? '' : $number . ": " . mysql_tnx_error($DB["link"]) . "\n"; } function db_last_insert_id() { return mysql_tnx_insert_id(); } function db_exists($dbname) { return db_qrs("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '".addslashes($dbname)."'"); } function db_insert_id() { return mysql_tnx_insert_id(); } function db_mysql_ping() { global $DB, $CONF; if($CONF['usaMysqli']){ return $DB["link"]->ping(); } return mysql_ping($DB["link"]); } function db_affected_rows(){ global $DB; return mysql_tnx_affected_rows($DB['link']); } function db_isDebugTempi() { //if ($GLOBALS["CONF"]["DEBUG"] == "SI") return true; if ($GLOBALS["CONF"]["DEBUG"] == "SI" || is_array($GLOBALS["CONF"]['indi_debug_pagina_lenta'])) return true; return false; } function db_q($query, $database = null, $charset = null){ global $DB, $DATI, $CONF; // if(!$database) $database = $DB["current_database"];//provato 2019/09/25 per statistiche newsletter admin_tnx if(!$database) $database = $DB["database"]; if(!$charset){ if($DB["charset"]) $charset = $DB["charset"]; else if($GLOBALS['CONF']['mcharset'] == "UTF-8") $charset = 'utf8'; // else die; else $charset = 'latin1'; } if (db_isDebugTempi()) $db_time = indi_time(); if ($GLOBALS["indi_stats_db"]) { $dbq_start = microtime(true); } //controllo keywords non valide per innodb if ($DB["innodb"]) { d_info("innodb true", "db_q"); $query = str_replace("INSERT DELAYED ", "INSERT ", $query); $query = str_replace("REPLACE DELAYED ", "REPLACE ", $query); } if(!$DB["link"]){ //lo faccio qui per funzionare sia con mysql che con mysqli if($_GET['testaDbOffline'] && $CONF['dove_sono'] == 'loc') $DB['host'] .= "_letsfail"; $DB["link"] = mysql_tnx_connect($DB['host'], $DB['username'], $DB['password']); if(!$DB["link"]) indiManutenzione("DB $DB[host] offline (".$_DB->connect_error.")"); } if($DB["current_database"] != $database /*potrebbero essere entrambi vuoti (controllo licenze ordinalo)*/ && !mysql_tnx_select_db($database, $DB["link"])){ trigger_error("Errore selezione del database $database", E_USER_ERROR); //$GLOBALS['CONF']['force_no_redirect'] = "SI"; d_err("Errore nella selezione del database $database","mysql_select_db","DATAB"); return false; } if($charset && $DB["current_charset"] != $charset){ /* https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html A SET CHARACTER SET charset_name statement is equivalent to these three statements: SET character_set_client = charset_name; SET character_set_results = charset_name; SET collation_connection = @@collation_database;//questo ci rende dipendendenti dalla configurazione del db che potrebbe differire online / locale */ mysql_tnx_query("SET CHARACTER SET '$charset'", $DB["link"]); //inutile con SET CHARACTER SET: mysql_tnx_query("SET character_set_client = ".$charset, $DB["link"]); //inutile con SET CHARACTER SET: mysql_tnx_query("SET character_set_results = ".$charset, $DB["link"]); //forzo il collation, altrimenti seguirebbe la configurazione del database (in qualche caso diversa online/locale) $collation = $charset == "latin1" ? "latin1_swedish_ci" : ($charset."_general_ci"); mysql_tnx_query("SET collation_connection = ".$collation, $DB["link"]); mysql_tnx_query("SET character_set_connection = ".$charset, $DB["link"]); $DB["current_charset"] = $charset; } //nocache if($_GET['no_cache'] || $_GET['no_sql_cache']) { $count = 0; $backup = $query; $query = str_ireplace("SELECT ", "SELECT SQL_NO_CACHE ", $query, $count); if($count > 1){ trigger_error("Non ho potuto applicare SQL_NO_CACHE a una query con subquery"); //assumo che ci sia una subquery e non supporta SQL_NO_CACHE, darebbe errore //metterlo solo sulla query principale ha poco senso perch� sarebbe parzialmente cachata $query = $backup; } } //risultato $result = mysql_tnx_query($query, $DB["link"]); if (!$result) { $no = mysql_tnx_errno($DB["link"]); $err = mysql_tnx_error($DB["link"]); $err = $database.":". $no. ": " . $err . "\n$query\n"; $DB["error"][] = array($query,$database, $no, $err); if(in_array($no, array(2006 /*has gone away*/))) indiManutenzione("db has gone away"); if(!$DATI['ignora_duplicate_entry'] || mysql_tnx_errno($DB["link"]) != 1062){ d_err($err,"query","DATAB"); //trigger_error(serialize(array("errore"=>$err,"nome"=>"query","gruppo"=>"INDI")), E_USER_WARNING); } } else { //calcolo tempo //24/03/2016 cecca e carlo, con script che fanno molte query (vedi I:\SITI\toysforyou2013\_pagine\export_libroco.inc.php) // utilizzava troppa memoria ed usciva il fatal quindi abbiamo lasciato di tenersi le query solo se DEBUG = SI //if($GLOBALS["CONF"]["DEBUG"] == "SI" or indi_location() == "loc") { if (db_isDebugTempi()) { $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info($query,"db:query(QT:$TIME)","DATAB"); $GLOBALS["sadmin_queries"]++; $GLOBALS["sadmin_queries_time"]+=$TIME; $DB["query"][] = array($query,$TIME); } if ($GLOBALS["indi_stats_db"]) { $dbq_diff = microtime(true) - $dbq_start; $GLOBALS["indi_stats_db_tempo_db"] += $dbq_diff; } } return $result; } function db_get_warnings(){ //non posso farlo dopo ogni query nel db_q perch� se nel codice uso chiamate dirette a mysql_* perdo last insert id e error della query appena fatta $q = mysql_tnx_query("SHOW WARNINGS", $DB["link"]); $return = array(); while($row = mysql_tnx_fetch_row($q)) $return[] = $row; return $return; } //forza utf8 function db_q_utf8($query,$database=NULL) { global $DB; //salvo $charset_old = $GLOBALS['CONF']['mcharset']; $GLOBALS['CONF']['mcharset'] = "UTF-8"; $q = db_q($query,$database); //ripristino $GLOBALS['CONF']['mcharset'] = $charset_old; return $q; } //FUNZIONI DB VERSIONE 2.2 function db_q_indi($query) { return db_q($query,"indi"); } //ritorna una array delle righe function db_crea($database) { global $DB, $CONF; if($CONF['usaMysqli']){ return $DB["link"]->query("create database '".addslashes($database)."'"); } else{ if (!$link = @mysql_tnx_connect($DB[host], $DB[username], $DB[password])) { $result = FALSE; d_err("Errore nella connessione a $DB[host]!","pconnect","DATAB"); } $out = mysql_create_db("$database"); return $out; } } //ritorna una sola riga || apc function db_qr($query,$database=NULL) { global $DB; if($GLOBALS["DATI"]['indi_apc_all_query'] == "SI" and $database == NULL) { return db_qr_cache($query,$database); } $q = db_q($query,$database); if($q) { $riga = mysql_tnx_fetch_assoc($q); mysql_tnx_free_result($q); return $riga; } else { return false; } } //ritorna una array delle righe // 12/01/23 Lore aggiunto parametro $arrayKey function db_qa($query, $database=NULL, $arrayKey=NULL) {//se si usa il secondo parametro con indi < 6 succede casino, meglio specificare il database all'interno della query global $DB; if($GLOBALS["DATI"]['indi_apc_all_query'] == "SI") { return db_qa_cache($query,$database,$arrayKey); } $q = db_q($query, $database); if($q) { if($GLOBALS[CONF]["indi_subversion"] > 5) $array = array(); //c3k: cos� ritorna sempre un tipo di dato array() e non da' errori sui foreach /* dentro molti pagine_dinamiche_tpl_1.inc.php viene fatto $sottopagine == "" e echo var_dump(null == "");// => true echo var_dump(array() == "");// => false */ if(!$arrayKey) while ($riga = mysql_tnx_fetch_assoc($q)) $array[] = $riga; else while ($riga = mysql_tnx_fetch_assoc($q)) $array[$riga[$arrayKey]] = $riga; mysql_tnx_free_result($q); //d_info(md5(serialize($array)), "db_qa md5"); return $array; } else { return false; } } //ritorna una array delle righe ??? function db_qa_indi($query,$chiave=NULL) { global $DB; if (db_isDebugTempi()) $db_time1 = indi_time(); $q = db_q($query,"indi"); while ($riga = mysql_tnx_fetch_assoc($q)) { $a = $riga[$chiave]; //print "+$a+"; if($chiave) $array["$a"] = $riga; else $array[] = $riga; } mysql_tnx_free_result($q); return $array; } function db_qrs($query, $campo=0, $database=NULL, $databaseCharset=null) { global $DB; if($GLOBALS["DATI"]['indi_apc_all_query'] == "SI") { return db_qrs_cache($query,$campo, $database, $databaseCharset); } $q = db_q($query,$database,$databaseCharset); if($q) { $riga = mysql_tnx_fetch_array($q); mysql_tnx_free_result($q); return $riga[$campo]; } else { return false; } } //function db_qr_cache($query) { function db_qr_cache($query,$database=NULL) { global $DB; if (db_isDebugTempi()) $db_time = indi_time(); if ($database == null) $database = $GLOBALS["DB"]; $key = "db_qr_cache:".md5($database.$query); //cache apc if($GLOBALS["DATI"]["indi_apc"] == "SI" && !$GLOBALS["DATI"]["disable_db_cache"] && !$_GET['no_db_cache'] && !$_GET['no_cache']) { //apc $mk = apc_fetch($key); if ($mk) { if($_GET['indi_apc']) print "k"; if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:OUT:db_qr_cache(QT:$TIME)","DATAB"); } return unserialize($mk); } else { $q = db_q($query); if($q) { $result = mysql_tnx_fetch_assoc($q); apc_store($key,serialize($result),$GLOBALS["DATI"]['indi_apc_time']); if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:IN:db_qr_cache(QT:$TIME)","DATAB"); } mysql_tnx_free_result($q); return $result; } else { return false; } } } else { if($GLOBALS["DATI"]["indi_apc"] == "SI") apc_delete($key); if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:KO:db_qr_cache(QT:$TIME)","DATAB"); } return db_qr($query); } } //ritorna una array delle righe function db_qa_cache($query, $database=NULL, $arrayKey=NULL) {//se si usa il secondo parametro con indi < 6 succede casino, meglio specificare il database all'interno della query if (db_isDebugTempi()) $db_time = indi_time(); global $DB; if($GLOBALS["DATI"]["indi_apc"] == "SI" && !$GLOBALS["DATI"]["disable_db_cache"] && !$_GET['no_db_cache'] && !$_GET['no_cache']) { //apc if ($database = null) $database = $GLOBALS["DB"]; $key = "db_qa_cache:".md5($database.$query.$arrayKey); $mk = apc_fetch($key); if ($mk) { if($_GET['indi_apc']) print "k"; if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:OUT:$key(QT:$TIME)","DATAB"); } return unserialize($mk); } else { $q = db_q($query); if($q) { while ($riga = mysql_tnx_fetch_assoc($q)) { $a = $riga[$arrayKey]; if($arrayKey != NULL) $array["$a"] = $riga; else $array[] = $riga; } apc_store($key, serialize($array), $GLOBALS["DATI"]['indi_apc_time']); if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:IN:$key(QT:$TIME)","DATAB"); } mysql_tnx_free_result($q); return $array; } else { return false; } } } if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:KO:db_qa_cache(QT:$TIME)","DATAB"); } return db_qa($query,$database,$arrayKey); } //function db_qrs_cache($query, $campo=0) { function db_qrs_cache($query, $campo=0, $database=NULL, $databaseCharset="") { global $DB; if (db_isDebugTempi()) $db_time = indi_time(); if($GLOBALS["DATI"]["indi_apc"] == "SI" && !$GLOBALS["DATI"]["disable_db_cache"] && !$_GET['no_db_cache'] && !$_GET['no_cache']) { //apc if ($database == null) $database = $GLOBALS["DB"]; $key = "db_qrs_cache:".md5($database.$query.$campo.$databaseCharset); $mk = apc_fetch($key); if ($mk) { if($_GET['indi_apc']) print "k"; if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:OUT:db_qrs_cache($key, ".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } return $mk; } else { $q = db_q($query); if($q) { $riga = mysql_tnx_fetch_array($q); apc_store($key, $riga[$campo], $GLOBALS["DATI"]['indi_apc_time']); if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:IN:db_qrs_cache($key, ".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } mysql_tnx_free_result($q); return $riga[$campo]; } else { return false; } } } if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:KO:db_qrs_cache(".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } return db_qrs($query,$campo); } function db_qf($query,$funzione="db_qf_array") { //funzione di base function db_qf_array($V){ return $V; } global $DB; $q = db_q($query); while ($V = mysql_tnx_fetch_assoc($q)) { $out[] = $funzione($V); } mysql_tnx_free_result($q); return $out; } //queri con risultati separati da un separatore function db_qsep($query,$campo,$sep="|") { global $DB; $q = db_q($query); while ($riga = mysql_tnx_fetch_assoc($q)) { $a = $riga[$campo]; //print "+$a+"; $out .= $a.$sep; } mysql_tnx_free_result($q); return $out; } //queri con risultati in un array chiave valore function db_qkv_cache($query,$kk=NULL,$vv=NULL,$ARR=NULL) { global $DB; if (db_isDebugTempi()) $db_time = indi_time(); if($GLOBALS["DATI"]["indi_apc"] == "SI" && !$GLOBALS["DATI"]["disable_db_cache"] && !$_GET['no_db_cache'] && !$_GET['no_cache']) { //apc $key = "db_qkv_cache:".md5($GLOBALS["DB"].$query.$kk.$vv); $mk = apc_fetch($key); if ($mk) { if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:OUT:db_qkv_cache($key, ".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } return $mk; } else { $q = db_q($query); if($q) { if(is_array($ARR)) $out = $ARR; while ($riga = mysql_tnx_fetch_assoc($q)) { if($vv === NULL) { if($kk == NULL) $out[] = $riga[0]; else $out[] = $riga[$kk]; } else { $k = $riga[$kk]; $v = $riga[$vv]; $out[$k] = $v; } } apc_store($key,$out, $GLOBALS["DATI"]['indi_apc_time']); if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:IN:db_qrs_cache($key, ".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } mysql_tnx_free_result($q); return $out; } else { return false; } } } if (db_isDebugTempi()) { //debug $db_time2 = indi_time(); $TIME = $db_time2 - $db_time; d_info("","apc:KO:db_qkv_cache(".$GLOBALS["DATI"]['indi_apc_time'].")(QT:$TIME)","DATAB"); } return db_qkv($query,$kk,$vv,$ARR); } //queri con risultati in un array chiave valore function db_qkv($query,$kk=NULL,$vv=NULL,$ARR=NULL) { global $DB; if($GLOBALS["DATI"]['indi_apc_all_query'] == "SI") { return db_qkv_cache($query,$kk,$vv,$ARR); } $q = db_q($query); if($q) { if(is_array($ARR)) $out = $ARR; else if($GLOBALS['CONF']["indi_subversion"] > 5) $out = array();//c3k: cos� ritorna sempre un tipo di dato array() e non da' errori sui foreach while ($riga = mysql_tnx_fetch_array($q)) { if($vv === NULL) { if($kk == NULL) $out[] = $riga[0]; else $out[] = $riga[$kk]; } else { $k = $riga[$kk]; $v = $riga[$vv]; $out[$k] = $v; } } mysql_tnx_free_result($q); return $out; } else { return false; } } function db_restore_dump($filename,$database=NULL){ $templine = ''; $lines = file($filename); foreach ($lines as $line){ if (substr($line, 0, 2) == '--' || $line == '') continue; $templine .= $line; if (substr(trim($line), -1, 1) == ';'){ db_q($templine,$database); $templine = ''; } } } function db_create_db($nome, $charset=null){ db_q("CREATE DATABASE IF NOT EXISTS ".$nome.($charset?" CHARACTER SET $charset":"")); return db_connect();//seleziona db } function db_connect_only(){ global $DB; $DB['link'] = mysql_tnx_connect($DB['host'], $DB['username'], $DB['password']); return $DB['link']; } function db_connect($tipo="link"){ global $DB; if (!$link = mysql_tnx_connect($DB[host], $DB[username], $DB[password])) { return false; } else { if (!@mysql_tnx_select_db($DB[database], $link)) { return false; } } if($tipo == "link") $DB['link'] = $link; return true; } function db_connect2(){ global $db, $var_Global; $db = mysql_tnx_connect($var_Global["db_host"], $var_Global["db_username"], $var_Global["db_password"]); if (!$db) die("Impossibile collegarsi al database\n"); if (!mysql_tnx_select_db($var_Global["db_nome"], $db)) die("Impossibile selezionare il database\n"); } function db_query($sql,$msg="") { return db_q($sql); // global $DB; // // // $res = mysql_tnx_query($sql, $DB[link]); // // if(!$res) { // // print "
';
$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
";
$printMe = $array["query"]; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8');
echo '';
}
}
if(!$array["database"] || !$array["mssql_server"] || !$array["mssql_username"] || !$array["mssql_password"]){
trigger_error("Paramentri database MSSQL non impostati");
return false;
}
if (db_isDebugTempi()) $db_time = indi_time();
if ($GLOBALS["indi_stats_db"]) {
$dbq_start = microtime(true);
}
if($array["mssql_charset"]) ini_set('mssql.charset', $array["mssql_charset"]);
$linkKey = md5($DB["mssql_server"].$DB["mssql_username"].$DB["mssql_password"]);
if(!$DB["mssql_link_".$linkKey]){
$DB['contaTentativiConnessioniSql_'.$linkKey]++;
$DB["mssql_link_".$linkKey] = mssql_connect($array["mssql_server"], $array["mssql_username"], $array["mssql_password"]);
if(!$DB["mssql_link_".$linkKey]){
if($DB['contaTentativiConnessioniSql_'.$linkKey] > 2){
if($array["mssql_callback"]) $array["mssql_callback"](array(
"query" => $array["query"],
"errore" => "Errore connessione a \"".$array["mssql_server"]."\"",
"errore_connessione" => 1
));
// $DB['contaTentativiConnessioniSql_'.$linkKey] = 0;
return false;
}else{
return ms_db_q($param);
}
}
//inizializzo connessione
$DB['contaTentativiConnessioniSql_'.$linkKey] = 0;
$DB["contaQueryMsSql_".$linkKey]++;
mssql_query("
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
SET DEADLOCK_PRIORITY HIGH
", $DB["mssql_link_".$linkKey]);
}
if(!mssql_select_db($array["database"], $DB["mssql_link_".$linkKey])){
if($array["mssql_callback"]) $array["mssql_callback"](array(
"query" => $array["query"],
"errore" => "Errore selezione DB \"".$array["database"]."\"",
"errore_selezione_db" => 1
));
return false;
}
if($array['mssql_forzaIndiRemoveEmoji'] === true){
$array["query"] = indiRemoveEmoji($array["query"]);
}
//Returns a MS SQL result resource on success, TRUE if no rows were returned (SOLO insert, una select con 0 righe torna un resource), or FALSE on error.
//i "message" (qualcosa di simile ai warning), non fanno ritornare false
//metto la chiocciola perch� triggera 2 errori diversi: "message: ..." e "General SQL Server error: Check messages from the SQL Server (severity xxx) "
//ho comunque la mia gestione sotto
$DB["contaQueryMsSql_".$linkKey]++;
$result = @mssql_query($array["query"], $DB["mssql_link_".$linkKey]);
$errore = $result === false;
if(PHP_MAJOR_VERSION >= 7){
if( ($errors = sqlsrv_errors() ) != null){
foreach( $errors as $error){
trigger_error("SQLSTATE: ".$error[ 'SQLSTATE']."\n"."code: ".$error[ 'code']."\n"."message: ".$error[ 'message']."\n");
}
}
}else{
$messaggio = mssql_get_last_message();//la mancata conversione di una stringa in id � un message non un error quindi devo controllarlo per evitare di cachare errori ad esempio "message: Conversion failed when converting from a character string to uniqueidentifier. (severity 16)"
if(strpos($messaggio, "Changed database context to ") === 0){
if($errore){
//c'� stato un errore (mssql_query ha ritornato false), ma l'ultimo messaggio segnala il cambio db (fail del driver?)
$messaggio = "Dettagli errore non recuperati";
}
//svuoto il messaggio perch� tutti i messaggi diversi da "Changed database context to" li considero errore
$messaggio = "";
}
if(strpos($messaggio, "String or binary data would be truncated") === 0){
trigger_error("Segnalazione MSSQL: ".$messaggio);
}
else if($messaggio){
$errore = true;
}
if($errore){
trigger_error("Errore MSSQL: ".$messaggio);
//dopo la chimata callback faccio return false
}
}
if($array["mssql_callback"] != ""){
$log_arr = array("query" => $array["query"]);
if($errore){
$log_arr["errore"] = $messaggio;
}
$array["mssql_callback"]($log_arr);
}
if($errore){
$return = false;
}elseif($result === true){
$return = true;
}else{
$return = array();
while ($row = mssql_fetch_assoc($result)) {
$return[] = $row;
}
if(PHP_MAJOR_VERSION >= 7){
if(stripos(trim($array["query"]),"INSERT") === 0 || stripos(trim($array["query"]),"UPDATE") === 0 || stripos(trim($array["query"]),"DELETE") === 0) $return = true;
}
}
//calcolo tempo
//24/03/2016 cecca e carlo, con script che fanno molte query (vedi I:\SITI\toysforyou2013\_pagine\export_libroco.inc.php)
// utilizzava troppa memoria ed usciva il fatal quindi abbiamo lasciato di tenersi le query solo se DEBUG = SI
//if($GLOBALS["CONF"]["DEBUG"] == "SI" or indi_location() == "loc") {
if (db_isDebugTempi()) {
$db_time2 = indi_time();
$TIME = $db_time2 - $db_time;
d_info($array["query"],"db:MS:query(QT:$TIME)","DATAB");
$DB["query"][] = array($array["query"],$TIME);
}
if ($GLOBALS["indi_stats_db"]) {
$dbq_diff = microtime(true) - $dbq_start;
$GLOBALS["indi_stats_db_tempo_db"] += $dbq_diff;
}
return $return;
}
function ms_db_qa($param){
if(!isset($param["cache"]) && $_GET['db_cache'] && $GLOBALS["DATI"]['dove_sono'] == 'loc') $param["cache"] = $_GET['db_cache'];
$cacheKey = '';
if(!$GLOBALS["DATI"]["disable_db_cache"] && !$_GET['no_db_cache'] && !$_GET['no_cache'] && is_array($param) && $param["cache"]){
$cacheKey = md5(serialize($param));
$cached = indi_apc_fetch($cacheKey);
if($cached !== false) return $cached;
}
$result = ms_db_q($param);
if($result === false){
$return = false;
}else{
//fix numerici con decimali senza zero davanti (dopo update da php5.6 a 7.0)
$result = array_map("ms_fix_decimals", $result);
if(is_array($param) && $param["cache"]){
indi_apc_store($cacheKey, $result, $param["cache"]);
}
$return = $result;
}
return $return;
}
function ms_fix_decimals($v) {
if (is_array($v)) {
$v = array_map("ms_fix_decimals", $v);
} else {
if (is_numeric($v) && substr($v, 0, 1) == ".") {
return "0" . $v;
}
}
return $v;
}
function ms_db_qr($param){
$result = ms_db_qa($param);
if($result === false){
return false;
}else{
return array_shift($result);
}
}
function ms_db_qrs($param){
$result = ms_db_qa($param);
if($result === false){
return false;
}else{
$array = array_shift($result);
if(!is_array($array)) return false;
$array = array_values($array);
//$array = array_values(array_shift($result));
return $array[0];
}
}
function ms_db_qkv($param,$chiave,$valore) {
$result = ms_db_qa($param);
if($result) {
foreach($result as $v){
$arr[$v[$chiave]] = $v[$valore];
}
return $arr;
} else {
return false;
}
}
function psql_db_q($param){
global $DB;
if(!is_array($param)){
$param = ["query" => $param];
}
if(!isset($param['tipo'])) $param['tipo'] = "q";
$default_param["database"] = $DB["psql_database"];
$default_param["psql_server"] = $DB["psql_server"];
$default_param["psql_username"] = $DB["psql_username"];
$default_param["psql_password"] = $DB["psql_password"];
$default_param["psql_callback"] = $DB["psql_callback"];
if($DB["psql_options"]) $default_param["psql_options"] = $DB["psql_options"];
else $default_param["psql_options"] = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING,
PDO::ATTR_TIMEOUT => 300,
PDO::ATTR_EMULATE_PREPARES => true
];
// if($DB["psql_charset"]) $default_param["psql_charset"] = $DB["psql_charset"];
// else $default_param["psql_charset"] = 'UTF-8';
$array = array_merge($default_param, $param);
if(!$array["database"] || !$array["psql_server"] || !$array["psql_username"] || !isset($array["psql_password"])){
trigger_error("Paramentri database PSQL non impostati");
return false;
}
if (db_isDebugTempi()) $db_time = indi_time();
if ($GLOBALS["indi_stats_db"]) {
$dbq_start = microtime(true);
}
// if($array["psql_charset"]) ini_set('mssql.charset', $array["mssql_charset"]);
$linkKey = md5($DB["psql_server"].$DB["psql_username"].$DB["psql_password"]);
if(!$DB["psql_link_".$linkKey]){
$DB['contaTentativiConnessioniPsql_'.$linkKey]++;
$string = 'pgsql:host='.$array['psql_server'].';port=5432;dbname='.$array['database'].';';
try {
$DB["psql_link_".$linkKey] = new PDO($string,$array['psql_username'],$array['psql_password'],$array['psql_options']);
}
catch(PDOException $e){
$errorConnection = $e->getMessage();
}
if(!$DB["psql_link_".$linkKey]){
if($DB['contaTentativiConnessioniPsql_'.$linkKey] > 2){
if($array["psql_callback"]) $array["psql_callback"](array(
"query" => $array["query"],
"errore" => "Errore connessione a \"".$array["psql_server"]."\".\n\n".$errorConnection,
"errore_connessione" => 1
));
return false;
}else{
return psql_db_q($param);
}
}
//inizializzo connessione
$DB['contaTentativiConnessioniPsql_'.$linkKey] = 0;
$DB["contaQueryPsql_".$linkKey]++;
}
$DB["contaQueryPsql_".$linkKey]++;
$statement = $DB["psql_link_".$linkKey]->prepare($param['query']);
try {
$return = $statement->execute();
if($param['tipo'] != "q") $return = $statement;
} catch (Exception $e) {
$errore = $e->getMessage();
}
if($errore){
trigger_error("Errore PSQL: ".$errore);
$return = false;
}
if($array["psql_callback"] != ""){
$log_arr = array("query" => $array["query"]);
if($errore){
$log_arr["errore"] = $errore;
}
$array["psql_callback"]($log_arr);
}
return $return;
}
function psql_db_qa($query){
$statement = psql_db_q(['query' => $query,'tipo' => 'qa']);
if($statement){
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
return false;
}
function psql_db_qr($query){
$statement = psql_db_q(['query' => $query,'tipo' => 'qr']);
if($statement){
return $statement->fetch(PDO::FETCH_ASSOC);
}
return false;
}
function psql_db_qrs($query){
$statement = psql_db_q(['query' => $query,'tipo' => 'qrs']);
if($statement){
$res = $statement->fetch();
return $res[0];
}
return false;
}
?>