php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Anfänger frage: array einem Objekt zu weissen


 
Citycobra
03-06-2003, 17:07 
 
Hi erst mal,

ich versuche seit kurzem mit Kassen zu arbeiten, klabt ja auch soweit.

mein Problem ist nur das ich in der Klasse Date aus einer Datenbank mit mysql_fetch_array auslese.

wenn ich die daten mit $this->id $result[artikel_id]; zuweise klapt das zugreifen mit $artikel->id; ja auch nur müsste ich dann ca 25 verschiedene daten so zuweissen.

ich würde es aber viel lieger mit einer abfrage sofort im Objekt $artikel
$reinschreiben. var $artikel = array(); ich bekomme es aber einfach nicht hin.

ps: gesucht habe ich schon aber nichts gefunden...

 
CrazyPip
03-06-2003, 17:43 
 
warum musst du 25 ZUweiseungen machen?

geht das denn net einfach so?


$this->id = $result;


wenns net gehen sollte dann würde ich das per schleife machen


//vorher muss natürlich "var $artikel = array()" definiert sein

var $artikel = array();

for ($i=0;$i<=count($result);$i++)
{
array_push($this->artikel,$result($i));
}

// ungestestet


dann hast du alle WErte von $result in $this->artikel stehen, als Arrayso in der art sollte es eigentlich funktionieren

ich hoffe ich konnte helfen

cya CrazyPIp

 
Citycobra
03-06-2003, 18:10 
 
danke für die schnelle antwort, oben die sache war nur als beispiel gedacht, das ghanze ist eine function einer Klasse um die Userdaten eines angemeldeten users zu speichern.

aber leider funktioniert das so nicht ich bekomme immer die meldung Fatal error: Call to undefined function: array() in D:\www\index\class\class_user.php on line 105

der code ab sieht so aus :
function check_user($username,$password) {
global $sql, $p, $sid;
if(isset($username) && isset($password)) {
$result = $sql->query("SELECT * FROM hp_".$p."_user
WHERE username='".$username."' AND password='".$password."'");
$row = $sql->fetch_array($result);
for ($i=0;$i<=count($row);$i++) {
array_push($this->user,$row($i));
}
}
}

ach ja vie variable var $user = array() ist am anfang des Scripts initalisiert worden.

 
CrazyPip
03-06-2003, 18:26 
 
ich bin leider net bei mir @home und kanns deswegen nicht genau überprüfen:

ist die Funktion check_user eine seperate Funktion oder ist die Bestandteil einer KLasse?, denn du benützt einmal die Objektvariable $sql und dann benützt du $this ebenfalls. $this-> wird nur innerhalb einer KLasse benützt und $sql ist ein anderes Objekt (zugewiesen durch $sql = new ...)

ich bin mir ausserdem nicht sicher ob das mit der for-schleife überhaupt geht. Ich würds evtnl. mal so ausprobieren.


while ($sql->fetch_array($result))
{
array_push($this->user,$row($i));
}

 
Citycobra
03-06-2003, 18:31 
 
also die function ist aus der classe User.php wo sie auch aufgerufen wird.

die globalen Variablen $sql und $p sowie $sid sind Variabeln aus seperaten klassen. wobei $sid momentan keine rolle spielt weil sie nicht wirklich hier gebraucht wird.

 
CrazyPip
03-06-2003, 18:40 
 
ich weiss nicht ob das so einfach geht mit den globalen variablen....

$sql;

du willst eine Funktion aus dem Klassenobjekt $sql einfach in einer anderen Klasse (user klasse) verwenden indem du $sql einfach global "includest".

Das geht meines Wissens nicht so einfach. Wenn du eine Funktion einer anderen Klasse benützen willst, dann geht das nur durch vererbung - das könnte auch deine fehlermeldung hervorrufen, da der die funktion fetch_array() nicht kennt, da er nicht auf die andere Klasse so ohne weiteres zugreifen kann.

daran liegts wahrscheinlich...

http://www.dynamic-webpages.de/php/keyword.extends.php

lies dir das mal durch, das wird dir helfen ;)

cya CrazyPip

 
Citycobra
03-06-2003, 18:51 
 
das weis ich eben nicht weil ich noch neuling bin, was Klassen angeht, ich weiss nur das ich ein ergebnis bekomme wenn ich die Daten so aus der user Klasse aufruffe.

ich kann sie ja mit $this->user_id = $user['user_id']; in der user Klasse verfügbar machen und sie dann auch extern vom hauptscript mit
echo $user->user_id; am bildschirm ausgeben, darum wudere ich mich ja darüber das ich es nicht anders hinbekomme.

