Mysql --> Query nimmt während einer Schleife andere Wert an

  • Themenstarter Themenstarter ByeBye 8492
  • Beginndatum Beginndatum
B

ByeBye 8492

Moinsen,

bin immer noch dabei mein CMS zu schreiben :).
Leider habe ich nun ein weiteres Problem.
Also ich habe das CMS ja in Blöcken aufgebaut, diese Blöcke werden mittels einer Funktion (Block() ) ausgelesen.

Nun gut, das klappt ja auch perfekt, allerdings sobald ich zum Beispiel einen Block aus einer Datei einlese ( zum Beispiel Login.php ( Name steht in der DB drinne und wird dann per include "login.php" reingeholt), da das schlecht in ner DB ist ;) ).

sieht praktisch so aus:
<?php
global $db, $prefix;

$sql = "select * from ........";
$db -> query($sql);

?>

Das klappt aber nicht :(, dann liest er zwar alles aus, aber die Blöcke die danach kommen, liest er nicht mehr aus ( ich lese immer eine ganze Seite aus (links, rechts, mitte).

Ich muss immer erst hinschreiben

<?php
global $db, $prefix;
$dc = $db;
$sql = "select * from ........";
$db -> query($sql);
$db = $dc;
?>

Ich muss nur diese beiden Sachen hinschreiben, dann geht es, aber warum geht es ohne diese nicht, das ist nen Problem, weil ich die Querys zählen will und auch sonst ist es nicht schön für den Code, denn dieser wird dadurch nen bisschen unübersichtlich.

Hoffe Ihr könnt mir helfen
 
hi,

Hast du zuvor ein Objekt der Klasse DB instanziiert?
ich denke mal du hast das Objekt $db instanziiert.
Die Methode query(String) gibt dir ein Array zurück, also ->
$meinarray = $db->query(String);

Ich versteh aber ehrlich gesagt dein Problem auch gar nicht, sonst würd ich dir gerne helfen.

Kannst mir ja mal deinen Quelltext schicken, dann kann ich dir besser helfen.

greetz
l|N
 
Original geschrieben von LordNikkon
hi,

Hast du zuvor ein Objekt der Klasse DB instanziiert?
ich denke mal du hast das Objekt $db instanziiert.
Die Methode query(String) gibt dir ein Array zurück, also ->
$meinarray = $db->query(String);

Ich versteh aber ehrlich gesagt dein Problem auch gar nicht, sonst würd ich dir gerne helfen.

Kannst mir ja mal deinen Quelltext schicken, dann kann ich dir besser helfen.

greetz
l|N

Moinsen,

natürlich habe ich das Object instanziiert ( in der main.php ), von der Methode query() gibt es nocheine, fetch_array() ( durch die hole ich die Daten).
Dies ist aber eher untwichtig, da das Problem ist, das ich die Restlichen Blöcke einfach nicht ausgelesen kriege.

Hier mal der Generelle Ablauf der Datei ( main.php)

whilte(
block(seite)
--> check ob file oder nicht, wenn nicht dann ausgabe --> render
--> wenn File, dann
blockfileinc--render
)
Das ist ja wie gesagt ne Schleife, damit ich alle Blöcke zum Beispiel von Rechts ausgelesen kriege, aber sobald da ein Block mit Seite drinne ist, wo ich auf die Datenbank zugreifen muss, klappt das System nicht mehr und das auslesen hört bei dem Block auf, bei welchem MySQL zum Einsatz kam.
 
soll ich sonst mal nen Screenshot posten um es zu veranschaulichen, was ich meine?
 
So hier sind 2 Screenshots:

Richtig:

http://www.optima-design.de/labil.jpg

Falsch:
http://www.optima-design.de/labil_prob.jpg

achja und noch der betreffende Quellcode:
PHP:
function blockfile($title, $blockfile, $side = 0)  // falls der Block auf eine Blockdatei aufbaut ;)
{

	$file = @file("block/$blockfile");
	if(!$file)
	{
		$content = _blocknot;		// Wenn was schiefläuft ( Date nicht da, etc. dann einfach nen Fehler ausspucken)
	}
	else
	{
		include "block/$blockfile"; // wenn keiner Fehler passiert, die Datei inkludieren
	}


PHP:
block_login:
<?php
global $db, $prefix, $user;
$dc = $db;

$gäste		 	= $db -> num_rows($db -> query("select * from ". $prefix ."_online where `gast` = '1'"));
$member			= $db -> num_rows($db -> query("select * from ". $prefix ."_online where `gast` = '0'"));
$gesamt		 	= $member + $gäste;
$db = $dc;
$content			= "<center>". _on ."". $gäste ."" ._guest ."". $member ."". _member ."";


if(!is_user($user)){
$content 	   .= "<br><br>". _anonym ."</center>";
}

?>

Das müsste nach meinem Menschenverstand doch eigentlich funktionieren oder nicht?

Aso ja und nach der Funktion bricht er auch ab:
block_link, das ist ne Funktion, ähnlich nem Template Parser, die wird in die Renderblock funktion geschalten und durchsucht den Block noch nach links, bevor er endgütlig gerendert wird, hier kommen 2 SQL Queries zum Einsatz und es geht auch nicht ohne dieses Work-Around :(.
 
hi,
also irgendwie verwirrt mich dein problem ein wenig, aber ich glaube ich habs nun kapiert.

Ich denke mal es liegt an dem $db, hast ud das vorher irgendwo schon mal auf der Seite verwendet?
Weil in deinem Block definierst du es als global und wenn du das vorher schon mal getan hast killt er sich. Lass das global am besten mal weg und versuche es.
Du solltest es auch noch einmal so probieren:


PHP:
function blockfile($title, $blockfile, $side = 0,$db)  // falls der Block auf eine Blockdatei aufbaut <img src="images/smilies/wink.gif" border="0" alt=""> 
{ 

    $file = @file("block/$blockfile"); 
    if(!$file) 
    { 
        $content = _blocknot;        // Wenn was schiefläuft ( Date nicht da, etc. dann einfach nen Fehler ausspucken) 
    } 
    else 
    { 
        include "block/$blockfile"; // wenn keiner Fehler passiert, die Datei inkludieren 
    }

Beachte das das $db Objekt in deine Funktion übergeben wird, denn mit der Gültigkeit der Objekte in PHP ist es nicht weit hin.
Du hast es zwar sicher in deiner main Methode als global definiert, aber in der Funktion ist es vielleicht nicht mehr sichtbar.
Wenn du das nämlich übergibst ist es auf jeden Fall auch in der include Datei verfügbar!

greetz
l|N

PS: sorry für die langer antwortzeit...bin grad ein wenig im stress!
 
<?php



Moinsen,

seit dem Update auf PHP 5 ist das Problem nun wieder eminent und ich will es ein für allemale
eliminieren!

Hier ist mal der Source
PHP:
function block($side, $db){
global $admin, $user, $prefix;

$side[0] = strtolower($side[0]); 		// wir wollen ja nur Blocks von der richtigen Seite haben, gell?
$position = $side[0];					// weist der Variable Position die Koordinaten zu, damit sie richtig agieren kann

$sql		= "select * from ". $prefix ."_block where side = '$position' and active = 1 order by weight asc";
$db 		-> query($sql);
for($i=0; $i < $db -> num_rows(); $i++)
{
// hier sind die ganzen Results dann ....
		if($adminblock){    // ruft den Adminblock bei Bedarf auf :)
				if(is_admin($admin)){
				$block = render_block($title, $content, $side, $weight, $blockfile, $db);
				}
		}
		else
		{
				$block = render_block($title, $content, $side, $weight, $blockfile, $db);
		} 
}
return $block;
}
dort wird wie Ihr sehen könnt, die Blockinformationen aus der Datenbank ausgelesen.

PHP:
function render_block($topic, $content, $side, $weight, $blockfile, $db){  // diese Funktion erfüllt den Sinn des "Blöcke rendern", ist damit also lebensnotwendig

if($blockfile == "") //Wenn keine Blockdatei angegeben ist, fortfahren
{
	$content			= 		block_link($content);
	
	if($side == "c"){
		$template	= gettemplate("center_box");
	}
	elseif($side == "d"){
		$template	= gettemplate("center_box");
	}
	else{
		$template	= gettemplate("box");

	}
// Wandeln wir mal die ganzen Blöcke in Templates um :)
eval ("\$template = \"$template\";");

}
else		// wenn doch, dann einfach die Blockdateifunktion starten
{
	if($side == "c"){
		$template .= blockfile($topic, $blockfile,1, $db);
	}
	elseif($side == "d"){
		$template .= blockfile($topic, $blockfile, 2, $db);
	} 
	else{
		$template .= blockfile($topic, $blockfile, 0, $db);
	}
}

return $template;
}
Hier wird der Code weiterverarbeitet und an die zuständigen Instanzen geschickt.
Interessieren tut die "Blockfile".
PHP:
function blockfile($topic, $blockfile, $side = 0, $db)  // falls der Block auf eine Blockdatei aufbaut ;)
{
	$file = @file("block/$blockfile");
	if(!$file)
	{
		$content = _blocknot;		// Wenn was schiefläuft ( Data nicht da, etc. dann einfach nen Fehler ausspucken)
	}
	else
	{
		include "block/$blockfile"; // wenn keiner Fehler passiert, die Datei inkludieren
	}
	if($content == ""){
		$content = _blockempty;
	}
	Else{
		if($side == "1"){
			$template	= gettemplate("center_box");
		}
		elseif($side == "2"){
			$template	= gettemplate("center_box");
		}
		else{
			$template	= gettemplate("box");
		}
	}
			$template .= eval ("\$template = \"$template\";");
return $template;
}

Tja, wenn hier jetzt ein Block mit einer Datei ist, in welcher auf die Datenbank zugegriffen werden muss, dann geht es nicht :(.
Eine normale Textdatei wird aber weiterhin normal angezeigt!

PHP:
/********************************************************
* Der Modulanzeigblock									*
* Hier werden alle Module im Menüangezeigt, damit sie	*
* bei Bedarf rauszulesen sind :D						*
* ******************************************************/

global $user, $admin, $prefix;
// Bauen wir mal eine Liste auf über die Module
// zuerst suchen wir uns das Mainmodul

$sql			= "select * from ". $prefix ."_main";
$db 			-> 	query($sql);
$result			= $db -> fetch_array();
$mainmodule		= $result[main_module];

Warum klappt das nicht?
Was muss ich hinschreiben, dass es klappt?

Achso, ich verwende eine MySQL-KLasse, diese ist im Aufbau und Grundfunktion so ähnlich wie die aus den Tutorials.
 
Ich kann deinen Beschreibungen zwar immer noch nicht genau folgen, tippe aber stark auf ein Problem mit deiner selbstentwickelten MySQL-Klasse. Deren Code wäre hier vielleicht noch ganz interessant.
 
PHP:
class mysql{

			//benötigt zum connecten:
			var  $benutzer	 	= "";
			var	 $pass		 	= "";
			var  $server	 	= "";
			var  $datenbank		= "";

			
			//numerische Variablen
			var  $query_c	 	= 0;
			var  $query_id 		= 0;
			var  $link_id  		= 0;
			var  $aff_rows 		= 0;
			var  $num 			= 0;
			
			//query stuff für die Ausgabe
			var $record 	 	= "";
		
			
			function connect() {
							 $this -> link_id =  @mysql_connect($this->server, $this->benutzer, $this->pass);
							 if(!$this->link_id) {
							 			echo "Konnte nicht authorisiert werden"; }
							 if($this->datenbank != "") {
							 			$this->select_db($this -> datenbank);
										}
							 } 
		 
		 function select_db($datenbank) {
		 			if($this -> datenbank != "") {
									 $this -> datenbank = $datenbank;
				  }
					if(!@mysql_select_db($this -> datenbank, $this -> link_id)){
																		 		echo "Verbindung zur Datenbank ".$this->datenbank.", konnte nicht hergestellt werden";
								}
					
					}

function query($query){
				 	$this -> query_id = @mysql_query($query, $this->link_id);
					$this -> query_c++;
					if(!$this ->query_id) {
										echo "Der Query <i>$query</i> konnte nicht ausgeführt werden";
					}
					$this -> aff_rows =@mysql_affected_rows($this->query_id);
					return $this->query_id;
}
 Ich glaube genau, hier liegt der Fehler, das die Query_Id nicht richtig verarbeitet wird und das sich dadurch die Queries verheddern
function fetch_array($query_id = -1) {
				 if($query_id != -1)
				 {
				 		$this -> query_id = $query_id;
				 }
				 $this -> record = mysql_fetch_array($this-> query_id);
				 return $this -> record;
}

function fetch_row($query_id = -1) {
				 if($query_id != -1) {
				 							$this -> query_id = $query_id;
				 }
				 $this -> record = mysql_fetch_row($this-> query_id);
				 return $this -> record;
}
function num_rows($query_id = -1){
				if($query_id !=-1){
											$this -> query_id = $query_id;
				}
				$this -> num = mysql_num_rows($this -> query_id);
				return $this -> num;
}

function stats()
{
				 echo $this -> query_c; 
				 
}
}

/*************************************************************
* Übergibt die MYSQL Variablen an die Klasse, wird so gemacht*
* bis ich eine andere Möglichkeit gefunden habe				 *
*************************************************************/
$db = &new mysql;					
$db -> benutzer		= $benutzer;
$db -> pass 		= $pass;
$db -> server 		= $server;
$db -> datenbank 	= $datenbank;
$db -> connect();

Das ist meine Datenbankklasse, sehr einfach gehalten ;), aber zu mehr bin ich noch nicht fähig ;), müsste nich da nochma ransetzen aber das CMS hat ne höhrer Prioriät ;).
 
Zuletzt bearbeitet von einem Moderator:
Zurück