Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nieprawidłowy argument dla mysql_query
Forum PHP.pl > Forum > PHP > Object-oriented programming
Wojteq
Witam!
Jeśli wywołam poniższy kod z wnętrza klasy, dostanę następujący komunikat:
Cytat
supplied argument is not a valid MySQL result resource
Jeśli natomiast wykonam kod poza klasą (nieumieszczony w funcji), wszystko będzie działało poprawnie. W czym leży problem?
  1. <?php
  2. protected function mysql($query)
  3. {
  4. //$query = 'SELECT `subtitle` FROM `table` WHERE `id`=1';
  5. $sql_query = mysql_query('SELECT `subtitle` FROM `table` WHERE `id`=1');
  6. return $sql_array = mysql_fetch_array($sql_query, MYSQL_BOTH);
  7. }
  8. ?>
hwao
nie wiem w ktorej lini problem, ale jezeli w tej z mysql_query" title="Zobacz w manualu php" target="_manual() to dodaj res. od bazy danych.
M4chu
Może dodaj obsługę błędów i zobacz co wyświetliło. No i:
  1. <?php
  2. return $sql_array = mysql_fetch_array($sql_query, MYSQL_BOTH);
  3. ?>

questionmark.gif
To '$sql_array = ' jest przecież niepotrzebne.

----
Gorąco polecam zmianę nazw zmiennych i metody, na bardziej intuicyjne - metoda powinna, moim zdaniem, nazwać się query, a zmienna $sql_query, raczej $result (patrz: komunikat - MySQL result resource) smile.gif Ale to takie głupie gadanie, zrobisz jak chcesz, jednak moim zdaniem warto się nad tym zastanowić i następnym razem przyłożyć się do tego dla własnego i naszego dobra winksmiley.jpg
----
TomASS: $var = false; też zwroci true? ;>
TomASS
M4chu ma rację smile.gif Sprawdź też, czy ta metoda nie zwraca Ci zawsze True? (bo operator przypisania zawsze będzie dawał true)


--------edit--------------
Masz rację, mój bład. Jak dasz:
  1. <?php
  2.  
  3. return $zmienna=12;
  4. //zwroci wartosc 12
  5.  
  6. ?>


Wydało mi się to dziwne, z tego względu, że w logice operator przypisanaia zawsze będzie dawał wynik true, widocznie tak w php nie jest. Przepraszam bardzo za wprowadzenie w bład.
dr_bonzo
Cytat
(bo operator przypisania zawsze będzie dawał true)

Nie prawda, zwroci $sql_array.

Linia z bledem to ta z "return $sql_array = mysql_fetch_array($sql_query, MYSQL_BOTH);", php podaje, ze podano nieprawidlowy "result resource" -- wynik zapytania, czyli blad jest w mysql_query() -- pewnie, jak mowil hwao, nieokresliles polaczenia z baza, ani sie nie polaczyles z nia (nie widac tego w kodzie).
Rada: nie uzywaj domyslnego polaczenia z baza, tylko ZAWSZE przekazuj resource polaczenia do kazdej funkcji tego wymagajacej.
Wojteq
Z tymi nazwami zmiennych i funcji to rzeczywiście macie racje. Wybrałem trochę nieintuicyjne nazwy. Do bazy łączę się przez ten kod:
  1. <?php
  2. function __autoload()
  3.  {
  4. include('myslq_connect.php');
  5.  }
  6. ?>

Czy to może być problemem?
Jeśli tak, to czym to zastąpić oraz czy
  1. <?php
  2. return mysql_fetch_array($query, MYSQL_BOTH);
  3. ?>
będzie działało bez żadnego problemu?
M4chu
Cytat(Wojteq @ 2005-09-16 15:28:35)
Z tymi nazwami zmiennych i funcji to rzeczywiście macie racje. Wybrałem trochę nieintuicyjne nazwy. Do bazy łączę się przez ten kod:
  1. <?php
  2. function __autoload()
  3.  {
  4. include('myslq_connect.php');
  5.  }
  6. ?>

Czy to może być problemem?
Jeśli tak, to czym to zastąpić oraz czy
  1. <?php
  2. return mysql_fetch_array($query, MYSQL_BOTH);
  3. ?>
będzie działało bez żadnego problemu?

Prawde mowiac nawet nie wiedzialem, ze mozna tak z __autoload kozystac smile.gif Ja wole tak jak w manualu jest:
  1. <?php
  2. function __autoload($class) {
  3. require_once 'classes/' . $class . '.class.php';
  4. }
  5.  
  6. ?>