Naja gelessen hab ich das, nur leider noch nicht so ganz verstanden, oder wo finde ich mal ein konkrete Beispiele wie ich mit extend die andere Klassen einbindet.

 
CrazyPip
03-06-2003, 19:04 
 
wenn

var user_id;

gesetzt wurde, dann kannst du dieser variable natürlich einen Wert zuweisen. Und dann hast du auch diesen Wert als $this->user_id innerhalb der aktuellen Klasse und kannst diesen auch in allen Funktionen innerhalb der aktuellen klasse verwenden. Nicht aber in anderen Klassen oder ausserhalb der KLasse.

Ausserhalb der Klasse geht das nur, indem du ein Objekt erstellst:

$user = new user;

jetzt rufst du eine Funktion der Klasse so auf:

$user->function(1,"irgendwas",...);

(es gibt zwra noch mehrere Möglichkeiten eine Funktion unabhängig von der KLasse aufzurufen, aber dies sei jetzt mal dahingestellt)

Cya CrazyPip

p.s.: lies dir mal den link durch den ich dir gegeben hatte. Dort gibt es ausser extends auch noch alles andere zu OOB in kurzer Fassung.

 
Citycobra
03-06-2003, 19:09 
 
nein , das geht auch ohne var $user_id.

das Original script sieht am anfang so aus:
class user {
var $user = array();
var $error = 0;

var $isadmin = 0;
var $ismod = 0;
var $ismember = 0;

var $groupname = "Gäste";
var $permission = 0;


function user() {
global $sid;
if(!isset($_SESSION['guest'])){
if(isset($_cookie['username']) && isset($_cookie['password'])) {
if(!isset($_SESSION['username']) && !isset($_SESSION['password'])) {
$user = $user = $this->check_user($_cookie['username'],$_cookie['password']);
}
elseif($_SESSION['username'] != $_cookie['username'] || $_SESSION['password'] != $_cookie['password']) {
$user = $this->check_user($_cookie['username'],$_cookie['password']);
} else {
$username = $this->pw_crypt("hi div", $_SESSION['username'],"de");
$user = $this->check_user($username,$_SESSION['password']);
}
}
elseif(isset($_SESSION['username']) && isset($_SESSION['password'])) {
$username = $this->pw_crypt("hi div", $_SESSION['username'],"de");
$user = $this->check_user($username,$_SESSION['password']);
} else {
$sid->set_var("guest", 1);
}
if ($this->error == 0){
if ($user['group_id'] == 1){
$this->ismember = 1;
$this->groupname = "Mitglied";
$this->permission = $user['permission'];
}
elseif ($user['group_id'] == 2){
$this->ismod = 1;
$this->groupname = "Moderator";
$this->permission = $user['permission'];
}
elseif ($user['group_id'] == 3){
$this->isadmin = 1;
$this->groupname = "Administrator";
$this->permission = $user['permission'];
}

$this->user_id = $user['user_id'];
$this->registred = $user['registred'];
$this->username = $user['username'];
$this->password = $user['password'];
$this->vorname = $user['vorname'];
$this->name = $user['name'];
$this->template = $user['usertemplate'];
$this->savecookie = $user['savecookie'];
$this->exptime = $user['exptime'];
$this->news_read = $user['news_read'];
}

}
return $user;
}
und so lassen sich auch die Daten abfragen, sogar das einlogen funktioniert einwandfrei. so das ich mir meine Userdaten anzeigen lasse, nur muss ich sie in der function user seperat zu weissen was natürlich den Code aufbläht.

hab ich schon gelessen, siehe oben, komme aber nicht so ganz klar damit.

was ich ja gar nicht verstehe ist das ich ja einen array() $user habe, aber ihn nicht als diesn nutzen kann.

 
Citycobra
03-06-2003, 19:20 
 
achja und hie mal zum vergleich die Original function check_user()
function check_user($username,$password) {
global $sql, $p, $sid;
if(isset($username) && isset($password)) {
$user = $sql->query_first("SELECT * FROM hp_".$p."_user WHERE username='".$username."' AND password='".$password."'");
if ($user['user_id'] != 0){
$permission = $this->permission($user['permission']);
$this->error = 0;
} else {
$this->error = 2;
}
} else {
$this->error = 1;
}
return $user;
}

 
CrazyPip
03-06-2003, 19:28 
 
zwei sachen sind mir unschlüssig:
einmal:


} else {
$sid->set_var("guest", 1);
}


