php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 3,00 durchschnittlich.
Alt 13.08.2008, 04:02  
Neuer Benutzer
 
Registriert seit: 12.08.2008
Beiträge: 8
dable befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Gültigkeit von Variablen innerhalb von Funktionen

Hallo,
folgender Code funktioniert im Hauptteil meiner Seite (index.php) ganz wunderbar
PHP-Code:
  $query "Eine SQL-Query halt";
  
$sql = new Query($query);
  while (
$row $sql->fetch()) {
    ...
  } 
Derselbe Code verursacht innerhalb einer Funktion in der Datei functions.php, welche per include in die index.php eingefügt wird, folgende Fehlermeldung:

Notice: Undefined variable: sql in C:\wamp\www\ht\functions.php on line 177

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\ht\functions.php on line 177

Wieso ist innerhalb der Funktion die Variable $sql in der while-Schleife nicht definiert? Und wie kann ich das Problem lösen?
Die include Anweisung der Klasse "Query" steht vor der include Anweisung von funcions.php.
dable ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.08.2008, 04:23  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von dable Beitrag anzeigen
Wieso ist innerhalb der Funktion die Variable $sql in der while-Schleife nicht definiert?
Weil Funktionen einen eigenen Namensraum für Variablen haben und der globale Namensraum anders als zum Beispiel bei C nicht automatisch importiert wird.
Du kannst der Funktion die Variable als Parameter übergeben.
PHP-Code:
<?php
function foo($bar) {
  echo 
$bar;
}

$x 'Zeit: '.date('d.m.Y');
foo($x);
Eine SQL Abfrage kann übrigens immer fehlschlagen. Deshalb musst Du das Ergebnis der Abfrage auch immer kontrollieren, bevor Du mit weiteren Datenbankaktionen weiter machst. Dein Code hätte also nachdem die Abfrage fehlgeschlagen ist nicht mehr $sql->fetch() ausführen dürfen.

Geändert von David (13.08.2008 um 04:25 Uhr).
David ist offline  
Alt 13.08.2008, 05:06  
ElPresidente
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von dable Beitrag anzeigen
Hallo,
folgender Code funktioniert im Hauptteil meiner Seite (index.php) ganz wunderbar
PHP-Code:
  $query "Eine SQL-Query halt";
  
$sql = new Query($query);
  while (
$row $sql->fetch()) {
    ...
  } 
Derselbe Code verursacht innerhalb einer Funktion [..] folgende Fehlermeldung
Das kann nicht stimmen.
 
Alt 13.08.2008, 13:59  
Neuer Benutzer
 
Registriert seit: 12.08.2008
Beiträge: 8
dable befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Eine SQL Abfrage kann übrigens immer fehlschlagen. Deshalb musst Du das Ergebnis der Abfrage auch immer kontrollieren, bevor Du mit weiteren Datenbankaktionen weiter machst.
Die Fehlerüberprüfung übernimmt bei mir der Konstruktor.

