Skocz do zawartości

Call to undefined method


PawelC

Rekomendowane odpowiedzi

mam taki kod:

<?

class Sqli

{

private static $instance = false;

//Konstruktor

public function __construct()

{

self::$instance=new mysqli('localhost','root','','katalog');

}

static function instance()

{

if( !self::$instance )

{

self::$instance = new self;

}

return self::$instance;

}

public function getRow($query)

{

return Sqli::instance()->query($query)->fetch_object();

}

// Pobranie danych z bazy

public function getRows($query)

{

$dane=array();

$result=Sqli::instance()->query($this->query=$query);

while($wynik=$result->fetch_object()){

$data[]=$wynik;

}

return $data;

/* $rows=$sqli->getRows("select * from users");

foreach($rows as $row)

{

echo $row->log.' | '.$row->pass;

}

*/

}

//Dodawania wartości do bazy danych

public function insert($query)

{

$result=Sqli::instance()->query($query);

if($result===true)

{

echo "Dane zostały dodane do tabeli!";

}

else {

echo "Wystąpił błąd podczas dodawania danych do tabeli!";

}

}

// Aktualizacja danych w bazie

public function update($query)

{

$result=Sqli::instance()->query($query);

if($result===true)

{

echo "Dane zostały zaaktualizowane!";

}

else {

echo "Wystąpił błąd podczas aktualizowania danych!";

}

}

// Kasowania z bazy danych

public function delete($query)

{

$result=Sqli::instance()->query($query);

if($result===true)

{

echo "Dane zostały usunięte!";

}

else {

echo "Wystąpił błąd podczas usuwania danych!";

}

}

// Koniec klasy

}

$sqli = Sqli::instance();

?>

i niby wszystko ładnie pięknie, ale gdy chcę użyć np metody delete

require 'mysqli.class.php';

$sqli->delete("delete from users where log='admin'");

to wywala mi błąd:

Fatal error: Call to undefined method Sqli::query() in C:\wamp\www\mysqli\mysqli.class.php on line 91

Co jest nie tak? W klasie users gdzie dziedziczę klasę sqli wszystko działa dobrze, a w tej nie chce.

Odnośnik do komentarza
Udostępnij na innych stronach

W tym wypadku konstruktor powinien być prywatny co uniemożliwi stworzenie obiektu poza klasą operatorem new;

Konstruktor powinien mieć taką składnie:

	private $SQLI;
private static $instance = null;
private function __construct()
{
	$this->SQLI = new mysqli('localhost','xx','xxx','xxx_mycms');
	echo'__construct<br />';
}
public static function instance()
{
	if(self::$instance === null)
	{
		self::$instance = new Sqli;
	}
	return self::$instance;
}

Dostęp do metody guery:

public function delete($query)
{
///$result=Sqli::instance()->query($query); < ŹLE
$result = $this->SQLI->query($query);
if($result===true)
{
	echo "Dane zostały usunięte!";
}
else 
{
	echo "Wystąpił błąd podczas usuwania danych!";
}
}

W metodzie instance sprawdza się czy zmienna self::$instance na wartość null jeśli tak wywołujesz konstruktor własnej klasy new Sqli, jeśli zmienna self::$instance ma wartość inna niż null zwracasz ją. Czyli tak jaka działa wzorzec singleton.

I zgodnie z oczekiwaniem konstruktor zostanie wywołany tylko raz ;)

$sqli = Sqli::instance();

$sqli2 = Sqli::instance();

$sqli3 = Sqli::instance();

$sqli->insert("INSERT INTO test SET id=1,login='".time()."'");

$sqli2->insert("INSERT INTO test SET id=2,login='".time()."'");

$sqli3->insert("INSERT INTO test SET id=3,login='".time()."'");

out>

__construct

Dane zostały dodane do tabeli!Dane zostały dodane do tabeli!Dane zostały dodane do tabeli!

Możesz też z dziedziczeniem po klasie mysqli:

class MySql extends mysqli
{
private static $instance = NULL;

private function __construct()
{
	parent::__construct('localhost','xx','xxx','xxx_mycms');
	echo'parent::__construct<br />';
}

public function getinstance()
{
	if(self::$instance === null)
	{
		self::$instance = new MySql;
	}
	return self::$instance;
}

public function insert($query)
{

	$result = self::getinstance()->query($query);
	if($result===true)
	{
		echo "Dane zostały dodane do tabeli!";
	}
	else
	{
		echo "Wystąpił błąd podczas dodawania danych do tabeli!";
	}
}
}

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Niema to jak łopatologiczne wyjaśnienie :) Dzięki Mion za pomoc, niestety z tym problem nie mógł sobie poradzić nawet moderator z forum.php.pl ;) Teraz działa tak jak chciałem. Wyjaśniłeś to tak że niema szans żeby nie zrozumieć o co chodzi :D

