Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nieprawidłowe użycie mysql_fetch_array()
Forum PHP.pl > Forum > PHP
pytak2
  1. <?php
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5.    <title>Jakaś testowa strona</title>
  6.    <meta http-equiv="content-type" content="text/html;charset=utf-8">
  7.    <link rel="stylesheet" type="text/css" href="style.css" media="all">
  8. </head>
  9. <body>
  10.    <div id="page">
  11.        <form method="get" action="index2.php">
  12.            <label>Wpisz zapytanie</label>
  13.            <input type="text" name="query">
  14.            <input type="submit" value="wykonaj zapytanie">
  15.        </form>
  16.    </div>
  17. </body>
  18. </html>
  19. ?>


  1. <?php  
  2.  
  3.    require_once('class.db.php');
  4.    
  5.    echo $_GET['query'];
  6.    
  7.    $obj=new database();
  8.    $sqlResult=$obj->_mysql_query($_GET['query']);
  9.    
  10.    echo $sqlResult;
  11.    
  12.    $aaa=$obj->_mysql_fetch_array($sqlResult);
  13.    
  14. ?>


  1. <?php
  2.  
  3. class database {
  4.    protected
  5.        $host=  'localhost',
  6.        $db=    'baza',
  7.        $login= 'root',
  8.        $pass=  '',
  9.        $error=array('Nie nawiązano połaczenia z bazą danych.',
  10.                     'Nie wybrano bazy danych.',
  11.                     'Nie udało się wykonać zapytania do bazy danych.',
  12.                     'Funkcja mysql_fetch_array() nie została wykonana.');
  13.    
  14.    public function __construct() {
  15.        @mysql_connect($this->host, $this->login, $this->pass) or die($this->error[0]);    
  16.        @mysql_select_db($this->db) or die($this->error[1]);        
  17.    }
  18.    
  19.    public function _mysql_query($query) {
  20.        return @mysql_query($query) or die($this->error[2]);
  21.    }
  22.    
  23.    public function _mysql_fetch_array($sqlResult) {
  24.        return @mysql_fetch_array($sqlResult) or die($this->error[3]);
  25.    }
  26. }
  27.  
  28. ?>

Jako wynik dostaję:
  1. <?php
  2. select * from tabela;1
  3. Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in D:ProgramyWAMPwwwclass.db.php on line 24
  4. Funkcja mysql_fetch_array() nie zostaĹ&#65533;a wykonana.
  5. ?>

Jak powinienem użyć powyższej funkcji?
nospor
  1. <?php
  2. public function _mysql_query($query) {
  3. $zm = mysql_query($query) or die($this->error[2]);      
  4. return $zm;
  5.   }
  6. ?>

przenosze. z obiektowką ma to sredni związek
pytak2
Przepraszam za zdublowanie tematu ale myślałem, że został usunięty mimo nie naruszenia regulaminu. Wracając do tematu. Jak powinna wyglądać metoda _mysql_fetch_array() żeby pobierała wyniki z bazy i umieszczała je w tablicy? A może trzeba coś innego zmodyfikować?
nospor
no analogicznie jak ci poprawilem mysql_query....

  1. <?php
  2. public function _mysql_fetch_array($sqlResult) {
  3.       $zm = mysql_fetch_array($sqlResult);
  4. return $zm;
  5.   }
  6. ?>

Wywalilem te die() bo akurat przy fetch bylo zbedne
pytak2
- Dlaczego zbędne?
- Dlaczego trzeba pisać:
  1. <?php
  2. $zm = @mysql_query($query) or die($this->error[2]);      
  3. return zm;
  4. ?>

i
  1. <?php
  2. $zm = mysql_fetch_array($sqlResult);
  3. return $zm;
  4. ?>

Zamiast:
  1. <?php
  2. return @mysql_query($query) or die($this->error[2])
  3. ?>

i
  1. <?php
  2. return mysql_fetch_array($sqlResult);
  3. ?>

Czym to sie różni i dlaczego pierwsze 2 zapisy działają drugie 2 już nie?
nospor
Cytat
Dlaczego zbędne?
bo mysql_fetch_array ma prawo zwrocic false, gdy nie ma rekordow i die() tam nei moze byc, bo false w mysql_fetch_array() to prawidlowy stan. Co innego w mysql_query(). Tam false to blad wiec die( ) moze byc

Cytat
Dlaczego trzeba pisać:
Chodzi o kolejnosc wykonywania operatorow

dla
return cos or cos
zostanie najpierw wykonane cos or cos i wynik tego zwrocony. czyli zawsze to bedzie wartosc logiczna. w twoim przypadku oczekiwales wyniku mysql_query a nie wartosci logicznej, wiec musiales dac to przed return, gdyz
$zm = cos or cos
najpierw wykona sie $zm = cos a dopiero potem, gdy $zm bedzie false, wykona sie or cos