das dürfte die Fehlermeldung verursachen.

-
und das hier:
-

die letzte if - else geschichte wo du die ganzen $this->user_id; mit werten fütterst. Meines Wissens sind die Variablen die du am Anfang definierst mit

var...
var...
var...

usw

global für alle Funktionen innerhalb der Klasse. Diese Variablen spricht man mit $this-> an. Ich weiss nicht welche auswirkung es hat, wenn man nun einfach in einer funktion weitere $this-> Variablen erstellt...ich sehe darin ausserdem auch keinen Sinn - aber das sei nun mal ausser acht gelassen. Wenn du sowieso nur den $user-array zurückgibst, dann bringt doch die Zuweisung $this->user_id = $user['id']; gar nichts...

da sollte sich hier mal ein Spezialist ins Sachen OOB mal melden! :teach:

cya CrazyPIp

 
Citycobra
03-06-2003, 19:37 
 
zu 1: alsi diese funktion ist nur die session Variable auf Gast = 1,
die function ist schon länger drin und hat keine auswirkungen auf das Script im ganzen wird aber auch nur gesetzt wenn das resultat user = 0 ist.

wie Du aber auch leicht festellen kannt wird die session guest am anfang abgeragt, so wird die nächste abfrage schon gleich abgebrochen. früher kann ich sie nicht setzen da es sonst nie bis zu cookie abfrage kommt.

zu 2: das ermöglicht mir die userdaten extern anzuzeigen, weil ich ja eben das Problem habe das den $user array() nicht auf die Var $user vererben kann. funktioniert aber auch ohne fehler. Ohne dies $this->.... könnte ich sie wieder nicht aufrufen. der aufruff sieht dan einfach so aus $user->user_id usw.

Diese Variablen hatte ich aber für deine ideen eben extra auskomentiert. so das die auch keine auswirkungen haben konnten.

 
CrazyPip
03-06-2003, 19:57 
 
*keuch*

bei so einer Hitze hier zu denken ist schwer gg - sobald ich zu Hause bin versuche ich mal das alles hier zu rekonstruieren, da ein paar Sachen nicht in mein Kopf wollen...zum Beispiel das mit dem $sid: warum diese Variable, die von aussen kommt(!) eine Funktion zugewiesen bekommt...da tut sich bei mir grad ein echtes logisches Problem auf! :eek:

aber eins ist mir grad eben noch aufgefallen:

du hast am anfang

var user;

und am ende hast du return $user;

sind das beabsichtigt zwei verschiedene Variablen ($user != $this->user;) ...?

 
CrazyPip
03-06-2003, 20:03 
 
ausserdem ist mir grad noch was aufgefallen:


<?php
/* Keine wird in PHP 4 funktionieren */
class Cart
{
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("VCR", "TV");
}

/* So sollte es gemacht werden */
class Cart
{
var $todays_date;
var $name;
var $owner;
var $items;

function Cart()
{
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* etc. . . */
}
}
?>

auszug aus http://www.dynamic-webpages.de/php/language.oop.php


also geht das mit dem array() in var $user gar nicht...

gleich feierabend ;) *freu* ich mach mich auf den WEg

cya CrazyPip

 
Citycobra
03-06-2003, 20:04 
 
also zu $sid: $sid ist wieder eine andere Klasse, die aber nur benutzt wird um session zu setzen, das kann man aber auch leicht hier einbauen, wäre also kein grosser ackt, da die funktion ja nur genau 4 mal genutzt wird,

1 für den gast auf 1 einzustellen ( also session_register();)
2 für den session_unset('guest'); wenn das login erfolgreich war und dann zum setzten der Usernamen und Password in sessions.

das mit dem return $user; kann egentlich raus weil ja bis auf die (seltsamen) $this->user_id Variablen ... alles andere in den var´s oben gepeichert wird. ist bei mir sogar schon raus.