Ich habe nochmal probiert den Inhalt der Funktion in die entspechende Stelle im Code reinzukopieren, statt die Funktion aufzurufen. Siehe da, es geht auch so nicht. Also muss es an etwas anderem liegen.
Was mir aufgefallen ist, dass ich im Hauptprogramm folgende Struktur habe:
PHP-Code:
$query "Eine SQL-Query halt";
$sql = new Query($query);
while (
$row $sql->fetch()) {
  
//Hier wird jetzt die Funktion aufgerufen
  //es steht hier drin also quasi
  
$query2 "Zweite Query, die was anderes macht";
  
$sql2 = new Query($query2);
  while (
$row2 $sql2->fetch()) { //Hier kommt jetzt der Fehler
    
...
  }

Kann die Verschachtelung das Problem sein?
dable ist offline  
Alt 13.08.2008, 14:04  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Verschachtelte SQL-Queries sind zwar unschön und in den seltensten Fällen sinnvoll/nötig aber gehen tut es.

Welcher Fehler kommt im aktuellen Beispiel? Wie sieht die Klasse Query aus? Wie sieht der wirkliche Code aus?
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 13.08.2008, 14:05  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nochmal ganz langsam für dich:
Wenn du $sql = new Query($query); AUßERHALB der Funktion steht ist die Variable respektive das Objekt IN der Funktion nicht verfügbar.
Um das Problem zu umgehen kannst du, wie schon sehr gut beschrieben, das Objekt der Funktion übergeben.
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 13.08.2008, 14:07  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Siehe da, es geht auch so nicht.
- Geht nicht. Was sollen wir mit dieser Funktion anfangen
- Debuggen: $sql.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 13.08.2008, 14:17  
Neuer Benutzer
 
Registriert seit: 12.08.2008
Beiträge: 8
dable befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von agrajag Beitrag anzeigen
Verschachtelte SQL-Queries sind zwar unschön und in den seltensten Fällen sinnvoll/nötig aber gehen tut es.

Welcher Fehler kommt im aktuellen Beispiel? Wie sieht die Klasse Query aus? Wie sieht der wirkliche Code aus?
Also ist zwar viel Text, aber ich kopiere jetzt mal das gesamt Skript hier rein:

Datei: players.php
PHP-Code:
<?php

  
include "inc/config.php";
  include 
"functions.php";

  
$title="Player Overview";
  
  
$main "<P id=sub_navigation>
    <A HREF='players.php?show=players'> Players </A> |
    <A HREF='players.php?show=sold'> Sold Players </A> |
    <A HREF='players.php?show=all'> All Players </A> |
  </P>"
;
  
  
$main .= "<TABLE>
    <TR>
      <TD>#</TD>
      <TD>Name</TD>
      <TD>Special</TD>
      <TD>Nation</TD>
      <TD>Years</TD>
      <TD>Days</TD>
      <TD>Stamina</TD>
      <TD>PM</TD>
      <TD>WI</TD>
      <TD>SC</TD>
      <TD>GK</TD>
      <TD>PS</TD>
      <TD>DF</TD>
      <TD>SP</TD>
    </TR>"
;

  
$query "SELECT player.*,transfer.date FROM player
    INNER JOIN transfer
    ON transfer.player_id = player.id
    WHERE transfer.transfer_type=0
    ORDER BY name;"
;
  
$count=1;
  
$allowed "";
  
$all_allowed "";
  
$sql = new Query($query);
  while (
$row $sql->fetch()) {
    
$sold Check_Player_Sold($row['id']);
    if (isset(
$_REQUEST['show'])) {
     switch (
$_REQUEST['show'])  {
     case 
'players': {
       
$allowed=false;
       break;
     }
     case 
'sold': {
       
$allowed=true;
       break;
     }
     case 
'all': {
       
$all_allowed=true;
     }
     }
    }
    if((
$sold==$allowed) or ($all_allowed==true)){
      
$age Get_Age_Today($row['years'],$row['days'],$row['date']);
      
    
$skills =  Get_Player_Skills($row['id']);

    
$main .= "<TR>
        <TD>$count</TD>
        <TD>$row[name]</TD>
        <TD>$row[special]</TD>
        <TD>"
.Nation::Get_Name($row['nationality'])."</TD>
        <TD>$age[0]</TD>
        <TD>$age[1]</TD>"
;
      for (
$n=0;$n<8;$n++) {
        
$main .= "<TD>$skills[$n]</TD>";
      }

      
$main .= "<TD><A HREF='view_player.php?id=$row[id]'>view</A></TD>
        <TD><A HREF='edit_player.php?id=$row[id]'>edit</A></TD>
        <TD><A HREF='sell.php?id=$row[id]'>sell</A></TD></TR>"
;
      
$count++;
    }
  }
  unset(
$sql);
  
  
$main .= "</TABLE>";

  
$template="template.html";
  
$temp Read_Template($template);
  
$temp preg_replace("/--TITLE--/m",$title,$temp);
  
$temp preg_replace("/--MAIN--/m",$main,$temp);
  echo 
$temp;

?>
Datei: inc/config.php
PHP-Code:
<?php

    error_reporting 
(E_ALL E_STRICT);

    
define('MYSQL_HOST',     'localhost');
    
define('MYSQL_USER',     'root');
    
define('MYSQL_PASS',     '');
    
define('MYSQL_DATABASE''hattrick');
    
    @
mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die("Es konnte keine Verbindung aufgebaut werden");
    
mysql_select_db(MYSQL_DATABASE) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
    
// MySQL-Queries mit UTF-8 Zeichensatz zulassen
    
mysql_query"SET NAMES 'utf8'" );
    
    
date_default_timezone_set("Europe/Berlin");
    
    include(
'class_mysql.php');
    include(
'class_nation.php');
?>
Klasse class_mysql.php:
PHP-Code:
<?php
    