Troche zawile, ale banalne winksmiley.jpg
pytak2
To wcale nie jest zawiłe. Bardzo dobrze to wytlumaczyleś. Czyli reasumując (trochę po Twojemu) jeżeli używam warunku logicznego to muszę rezultat przypisać do zmiennej a potem ją zwrócić a gdy go nie ma to już nie trzeba przypisywać do zmiennej tylko od razu zwrócić wwynik? Jak powinno wyglądać poprawne wywołanie metody _mysql_fetch_array() i pobranie danych z bazy w pliku index2.php?
nospor
Cytat
To wcale nie jest zawiłe. Bardzo dobrze to wytlumaczyleś. Czyli reasumując (trochę po Twojemu) jeżeli używam warunku logicznego to muszę rezultat przypisać do zmiennej a potem ją zwrócić a gdy go nie ma to już nie trzeba przypisywać do zmiennej tylko od razu zwrócić wwynik?
Jakbym dobrze wytlumaczyl to bys nie pytal ponownie o to samo winksmiley.jpg
.. or die( ) sluzy do przerwania aplikacji i wywalenia bledu na ekran, gdy mysql_query() zwroci false. Nie mozna tej konstrukcji dac w return, bo jak mowilem, return potraktuje cale to wyrazenie jako warunek logiczny i zwroci nam wynik logiczny a nie wynik mysql_query.
Ta sama konstrukcja przy przypisywaniu do zmiennej daje to, ze najpierw jest przypisanie do zmiennej wyniku mysql_query, a dopiero potem jesli mysql_query dalo false, wykonanie "or die()"

Cytat
Jak powinno wyglądać poprawne wywołanie metody _mysql_fetch_array() i pobranie danych z bazy w pliku index2.php?
Bardzo podobnie do tego napisanego w manualu smile.gif
http://pl.php.net/manual/pl/function.mysql-fetch-array.php
pytak2
Cytat("nospor")
Jakbym dobrze wytlumaczyl to bys nie pytal ponownie o to samo winksmiley.jpg
.. or die( ) sluzy do przerwania aplikacji i wywalenia bledu na ekran, gdy mysql_query() zwroci false. Nie mozna tej konstrukcji dac w return, bo jak mowilem, return potraktuje cale to wyrazenie jako warunek logiczny i zwroci nam wynik logiczny a nie wynik mysql_query.
Ta sama konstrukcja przy przypisywaniu do zmiennej daje to, ze najpierw jest przypisanie do zmiennej wyniku mysql_query, a dopiero potem jesli mysql_query dalo false, wykonanie "or die()"

Pytalem dla pewności ale teraz już jestem pewny.

Cytat("nospor")
Bardzo podobnie do tego napisanego w manualu smile.gif
http://pl.php.net/manual/pl/function.mysql-fetch-array.php

Zrobilem tak:
  1. <?php
  2. $obj=new database();    
  3.    
  4.    $result = $obj->_mysql_query($_GET['query']);
  5.    
  6.    while ($row = mysql_fetch_array($result)) {
  7.        echo $row[0], $row[1], $row[2];
  8.        echo "<br>";
  9.    }
  10.    mysql_free_result($result);
  11. ?>

- Według Ciebie dobrze czy źle?
- Po co jest to mysql_free_result() ?
- Za pomocą return zwracam zmienną $sqlResult
  1. <?php
  2. public function _mysql_query($query) {
  3.        $sqlResult = @mysql_query($query) or die($this->error[2]);      
  4.        return $sqlResult;
  5.      }
  6. ?>

To później mimo wszystko podczas wywołania tej metody muszę przypisać jej rezultat do zmiennej:
  1. <?php
  2. $result = $obj->_mysql_query($_GET['query']);
  3. ?>

Dlazego?
nospor
Cytat
Według Ciebie dobrze czy źle?
A dziala? No to dobrze winksmiley.jpg
A powaznie: no źle. Skoro masz mysql_fetch_array() w obiekcie to masz korzystac z tego z obiektu smile.gif

Cytat
Po co jest to mysql_free_result()
A po co jest manual w ktorym to jest napisane?

Cytat
Za pomocą return zwracam zmienną $sqlResult.To później mimo wszystko podczas wywołania tej metody muszę przypisać jej rezultat do zmienne.Dlaczego?
Bo nie zapisales tej zmiennej jako wlasciwosci klasy no i musisz ją gdziesz trzymac. mysql_fetch_array() wymaga tej zmiennej
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.