Jeśli możesz to powiedz mi teraz jak mogę użyć metod z klasy mysqli w klasie user? Z tego co wiem dziedziczyć nie mogę, ponieważ klasa user nie rozszerza klasy mysqli, tak mi przynajmniej powiedzieli.

#edit

Staram się to zrobić na kilka sposobów np:

<?
require 'mysqli.class.php';

$db=Sqli::instance();

require 'user.class.php';
$user=User::getinstance();
$user->userLogin('asda','asdasd');
?>

I jakbym nie zrobił dostaje error

Fatal error: Call to undefined method Sqli::userLogin() in C:\wamp\www\mysqli\index.php on line 9

Niewiem czy dobrze zrobiłem, ale podejrzewam że raczej nie. No więc w klasie user dodałem konstruktor:

function __construct()
		{
		$this->SQLI = new mysqli('localhost','root','','katalog');

		}

I teraz jak tworzę obiekt i wywołuje metodę, tak:

require 'user.class.php';
$user=new User();
$user->userLogin('admin','marcin');

Bez dziedziczenia klasy mysqli. I działa wszystko dobrze, ale chodzi o to czy to jest dobrze zrobione? Bo zrobić na odwal to nie problem, a mi chodzi o to żeby zrobić to w taki sposób w jaki powinno być zrobione. Najważniejsze że klasa mysqli z singletonem działa tak jak powinna.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie znam zawartości kasy user.class.php. Poza tym po co Stosujesz singletow w klasie user $user=User::getinstance()? W klasie user i innych tego typu powinieneś wywoływać $db=Sqli::instance() i robić operacje na bazie w metodzie userLogin itd. Po to piszesz centralną klasę do obsługi bazy aby ją stosowanie wywoływać, a nie jakieś dodatkowe kombinacje robić... Projektowanie OOP bez pewności co się faktycznie pisze/stosuje i w jakim celu nie ma większego sensu.

Moja rada jest taka, że skorzystaj z gotowych rozwiązań MVC np Kohana, lub Zend Framework.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Moja rada jest taka, że skorzystaj z gotowych rozwiązań MVC np Kohana, lub Zend Framework.

Z chęcią bym z tego skorzystał, tylko dla mnie to tymbardziej czarna magia, nie znając podstaw OOP.

Kod klasu user.class.php

<?
	class User
	{		
		public $log;
		public $pass;	



		public function userLogin($log,$pass)
		{	

			$result=$this->SQLI->query("select log,pass from users where log='$log' and pass='$pass'");
			if(mysqli_num_rows($result)==0)
			{
				echo "brak takiego usera";
			}
			else
			{
				$_SESSION['zalogowany']="$log";
				header("Location: test.php");
			}
		}


		public function addUser($log,$pass)
		{

			$result=$this->SQLI->query("insert into users values('$log','$pass')");
			if($result===true)
			{
				echo "Użytkownik został dodany poprawnie.";
			}
			else
			{
				echo "Wystąpił błąd podczas dodawania nowego użytkownika!";
			}
		}

	}

i robię np:

$db=Sqli::instance();
$user=new User;
$user->userLogin('admin','admin');

I dostaję:

Notice: Undefined property: User::$SQLI in C:\wamp\www\mysqli\user.class.php on line 12

Fatal error: Call to a member function query() on a non-object in C:\wamp\www\mysqli\user.class.php on line 12

Na linii 12 czyli zapewne chodzi o to $this->SQLI

Odnośnik do komentarza
Udostępnij na innych stronach

Korzystanie z kohana to nie żadna czarna magia wręcz przeciwnie, bo nie interesują cię "wnętrzności" systemu, ale korzystanie z niego które jest bardziej proste niż się wydaje.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Tutaj masz odrobinę ogólnie o możliwościach w php: https://www.webinside.pl/php/artykuly/137

Poza tym piszesz przecież w cpp więc znając możliwości tego języka nie powinieneś mieć problemów z użyciem obiektów w php (po przyswojeniu właściwej książki/teorii).

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

W kohana w zależności od ustawień w plikach konfiguracyjnych, ale takim wypadku:

https://localhost/kohana/index.php/szukaj.php plik kontrolera np.