To zresztą nie ma znaczenia, jakbyś uważnie przeczytał posty przedmówców, to byś wiedział, że nie w tym rzecz smile.gif. Musisz do funckji mysql_query(manual!) przekazywać identyfikator połączenia zwrócony przez mysql_connect(). Czyli np (to samo w manualu znajdziesz tongue.gif):
  1. <?php
  2.  
  3. $connection = mysql_connect($host, $user, $pass) or die(mysql_error());
  4. mysql_select_db($db) or die(mysql_error($connection);
  5. if(!$result = mysql_query($query, $connection)) {
  6. die(mysql_error($connection));
  7. }
  8.  
  9. ?>

ehh rozpisalem sie tongue.gif
pozdro
Wojteq
OK. Dzięki za pomoc.

Mam jednak jeszcze jedno pytanie: podobno można stworzyć nowy obiekt łączący się z bazą za pomoćą
  1. <?php
  2. $dbc = mysqli_connect($host, $user, $pass);
  3. ?>

I z tym związane jest moje pytanie: jak wewnątrz klasy utworzyć nowy obiekt? Przez konstruktor czy przez funkcję, która będzie iniciowana przez konstruktor i czy istnieje jakiś sposób, aby nie pisać za każdym razem takich samych konstruktorów w podklasie, które znajdują się w nadklasie?
M4chu
Cytat(Wojteq @ 2005-09-21 21:17:24)
I z tym związane jest moje pytanie: jak wewnątrz klasy utworzyć nowy obiekt? Przez konstruktor czy przez funkcję, która będzie iniciowana przez konstruktor i czy istnieje jakiś sposób, aby nie pisać za każdym razem takich samych konstruktorów w podklasie, które znajdują się w nadklasie?

Zależy co rozumiesz pod pojęciem "utworzyć nowy obiekt wewnątrz klasy"? Co do takich samych konstruktorów w podklasie jak w nadklasie, to też nie rozumiem... mówisz o pod i nad klasach, a nie słyszałeś o dziedziczeniu?
Konkrety! smile.gif
Wojteq
Chodziło mi właśnie o dziedziczenie.

Czyli czy istnieje coś takiego jak 'dzedziczenie konstruktorów'. bo nie chcę w każdej klasie pisać identycznych konstruktorów, króre będą wykonywały te same operacje. Bo jeśli utowrzę klasę B, która będzie dziedziczyła od klasy A wszystkie zmiene i funkcje, a zestępowała jedną funkcję (np. display()). I po co w takiej sytuacji pisać nowy konstruktor?

A co do mysqli_connect() to chodzi mi o utworzenie obiektu który będzie się łączył (już wewnątrz klasy) i bazą danych.
mike
W klasie potomnej można co najwyżej wywołać konstruktor klasy bazowej:
  1. <?php
  2.  
  3. class A extends B
  4. {
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. }
  9.  
  10. // ...
  11. }
  12. ?>


Konstruktory nie są dziedziczone.
splatch
Zatem co wyświetli ten przykład?
  1. <?php
  2. class B {
  3. function __construct() {
  4. echo "B";
  5. }
  6. }
  7.  
  8. class A extends B { }
  9. $x = new A;
  10. ?>
dr_bonzo
Takie cos nie przejdzie:
  1. <?php
  2. function __autoload()
  3.  {
  4. include('myslq_connect.php');
  5.  }
  6. ?>


__autoload sluzy zupelnie do czego innego -> manual.
Dla tego nigdy ci nie uruchamialo tej funkcji.

Cytat
A co do mysqli_connect() to chodzi mi o utworzenie obiektu który będzie się łączył (już wewnątrz klasy) i bazą danych.


  1. <?php
  2.  
  3. class Klasa
  4. {
  5. private $db;
  6.  
  7. public function __construct()
  8. {
  9. $this->db = new mysqli( parametry polaczenia);
  10. // lub
  11. $this->db = mysqli_connect( ... );
  12. }
  13. }
  14.  
  15. ?>


W razie niepowodzenia zwracaja FALSE, ja uzywam mysqli_connect gdyz konstruktor nie powinien zwracac FALSE. Dalej korzystam z otrzymanego obiektu.
mike
Cytat(splatch @ 2005-09-22 09:16:41)
Zatem co wyświetli ten przykład?
  1. <?php
  2. class B {
  3. function __construct() {
  4. echo "B";
  5. }
  6. }
  7.  
  8. class A extends B { }
  9. $x = new A;
  10. ?>

  1. <?php
  2.  
  3. class B {
  4. function __construct() {
  5. echo "B";
  6. }
  7. }
  8.  
  9. class A extends B
  10. {
  11. public function __construct()
  12. {
  13. parent::__construct();
  14. }
  15. }
  16.  
  17. $a = new A();
  18.  
  19. ?>