class Query
    
{
        private 
$_sql "";
        private 
$_result 0;
        private 
$_errno 0;
        private 
$_error "";

        public function 
__construct($sql)
        {
            
// Query in der Klasse speichern
            
$this->_sql trim($sql);
            
$this->_result mysql_query($this->_sql);
            if(!
$this->_result) {
                
$this->_errno mysql_errno();
                
$this->_error mysql_error();
                die(
$this->getError());
            }
        }

        function 
error()
        {
            
// Result-ID in einer tmp-Variablen speichern
            
$tmp $this->_result;
            
// Variable in boolean umwandeln
            
$tmp = (bool)$tmp;
            
// Variable invertieren und zurückgeben
            
return !$tmp;
        }

        function 
getError()
        {
            if(
$this->error()) {
                
$str  "Anfrage:\n".$this->_sql."<BR>\n";
                
$str .= "Antwort:\n".$this->_error."<BR>\n";
                
$str .= "Fehlercode: ".$this->_errno;
            } else {
                
$str "Kein Fehler aufgetreten.";
            }
            return 
$str;
        }

        function 
fetch()
        {
            if(
$this->error()) {
                echo 
"Es trat ein Fehler auf. Bitte überprüfen sie ihr\n";
                echo 
"MySQL-Query:<BR>".$this->_sql."\n";
                
$return null;
            } else {
                
$return mysql_fetch_assoc($this->_result);
            }
            return 
$return;
        }

        function 
numRows()
        {
            if(
$this->error()) {
                
$return = -1;
            } else {
                
$return mysql_num_rows($this->_result);
            }
            return 
$return;
        }

        public function 
__deconstruct()
        {
            
// Speicher freimachen
            
mysql_free_result($this->_result);
        }
    }
?>
Und schliesslich der Ausschnitt aus
functions.php
PHP-Code:
...
function 
Get_Player_Skills($player_id) {
  
//Get Start-Skill Date
  
$query="SELECT skills.date
    FROM skills
    INNER JOIN player
    ON player.start_skills_id=skills.id
    WHERE player.id=$player_id;"
;
  
$sql = new Query($query);
  
$row $sql->fetch();
  unset(
$sql);
  
$start_skill_date $row['date'];
  
$newest_date=$start_skill_date;
  
  
//Get newest Training Date
  
$query2="SELECT *
    FROM training
    WHERE player_id=$player_id
    ORDER BY date DESC
    LIMIT 1;"
;
    
  
$sql2 = new Query($query2);
  
//var_dump($sql2);
//Jetzt kommt Zeile 176
  
while ($row_training $sql2->fetch()) { //Line 176
  //$row_training = $sqle->fetch();
    //var_dump($row_training);
    
if ($row_training['date'] > $newest_date) {
      
$newest_date $row_training['date'];
      
$training_date true;
  }
  unset(
$sql2);
  }
  
  
//Get Start Skills
  
$query="SELECT skills.*
    FROM skills
    INNER JOIN player
    ON player.start_skills_id=skills.id
    WHERE player.id=$player_id;"
;
  
$sql = new Query($query);
  
$row $sql->fetch();
  
//var_dump($row);
  
unset($sql);
  
$skills = array($row['stamina'],$row['playmaking'],$row['winger'],
    
$row['scoring'],$row['goalkeeping'],$row['passing'],$row['defending'],
    
$row['set_pieces']);

  
// Hat Training nach Aufnahme erhalten
  
if (isset($training_date)) {
    
//Welcher Skill, wieviel Training
    
$age Get_Age($row_training['player_id'],$row_training['date']);
    
$age_factor pow(1.045,$age[0]-17);
    
$skill_height_factor 1;
    
$trainer_factor 1;
    
$assistants_factor 1;
    
$intensity_factor =  100 $row_training['intensity'];
    
$stamina_factor =  / ($row_training['stamina']/100);
    
$BASE_LENGTH = array(3.7,5.5,3.8,6.33,5.2,8.67,6.1,12.2,4.5,5.29);
    
$base_length_factor $BASE_LENGTH[$row_training['skill']];
    
    
$training_length=$age_factor*$skill_height_factor*$trainer_factor
     
*$assistants_factor*$intensity_factor*$stamina_factor*$base_length_factor;
     
    
// Subskill hinzufügen
   
$skills[5] += 1/$training_length;
  }

  return 
$skills;

}
... 
Fehlermeldung:

Notice: Undefined variable: sql2 in C:\wamp\www\ht\functions.php on line 176

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\ht\functions.php on line 176

Vielleicht sieht ja jemand von euch das Problem...

Geändert von dable (13.08.2008 um 14:33 Uhr).
dable ist offline  
Alt 13.08.2008, 14:22  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Was steht in Zeile 176?
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 13.08.2008, 14:22  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Entweder musst du die entsprechenden Zeilen markieren oder den gesamten Quellcode posten - sonst ist es unmöglich die betreffenden Zeilen zu finden.
In ceiner functions.php gibt es kein $sqle (das nicht auskommentiert ist), das kann also nicht der echt Code sein, den du verwendest. Und mit "Phantasiecode" kann man nichts anfangen.

Und wenn die Zeile in echt nicht auskommentiert ist: Woher kommt "$sqle"? Es ist nirgendwo definiert. Vertippt und $sql2 gemeint?

Und was soll das unset($sql2) - so hast du im zweiten Schleifendurchlauf natürlich kein Objekt mehr in $sql2 stehen (gut ok, die Abfrage ist LIMIT 1, aber wozu dann überhaupt eine Schleife?)
__________________
Today you...Tomorrow me.

Geändert von agrajag (13.08.2008 um 14:26 Uhr).
agrajag ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Klasse statt globaler Variablen ecomeback PHP-Fortgeschrittene 6 15.07.2008 16:30
Templatesystem mit Funktionen und Variablen drin? BartTheDevil89 PHP Tipps 2008 6 01.07.2008 09:32
Variablen von Funktionen außerhalb nutzen Wing PHP Tipps 2008 5 28.09.2007 17:05
unerklärliches Leeren von Variablen KuShi PHP Tipps 2007 2 08.07.2007 15:19
Teil einer Variablen mit einer Variablen ersetzen ? simsalabim PHP Tipps 2007 11 20.03.2007 20:36
grundlegendes zu funktionen LP PHP Tipps 2006 3 17.10.2006 12:08
Funktionen überprüfen und Grafik Funktionen hans.karl2 PHP Tipps 2006 10 31.07.2006 20:08
Problem mit Global Scope von Funktionen WickedImp PHP-Fortgeschrittene 13 16.05.2006 00:30
Gültigkeit von Variablen PHP Tipps 2006 2 08.02.2006 10:35
[Erledigt] Auswertung von Funktionen innerhalb von Strings PHP Tipps 2006 5 30.01.2006 14:03
innerhalb heredoc wert einer Variablen zuweiden rudolfs PHP Tipps 2006 5 17.01.2006 20:07
Variablen übergeben innerhalb zwei php-Dateien PHP Tipps 2005 2 24.02.2005 14:15
Variablen übergeben bzw. auslesen? PHP Tipps 2005 4 30.01.2005 03:56
POST Variablen auf Gültigkeit prüfen Ypsillon PHP Tipps 2005 22 24.01.2005 21:59
Funktionen auslagern und auf variablen zugreifen Crypi PHP Tipps 2004 3 14.10.2004 13:43

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
transfer von variablen function c, php variablen gültigkeit, php gültigkeit von variablen, php variable gültigkeit, http://www.php.de/php-tipps-2008/46679-erledigt-gueltigkeit-von-variablen-innerhalb-von-funktionen.html, php gültigkeit variablen, php include gültigkeit, php gültigkeitsdauer variable, variablen in while, call to a member function newquery() on a non-object in, php g, php gültigkeit variable, php define gültigkeit, fatal error: call to a member function newquery() on a non-object, gültigkeit von variablen php, variablen gültigkeit php, php variablengültigkeit, php funktionsvariable in verschachtelter funktion, php define in variable, php skillen funktion

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:51 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum