Ich besitze PHPNUKE 6.6 und kann leider so nicht mehr updaten auf pragma, weil ich zu viel im System geändert habe. Jetzt meine Frage: ich möchte meine Datenbankabfragen optimieren und sehe am meisten Potential in der SQL_LAYER. Ich habe gesehen, das ihr z.b. prüft, ob eine Datenverbindung besteht und dann nicht nochmal die Datenbank anpolt. Kann ich das bedenkenlos in meiner Datei von phpnuke übernehmen? z.b. der code hier:
function sql_connect($host, $user, $password, $db)
{
global $dbi;
// / wenn bereits Datenbankverbindung besteht....
if (!is_resource($dbi) )
{
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db);
}
$ok = sql_select_db($dbi);
return $dbi;
}
function sql_select_db($dbi)
{
if (empty($dbi)) {
if (mysql_errno() == 1045) {
$msg = ("Die Benutzerdaten zur Datenbank sind falsch angegeben!");
} else if (mysql_errno() == 2005) {
$msg = ("Der Datenbank-Host ist falsch angegeben!");
} else {
$msg = mysql_error();
}
}
$isdb = @mysql_select_db(@$GLOBALS['dbname'], $dbi);
if (!$isdb) {
if (mysql_errno() == 1049) {
$msg = ("Der Datenbank-Name ist falsch angegeben!");
} else {
$msg = mysql_error();
}
}
if (isset($msg)) {
define('MX_SQL_VERSION', '0');
if ($GLOBALS["mxSqlErrorDebug"]) {
$msg = "<br /><br />Selection from database failed, please check the settings.<br />Kein Zugriff auf die Datenbank möglich, bitte überprüfen Sie die Einstellungen.<br /><br /><b>" . $msg . "</b><br /> mysql-error: " . mysql_errno() . "" . "<br /><br /><br />" . mxDebugBacktrace(false);
} else {
$msg = "Sorry, wir haben zur Zeit Probleme mit der Datenbank.<br />Sorry, we have some database-problems.<br /><br />(" . mysql_errno() . ")";
}
if (function_exists('mxpro_dberror')) {
mxpro_dberror($msg);
exit;
} else {
die("<html><head><title>" . $GLOBALS['sitename'] . "</title></head><body text='#000080'><h1>" . $GLOBALS['sitename'] . "</h1>" . $msg . "<br /><br /><br />" . MX_VERSION . "</body></html>");
}
}
list($mysqlversion) = mysql_fetch_row(mysql_query("SELECT VERSION() as version"));
define('MX_SQL_VERSION', $mysqlversion);
return $dbi;
}
oder reicht nur der code hier:
function sql_connect($host, $user, $password, $db)
{
global $dbi;
// / wenn bereits Datenbankverbindung besteht....
if (!is_resource($dbi) )
{
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db);
}
# $ok = sql_select_db($dbi);
return $dbi;
}
Bitte um Hilfe
Der Datenbanklayer von phpNuke ist doch in einer Klasse gekapselt und wird nur als Objekt verwendet.
Oder ist das bei Deiner Version noch nicht der Fall (Aufrufe a la $db->sql_query(....) )
Da musst Du dann schon schön die Klasse anpassen. da einfach Quellcode reinkopieren geht nicht.
Du kannst aber unseren Quellcode als Vorlage verwenden.
Ich meine aber das der eigentliche Verbindungsaufbau (zumindest ium neuen Layer) nicht
mehrmals ausgeführt wird.
MfG
Ich weiß es ist müheselig, aber anders gehts woh nicht. ich zeige dir mal hier die original - datei von mir - es wäre klasse, wenn du mir ein tipp geben könntest, wie ich dafür sorge, das meine sql_layer ein wenig aufgetunt wird, weil die ganzen abfragen welche datenbank können wir uns auch sparen, da ich auch mysql nehme:
<?php
/************************************************************************/
/* PHP-NUKE: Web Portal System */
/* =========================== */
/* */
/* Copyright (c) 2002 by Francisco Burzi */
/* http://phpnuke.org */
/* */
/* postgres fix by Rubén Campos - Oscar Silla */
/* */
/* This program is free software. You can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License. */
/************************************************************************/
if (eregi("sql_layer.php",$_SERVER['PHP_SELF'])) {
Header("Location: ../index.php");
die();
}
/* $dbtype = "MySQL"; */
/* $dbtype = "mSQL"; */
/* $dbtype = "postgres"; */
/* $dbtype = "postgres_local";// When postmaster start without "-i" option. */
/* $dbtype = "ODBC"; */
/* $dbtype = "ODBC_Adabas"; */
/* $dbtype = "Interbase"; */
/* $dbtype = "Sybase"; */
/*
* sql_connect($host, $user, $password, $db)
* returns the connection ID
*/
class ResultSet {
var $result;
var $total_rows;
var $fetched_rows;
function set_result( $res ) {
$this->result = $res;
}
function get_result() {
return $this->result;
}
function set_total_rows( $rows ) {
$this->total_rows = $rows;
}
function get_total_rows() {
return $this->total_rows;
}
function set_fetched_rows( $rows ) {
$this->fetched_rows = $rows;
}
function get_fetched_rows() {
return $this->fetched_rows;
}
function increment_fetched_rows() {
$this->fetched_rows = $this->fetched_rows + 1;
}
}
function sql_connect($host, $user, $password, $db)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db);
return $dbi;
break;;
case "mSQL":
$dbi=msql_connect($host);
msql_select_db($db);
return $dbi;
break;;
case "postgres":
$dbi=@pg_connect("host=$host user=$user password=$password port=5432 dbname=$db");
return $dbi;
break;;
case "postgres_local":
$dbi=@pg_connect("user=$user password=$password dbname=$db");
return $dbi;
break;;
case "ODBC":
$dbi=@odbc_connect($db,$user,$password);
return $dbi;
break;;
case "ODBC_Adabas":
$dbi=@odbc_connect($host.":".$db,$user,$password);
return $dbi;
break;;
case "Interbase":
$dbi=@ibase_connect($host.":".$db,$user,$password);
return $dbi;
break;;
case "Sybase":
$dbi=@sybase_connect($host, $user, $password);
sybase_select_db($db,$dbi);
return $dbi;
break;;
default:
break;;
}
}
function sql_logout($id)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
$dbi=@mysql_close($id);
return $dbi;
break;;
case "mSQL":
$dbi=@msql_close($id);
return $dbi;
break;;
case "postgres":
case "postgres_local":
$dbi=@pg_close($id);
return $dbi;
break;;
case "ODBC":
case "ODBC_Adabas":
$dbi=@odbc_close($id);
return $dbi;
break;;
case "Interbase":
$dbi=@ibase_close($id);
return $dbi;
break;;
case "Sybase":
$dbi=@sybase_close($id);
return $dbi;
break;;
default:
break;;
}
}
/*
* sql_query($query, $id)
* executes an SQL statement, returns a result identifier
*/
function sql_query($query, $id)
{
global $dbtype;
global $sql_debug;
$sql_debug = 0;
if($sql_debug) echo "SQL query: ".str_replace(",",", ",$query)."<BR>";
switch ($dbtype) {
case "MySQL":
$res=@mysql_query($query, $id);
return $res;
break;;
case "mSQL":
$res=@msql_query($query, $id);
return $res;
break;;
case "postgres":
case "postgres_local":
$res=pg_exec($id,$query);
$result_set = new ResultSet;
$result_set->set_result( $res );
$result_set->set_total_rows( sql_num_rows( $result_set ) );
$result_set->set_fetched_rows( 0 );
return $result_set;
break;;
case "ODBC":
case "ODBC_Adabas":
$res=@odbc_exec($id,$query);
return $res;
break;;
case "Interbase":
$res=@ibase_query($id,$query);
return $res;
break;;
case "Sybase":
$res=@sybase_query($query, $id);
return $res;
break;;
default:
break;;
}
}
/*
* sql_num_rows($res)
* given a result identifier, returns the number of affected rows
*/
function sql_num_rows($res)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
@$rows=mysql_num_rows($res);
return $rows;
break;;
case "mSQL":
$rows=msql_num_rows($res);
return $rows;
break;;
case "postgres":
case "postgres_local":
$rows=pg_numrows( $res->get_result() );
return $rows;
break;;
case "ODBC":
case "ODBC_Adabas":
$rows=odbc_num_rows($res);
return $rows;
break;;
case "Interbase":
echo "<BR>Error! PHP dosen't support ibase_numrows!<BR>";
return $rows;
break;;
case "Sybase":
$rows=sybase_num_rows($res);
return $rows;
break;;
default:
break;;
}
}
/*
* sql_fetch_row(&$res,$row)
* given a result identifier, returns an array with the resulting row
* Needs also a row number for compatibility with postgres
*/
function sql_fetch_row(&$res, $nr=0)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
$row = mysql_fetch_row($res);
return $row;
break;;
case "mSQL":
$row = msql_fetch_row($res);
return $row;
break;;
case "postgres":
case "postgres_local":
if ( $res->get_total_rows() > $res->get_fetched_rows() ) {
$row = pg_fetch_row($res->get_result(), $res->get_fetched_rows() );
$res->increment_fetched_rows();
return $row;
} else {
return false;
}
break;;
case "ODBC":
case "ODBC_Adabas":
$row = array();
$cols = odbc_fetch_into($res, $nr, $row);
return $row;
break;;
case "Interbase":
$row = ibase_fetch_row($res);
return $row;
break;;
case "Sybase":
$row = sybase_fetch_row($res);
return $row;
break;;
default:
break;;
}
}
/*
* sql_fetch_array($res,$row)
* given a result identifier, returns an associative array
* with the resulting row using field names as keys.
* Needs also a row number for compatibility with postgres.
*/
function sql_fetch_array(&$res, $nr=0)
{
global $dbtype;
switch ($dbtype)
{
case "MySQL":
$row = array();
#ausgeblendet am 03.05.2006 weil fehlermeldung kam - stefan petri
@$row = mysql_fetch_array($res);
return $row;
break;;
case "mSQL":
$row = array();
$row = msql_fetch_array($res);
return $row;
break;;
case "postgres":
case "postgres_local":
if( $res->get_total_rows() > $res->get_fetched_rows() ) {
$row = array();
$row = pg_fetch_array($res->get_result(), $res->get_fetched_rows() );
$res->increment_fetched_rows();
return $row;
} else {
return false;
}
break;;
/*
* ODBC doesn't have a native _fetch_array(), so we have to
* use a trick. Beware: this might cause HUGE loads!
*/
case "ODBC":
$row = array();
$result = array();
$result = odbc_fetch_row($res, $nr);
$nf = odbc_num_fields($res); /* Field numbering starts at 1 */
for($count=1; $count < $nf+1; $count++)
{
$field_name = odbc_field_name($res, $count);
$field_value = odbc_result($res, $field_name);
$row[$field_name] = $field_value;
}
return $row;
break;;
case "ODBC_Adabas":
$row = array();
$result = array();
$result = odbc_fetch_row($res, $nr);
$nf = count($result)+2; /* Field numbering starts at 1 */
for($count=1; $count < $nf; $count++) {
$field_name = odbc_field_name($res, $count);
$field_value = odbc_result($res, $field_name);
$row[$field_name] = $field_value;
}
return $row;
break;;
case "Interbase":
$orow=ibase_fetch_object($res);
$row=get_object_vars($orow);
return $row;
break;;
case "Sybase":
$row = sybase_fetch_array($res);
return $row;
break;;
}
}
function sql_fetch_object(&$res, $nr=0)
{
global $dbtype;
switch ($dbtype)
{
case "MySQL":
$row = mysql_fetch_object($res);
if($row) return $row;
else return false;
break;;
case "mSQL":
$row = msql_fetch_object($res);
if($row) return $row;
else return false;
break;;
case "postgres":
case "postgres_local":
if( $res->get_total_rows() > $res->get_fetched_rows() ) {
$row = pg_fetch_object( $res->get_result(), $res->get_fetched_rows() );
$res->increment_fetched_rows();
if($row) return $row;
else return false;
} else {
return false;
}
break;;
case "ODBC":
$result = odbc_fetch_row($res, $nr);
if(!$result) return false;
$nf = odbc_num_fields($res); /* Field numbering starts at 1 */
for($count=1; $count < $nf+1; $count++)
{
$field_name = odbc_field_name($res, $count);
$field_value = odbc_result($res, $field_name);
$row->$field_name = $field_value;
}
return $row;
break;;
case "ODBC_Adabas":
$result = odbc_fetch_row($res, $nr);
if(!$result) return false;
$nf = count($result)+2; /* Field numbering starts at 1 */
for($count=1; $count < $nf; $count++) {
$field_name = odbc_field_name($res, $count);
$field_value = odbc_result($res, $field_name);
$row->$field_name = $field_value;
}
return $row;
break;;
case "Interbase":
$orow = ibase_fetch_object($res);
if($orow)
{
$arow=get_object_vars($orow);
while(list($name,$key)=each($arow))
{
$name=strtolower($name);
$row->$name=$key;
}
return $row;
}else return false;
break;;
case "Sybase":
$row = sybase_fetch_object($res);
return $row;
break;;
}
}
/*** Function Free Result for function free the memory ***/
function sql_free_result($res) {
global $dbtype;
switch ($dbtype) {
case "MySQL":
$row = mysql_free_result($res);
return $row;
break;;
case "mSQL":
$row = msql_free_result($res);
return $row;
break;;
case "postgres":
case "postgres_local":
$rows=pg_FreeResult( $res->get_result() );
return $rows;
break;;
case "ODBC":
case "ODBC_Adabas":
$rows=odbc_free_result($res);
return $rows;
break;;
case "Interbase":
echo "<BR>Error! PHP dosen't support ibase_numrows!<BR>";
return $rows;
break;;
case "Sybase":
$rows=sybase_free_result($res);
return $rows;
break;;
}
}
?>
Bin für jeden tipp sehr dankbar, weil woanders kann mir leider keiner helfen, und ihr macht das echt klasse. in zukunft werde ich für weitere projekte nur noch euer cms benutzen (bitte versucht aber möglichst schnell ein forum mit einzufügen, weil es sonst schwierig wird, das ich es überall nehmen kann). ansonsten 1a!
Zitatbitte versucht aber möglichst schnell ein forum mit einzufügen, weil es sonst schwierig wird, das ich es überall nehmen kann
Foren stehen doch 2 zur Auswahl.
Entweder das hier verwendete SMF in einer Vorabversion oder das mxBoard welches in den Downloads liegt ....
Hier die geänderte Connect-Funktion:
<?php
function sql_connect($host, $user, $password, $db)
{
global $dbtype, $dbi;
if (!is_resource($dbi) ) {
switch ($dbtype) {
case "MySQL":
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db);
return $dbi;
break;;
case "mSQL":
$dbi=msql_connect($host);
msql_select_db($db);
return $dbi;
break;;
case "postgres":
$dbi=@pg_connect("host=$host user=$user password=$password port=5432 dbname=$db");
return $dbi;
break;;
case "postgres_local":
$dbi=@pg_connect("user=$user password=$password dbname=$db");
return $dbi;
break;;
case "ODBC":
$dbi=@odbc_connect($db,$user,$password);
return $dbi;
break;;
case "ODBC_Adabas":
$dbi=@odbc_connect($host.":".$db,$user,$password);
return $dbi;
break;;
case "Interbase":
$dbi=@ibase_connect($host.":".$db,$user,$password);
return $dbi;
break;;
case "Sybase":
$dbi=@sybase_connect($host, $user, $password);
sybase_select_db($db,$dbi);
return $dbi;
break;;
default:
break;;
}
}
else
{
return $dbi;
}
}
?>
(Bitte ohne <?php und ?> kopieren ;) )
Ob es etwas bringt, kann ich allerdings nicht sagen
MfG
ich danke dir sehr. was für ein service! ich werde euch weiterempfehlen!
die funktion probiere ich morgen in ruhe aus.
oh zu den foren habe ich wohl nicht genau geschaut, habe nur das paket runtergeladen und darin kein forum gesehen. danke euch! euer cms hat zukunft wenn ihr so weitermacht! denn was ich da sehe ich eine ast reine programmierung und wenn und aber!
wenn ihr wollte, könnte ich mal für eure webseite werbung machen in unserer grafikzeitschrift von www.psd-tutorials.de (commag) ?