Wynik:
Cytat
B
splatch
@mike_mech po co pisać taki kod, skoro działa krótszy:
  1. <?php
  2. class B {
  3. function __construct() {
  4. echo "B";
  5. }
  6. }
  7.  
  8. class A extends B { }
  9. $x = new A;
  10. ?>

To wyświetli samo B.
No i dodatkowo, gdyby konstruktory nie były dziedziczone jaki by był sens tworzyć konstruktory finalne?
  1. <?php
  2. class B {
  3. final function __construct() {
  4. echo "B";
  5. }
  6. }
  7.  
  8. class A extends B { }
  9. $x = new A;
  10. ?>
Wojteq
Dzięki za pomoc i wyjaśnienie. Właśnie o to mi chodziło. Mam jednak jeszcze jedno pytanie dotyczące wykonywania zapytań do bazy. Jakie parametry mam podać pod czas wykonywania zapytania przez mysqli_connect? Wystarczy sam string, czy muszę wcześniej podać w parametrach utworzony obiekt klasy mysqli?
mike
Cytat(Wojteq @ 2005-09-30 14:55:42)
Jakie parametry mam podać pod czas wykonywania zapytania przez mysqli_connect? Wystarczy sam string, czy muszę wcześniej podać w parametrach utworzony obiekt klasy mysqli?

No bez przesaday. My też się cieszymy że Ci pomogliśmy ale to już sam możesz sprawdzić: mysqli_connect(). Przkłady są bardzo przejrzyste.
Wojteq
Chodziło mi o funkcję mysqli_query a nie connect smile.gif
Bo tam przykłady nie są (przynajmniej dla mnie) zbyt oczywiste...

Chodzi mi o to, czy mogę użyć takiego zapisu wewnątrz klasy:
  1. <?php
  2. class Page
  3. {
  4.  protected $db;
  5.  function __construct()
  6.  {
  7.  $this->db = new mysqli('localhost', 'username', 'password', 'database');
  8.  $this->db->query('zapytanie'); // chodzi mi o to
  9. }
  10. }
  11. ?>
mike
No nie przesadzaj. Jak byk stoi w manualu:

Styl zorientowany obiektowo:
  1. <?php
  2.  
  3. $mysqli = new mysqli( 'localhost', 'user', 'pass', 'db' );
  4. $result = $mysqli->query( 'SELECT * FROM table' );
  5. // ...
  6.  
  7. ?>


Styl proceduralny:
  1. <?php
  2.  
  3. $link = mysqli_connect( 'localhost', 'user', 'pass', 'db' );
  4. $result = mysqli_query( $link, 'SELECT * FROM table' );
  5. // ...
  6.  
  7. ?>


Czego tu można nie zrozumieć :?:

A poza tym napisałeś sobie kod i co? Nawet nie sprawdziłeś czy zadziała.
Zawsze najlepiej empirycznie sprawdzić.
Wojteq
To co było w manualu raczej zrozumiałem zrozumiałem, ale co zrobić jeśli ten kod znajduje się wewnątrz klasy?
  1. <?php
  2.  
  3. class Page
  4. {
  5. protected $mysqli;
  6.  
  7. function __construct()
  8. {
  9. $this->mysqli = new mysqli( 'localhost', 'user', 'pass', 'db' );
  10. //$result = $mysqli->query( 'SELECT * FROM table' );
  11. // jak zrobić zapytanie w tym przypadku, bo należy użyć $this->mysqli 
  12. }
  13. }
  14. ?>
M4chu
No przeciez sam sobie dopowiedziales: $this->mysql->query ... Sorry ale momentami Cie nir rozumiem: zapis w klasie i poza nia sie w prawie niczym (dostep do pol i metod) nie rozni. No i jeszcze cos... nie zrozum mnie zle, ale czy Ty parsujesz te skrypty w glowie czy na komputerze?
Wojteq
To pytanie zadałem chyba niepotrzebnie, bo Zend pokazał mi błąd składni gdy napisałem $this->mysql->query, więc nie parsowałem już skryptu przez serwer, bo stwierdziłem, że to jednak jest błąd. Liczyłem, że Zend nie ma błędów, a jednak...

Sorry za to całe zamieszanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.