Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Nieprawidłowy argument dla mysql_query
Wojteq
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
hwao
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




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.
Go to the top of the page
+Quote Post
M4chu
post
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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? ;>
Go to the top of the page
+Quote Post
TomASS
post
Post #4





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


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.

Ten post edytował TomASS 16.09.2005, 14:44:48


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wojteq
post
Post #6





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
M4chu
post
Post #7





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Wojteq
post
Post #8





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
M4chu
post
Post #9





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Wojteq
post
Post #10





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mike
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
splatch
post
Post #12





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował splatch 22.09.2005, 08:17:11


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
mike
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
splatch
post
Post #15





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@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. ?>


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Wojteq
post
Post #16





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
mike
post
Post #17





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Wojteq
post
Post #18





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Wojteq 30.09.2005, 17:31:07
Go to the top of the page
+Quote Post
mike
post
Post #19





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
Wojteq
post
Post #20





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 29.03.2005

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Wojteq 30.09.2005, 18:47:26
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 11:13