na dann schönen Feieraben, ich muss zum wochenende arbeiten :( dafür hab ich heute frei.

das versteh ich jetzt aber gar nicht, ich hab das in schon einigen scripten gesehen.

 
CrazyPip
03-06-2003, 20:37 
 
hi

das mit dem $user und return user ist mir nun klar...

du holst alle Userdaten aus einer DB und machst daraus ein Array, welches du dann zurückgibst, nachdem du die Daten mit den Cookie Daten verglichen und ausgewertet hast.

soweit so gut!

Dein Ausgangsproblem war ja das (ob $sql hin oder her), dass du die Daten in einem Array haben willst, welches du dann zurückgeben kannst...
Dies sollte das Array "var $user = array();" sein.

Lösche diese Zeile ( var $user = array(); ) und mach es doch eifnach so:


$bla = mysql_fetch_array($result);
return $bla;


nun hast du alle WErte der Variablen in $bla ausserhalb der Klassen
oder war das nicht das Problem...hab inzwischen irgendwie den überblick verloren...:cool:

cya CrazyPip

 
Citycobra
03-06-2003, 20:53 
 
das mit der Übergabe funktioniert aber leider nicht mit return $user usw.
dann bekomme kein ergbniss zurück :(.

ich hab es auch schon so versucht

var $user = "";

function user(){

blablabla......


$this->user = array(
'user_is' => '".$user[user_id]."',
usw......
);

aber irgentwie bin ich zu blöd, das seltsamste daran ist wohl wenn ich das this-> vor dem user werg mache bekomme ich noch ni9cht mal mehr die anderen Variablen angezeit die vorher noch da waren :(

ich bin schon fast so weit das ich die User class als einfache functionen machen werde.

 
CrazyPip
03-06-2003, 21:22 
 
hi nochmal,

ich habe grade ebenfalls eine Klasse geschrieben um die übergabe aus einer KLasse zu rekonstruieren:



<?

class test {
//unwichtige Variablen
var $dbserver = "localhost";
var $dbname = "forum";
var $dbuser = "pip";
var $dbpass = "";

// Wichtige Variable
var $user;

function test() {
$global = mysql_connect($this->dbserver,$this->dbuser,$this->dbpass) or die ("Konnte keine Verbindung zur Datenbank herstellen");
$select = mysql_select_db($this->dbname) or die("Unable to select database");
}

function get($user) {
$query = mysql_query("SELECT * FROM com_user where username = '$user'");

$get = mysql_fetch_array($query);

return $get;
}

}

// Klasse wird initialisert
$t = new test;
// Funktion wird aufgerufen
$s = $t->get("crazypip");
// Inhalte des Arrays werden ausgegeben
echo implode("<br>",$s);

?>



Hier funktioniert die Übergabe aus der funktion get() mehr oder weniger ohne Probleme - denn bis auf das, dass der mir aus irgendeinem GRund immer alle Werte aus der DB zweimal in mein Array steckt funktioniert das Ganze.

ich weiss net warum das bei dir nicht funktioniert...kannst du vielleicht mal die Datei als Anhang an einen post hängen, oder mir schicken(crazypip@gmx.net)? ich würde mich das gerne mal anschaun - vielleicht verstehe ich dann auch die sache mit dem $sql

cya CrazyPip

 
mrhappiness
03-06-2003, 21:24 
 
Original geschrieben von CrazyPip
Hier funktioniert die Übergabe aus der funktion get() mehr oder weniger ohne Probleme - denn bis auf das, dass der mir aus irgendeinem GRund immer alle Werte aus der DB zweimal in mein Array steckt funktioniert das Ganze.schau mal im manual zu mysql_fetch_array (http://www.php.net/manual/de/function.mysql-fetch-array.php) hilft dir das weiter?

ebenfalls interressant könnten mysql_fetch_assoc (http://www.php.net/manual/de/function.mysql-fetch-assoc.php) und mysql_fetch_row (http://www.php.net/manual/de/function.mysql-fetch-row.php) sein

 
CrazyPip
03-06-2003, 21:31 
 
ok danke


...
function get($user) {
$query = mysql_query("SELECT * FROM com_user where username = '$user'");

$get = mysql_fetch_row($query);

return $get;
}
...


und was mir noch aufgefallen ist:

var $test = array(); ist doch erlaubt! sorry :rolleyes:

 
Citycobra
03-06-2003, 21:45 
 
also danke ( 1000 mal danke,) der fehler kag gar nicht im cod der class :(

ich hatte in der index.php versucht die klasse sofort mit
$user = new user(); zu initaliesieren.

das war ab falsch darum bekamm ich auch keine resultate.

jetzt sieht es so aus

$ud = new user;
$user = $ud->user();

und schon geht es das hatte ich total übersehen, weil ich den fehler in der classe gesucht habe. wo ich aber deinen cod gesehen habe ist es mir aufgefallen.

nachmals danke.

 
CrazyPip
03-06-2003, 21:52 
 
gg :D

cya CrazyPip


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:35 Uhr.