class Szukaj_Controller extends Template_Controller {} musi być zapisany w application/controllers/ względem pliku index.php jako szukaj.php i w nim zostanie wywołana metoda public function index() chyba, że w routerze ustawisz wywoływanie innego kontrolera/metody :D

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Już działa :D Ale ten framework wszystko ułatwia ;) Ale podstawy OOP muszą być, żeby wiedzieć co i jak :)

Jeszcze raz, wielkie dzięki Mion :)

względem pliku index.php jako szukaj.php i w nim zostanie wywołana metoda index.php chyba, że w routerze ustawisz wywoływanie innego kontrolera/metody

Właśnie zuważyłem, jak zrobię localhost/kohana/szukaj to wywoła metode index, czyli domyślną,

a jak dorzucę do adres np localhost/kohana/szukaj/add to wywoła metode add.

W życiu bym nie wpadł na to jak łatwo się towrzy kontroler i widok :D Wcześniej bez podstawowej wiedzy z zakresu OOP nie dałem rady. Tylko nie mogę pojąć o co chodzi z tymi modelami :D

Odnośnik do komentarza
Udostępnij na innych stronach

Do tego mamy jeszcze obsługę routingu czyli coś w stylu modrewrite z wyrażeń regularnych przy umiejętnym wykorzystaniu całkiem pomocne.

Jak korzystasz z localhot możesz zdefiniować sobie też subdomeny, a nawet "własne" domeny np domena.my :) obslugiwane lokalnie. W tym celu trzeba zrobić dwa wpisy wiecej...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Do tego mamy jeszcze obsługę routingu czyli coś w stylu modrewrite z wyrażeń regularnych przy umiejętnym wykorzystaniu całkiem pomocne.

O tym czytałem, nawet sprawdzałem parę przykładów. Ja stosuję standardowy czyli localhost/index.php/szukaj

Jak korzystasz z localhot możesz zdefiniować sobie też subdomeny, a nawet "własne" domeny np domena.my wink.gif obslugiwane lokalnie

Tak, korzystam z localhost, oczywiście sprawdzę to z domenami i subdomenami.

No więc testuje cały czas i wszystko mi wychodzi tak jak chcę, używanie bazy, filtrowanie itp, wszystko co jest. Stworzyć kontroler i widok potrafię, ale co to jest ten model? Nie znalazłem na jego temat żadnych konkretnych informacji,a już tym bardziej o tworzeniu i ogólnie korzystaniu z niego.

Odnośnik do komentarza
Udostępnij na innych stronach

Model obsługuje warstwę biznesową czyli zapytania do bazy danych. W sumie zapytania mnożna realizować też w kontrolerze, ale jeśli chcemy mieć całkowicie MVC robimy to w modelu. Model to nic innego jak php plik zapisany w katalogu: application/models/ np user.php bedzie zawierał wszystkie zapytania tyczce obsługi usera np:

<?php defined('SYSPATH') or die('No direct script access.');
class User_Model extends Model
{
public function __construct()
{
	parent::__construct();
}

public function setZliczLogowanie($id)
{
	 $this->db->query("UPDATE UserSite SET logowan=(logowan+1), ostatnio = NOW() WHERE id = $id LIMIT 1");
}
// I dalsze metody
}
?>

Wywołujesz w kontrolerze np:

public function logowanie()
{
$MyUser =  new User_Model();
// jakieś operacje od logowania i np
$MyUser->setZliczLogowanie($id);
}

Dane do połączenia z bazą danych definiujesz w pliku application/config/database.php

Jeste też obsługa OMR, i budowanie zapytań itd, itp, ale to nie jest topic o kohana wiec nie ma sensu się o tym tutaj rozpisywać :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Model obsługuje warstwę biznesową czyli zapytania do bazy danych.

Czyli rozumiem, że tylko zapytania do bazy?

[...] user.php bedzie zawierał wszystkie zapytania tyczce obsługi usera [...]

Czyli np zliczanie logowań, logowanie, wylogowanie itp

Dane do połączenia z bazą danych definiujesz w pliku application/config/database.php

To już mam za sobą ponieważ, bawiłem się już bazą danych w Kohanie.

Jeste też obsługa OMR, i budowanie zapytań itd, itp, ale to nie jest topic o kohana wiec nie ma sensu się o tym tutaj rozpisywać :)

Czytałem o tym i słyszałem, że lepiej stosować ORM, a o budowaniu zapytań czytałem w manualu. Fakt to nie temat o frameworku.

A co do wyglądu strony, style css gdzie są przechowywane? Normalnie w katalogu kohany?

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności