Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Błąd mysql_fetch_assoc() expects parameter 1 to be resource, null given in
Forum PHP.pl > Forum > Przedszkole
kecajs
Witam,
walczę z pewnym kodem i wyskakuje mi taki właśnie błąd: mysql_fetch_assoc() expects parameter 1 to be resource, null given in ścieżka on line 47.
Kod ten ma za zadanie wyciągnąć z bazy tylko dane jednego artykułu, na podstawie zmiennej LacznikID.
Oto kod strony pokaz.php, odpowiedzialnej za wyświetlanie tychże danych.
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
  2. <head>
  3. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  4. <link rel="stylesheet" href="style.css" type="text/css">
  5. </head>
  6.  
  7. <body>
  8.  
  9. <h1><center>Szczegóły asortymentu</center></h1><br>
  10.  
  11. <table border="1" width="90%" align=center cellpadding=2>
  12. <tr>
  13. <td width="20" class="table_small">Lp</td>
  14. <td width="130" class="table_small">Nazwa</td>
  15. <td width="40" class="table_small">Materiał</td>
  16. <td width="60" class="table_small">Dostawca</td>
  17. <td width="60" class="table_small">Producent</td>
  18. <td width="50" class="table_small">Lokacja</td>
  19. <td width="40" class="table_small">Waga</td>
  20. <td width="40" class="table_small">Stan</td>
  21. </tr>
  22. <?php
  23. include_once ("db_con.php");
  24. $connection = dbconn::instance();
  25.  
  26. // tutaj wywolanie zapytania do bazy
  27. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  28. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);
  29. $wynik = $connection->query('
  30. SELECT
  31. LacznikID,
  32. Nazwa,
  33. Material,
  34. DostawcaID,
  35. ProducentID,
  36. Lokacja,
  37. Waga,
  38. Stan
  39. FROM
  40. tb_laczniki_main
  41. WHERE
  42. LacznikID='.$tut_nr
  43. );
  44. }
  45.  
  46. while ($r = mysql_fetch_assoc($wynik)) {
  47. echo '<tr>';
  48. echo '<td width="20" class="table_small">' . $r['LacznikID'] . '</td>';
  49. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  50. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  51. echo '<td width="60" class="table_small">' . $r['DostawcaID'] . '</td>';
  52. echo '<td width="60" class="table_small">' . $r['ProducentID'] . '</td>';
  53. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  54. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  55. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  56. echo "</tr>";
  57. }
  58. ?>
  59. </table>
  60.  
  61. </body>
  62. </html>


Z kolei kod w pliku, z którego następuje wywołanie konkretnego artykułu wygląda tak.
  1. <!doctype html >
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-type" content="text/html;charset=utf-8">
  5. <link rel="stylesheet" href="style.css"/>
  6. </head>
  7.  
  8. <body>
  9. <center><strong>Zestawienie łączników</strong></center><br><br>
  10. <table border="1" width="90%" align=center cellpadding=2>
  11. <tr>
  12. <td width="20" class="table_small">Lp</td>
  13. <td width="130" class="table_small">Nazwa</td>
  14. <td width="40" class="table_small">Materiał</td>
  15. <td width="60" class="table_small">Dostawca</td>
  16. <td width="60" class="table_small">Producent</td>
  17. <td width="50" class="table_small">Lokacja</td>
  18. <td width="40" class="table_small">Waga</td>
  19. <td width="40" class="table_small">Stan</td>
  20. </tr>
  21. <?php
  22. include_once ("db_con.php");
  23. $connection = dbconn::instance();
  24. $wynik = $connection->query("
  25. SELECT
  26. LacznikID,
  27. Nazwa,
  28. Material,
  29. DostawcaID,
  30. ProducentID,
  31. Lokacja,
  32. Waga,
  33. Stan
  34. FROM
  35. tb_laczniki_main
  36. ORDER BY
  37. LacznikID ASC
  38. ");
  39. while ($r = mysql_fetch_assoc($wynik)) {
  40. echo '<tr>';
  41. echo '<td width="20" class="table_small"><a href="index.php?sr=pokaz&artykul_id='.$r['LacznikID'].'">'.$r['LacznikID'].'</a></td>';
  42. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  43. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  44. echo '<td width="60" class="table_small">' . $r['DostawcaID'] . '</td>';
  45. echo '<td width="60" class="table_small">' . $r['ProducentID'] . '</td>';
  46. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  47. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  48. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  49. echo "</tr>";
  50. }
  51. ?>
  52. </table>
  53. </body>
  54. </html>


Gdzie mam szukać przyczyn tego komunikatu o błędzie? Poza tym, funkcja mysql_fetch_assoc jest odpowiedzialna za wyświetlanie tylu wierszy, ile wierszy spełnia zadane warunki - jeśli się nie mylę. A czy tą samą funkcję zastosować w moim przypadku, kiedy wiem, że nie będę miał więcej niż jeden wiersz lub gdybym chciał te dane zaprezentować w innym układzie niż tabela z nagłówkami i wierszami, np. w postaci formularza (tabela z kilkoma wierszami, bez nagłówków, opisy pól i wartości obok siebie)? Przeszukałem Google w obu kwestiach, jednak nie znalazłem odpowiedzi dokładnie na moje pytania...

I jeszcze mam pytanie o samo połączenie z bazą.
Mam dość dziwny twór, który ktoś kiedyś mi napisał
  1. <?php
  2.  
  3. abstract class Singleton {
  4.  
  5. protected static $_instance;
  6.  
  7. protected function __construct() {
  8.  
  9. }
  10.  
  11. public static function instance() {
  12.  
  13. }
  14.  
  15. }
  16.  
  17. class dbconn extends Singleton {
  18.  
  19. private $_conn;
  20. private $server = 'xxx';
  21. private $login = 'xxx';
  22. private $password = 'xxx';
  23. private $database = 'mz_warehouse';
  24.  
  25. protected function __construct() {
  26. $this->_conn = mysql_connect($this->server, $this->login, $this->password) or die(mysql_error());
  27. mysql_select_db($this->database, $this->_conn) or die(mysql_error()); mysql_query("SET NAMES 'utf8'");
  28. }
  29. public static function instance() {
  30. if (is_null(self::$_instance)) {
  31. self::$_instance = new dbconn();
  32. }
  33. return self::$_instance;
  34. }
  35.  
  36. public function query($query) {
  37. return mysql_query($query);
  38. }
  39.  
  40. public function insert($query) {
  41. if (mysql_query($query)) {
  42. } else {
  43. return 0;
  44. }
  45. }
  46.  
  47. public function select($query) {
  48. return mysql_num_rows(mysql_query($query));
  49. }
  50.  
  51. public function escape($string) {
  52. return htmlspecialchars(strip_tags($string));
  53. }
  54.  
  55. }
  56.  
  57. ?>

Czy zamiast tego mogę zastosować zdecydowanie krótszą formę znalezioną na którymś z forów
  1. <?php
  2. $db_connection = null;
  3. function polaczenie() {
  4. global $db_connection;
  5. $mysql_server = "xxx";
  6. $mysql_admin = "xxx";
  7. $mysql_pass = "xxx";
  8. $db_connection = mysql_connect($mysql_server, $mysql_admin, $mysql_pass) or die('Brak połączenia z serwerem MySQL.');
  9. @mysql_select_db($db_connection);
  10. }
  11. ?>

W jakim celu został użyty ten zwrot
  1. $connection = dbconn::instance();

Czy samo inkludowanie nie wystarczy?

Dzięki za wyrozumiałość i cierpliwość :)
Pozdrawiam,
kecajs
kapslokk
1. Sprawdź czy zapytanie nie generuje błędu - jeśli tak to mysql_query zwróci false i chyba stąd cały problem.
2.
  1. $connection = dbconn::instance();
jest użyte dlatego, że klasa dbconn wykorzystuje singleton'a.
http://phpedia.pl/wiki/Singleton
3. Możesz użyć:
  1. $db_connection = null;
  2. function polaczenie() {
  3. global $db_connection;
  4. $mysql_server = "xxx";
  5. $mysql_admin = "xxx";
  6. $mysql_pass = "xxx";
  7. $db_connection = mysql_connect($mysql_server, $mysql_admin, $mysql_pass) or die('Brak połączenia z serwerem MySQL.');
  8. @mysql_select_db($db_connection);
  9. }

ale będziesz musiał przepisać kod bo $connection->query() nie będzie już działać.
MESSIAH :)
Mysql oczekuje jakiś jeden parametr a otrzymał Goowno. Innymi słowy :
  1. mysql_fetch_assoc ( $wynik ))
podstaw odpowiedni parametr do $wynik zobacz w dokumentacji - pewnie chodzi o połączenie z bazą danych.
kecajs
Cytat(kapslokk @ 20.08.2015, 08:21:56 ) *
1. Sprawdź czy zapytanie nie generuje błędu - jeśli tak to mysql_query zwróci false i chyba stąd cały problem.

A czy muszę robić to z wykorzystaniem funkcji mysql_fetch_assoc, czy nie? Zawsze będzie wyciągana z bazy informacja o konkretnym artykule i zawsze będzie tylko jedna. W jaki sposób mogę zaprezentować dane aby wyglądały jak formularz. Przykładowo:
wiersz 1. - Lp. 2 | Nazwa Przykładowa nazwa artykułu
wiersz 2. - Materiał jakiś materiał | Norma norma produktu
wiersz 3. - Stan stan produktu | Lokacja rozmieszczenie w magazynie | Waga waga produktu
wiersz 4. - Dostawca Dostawca | Producent Producent
a nie w postaci tabeli.
Cytat
2.
  1. $connection = dbconn::instance();
jest użyte dlatego, że klasa dbconn wykorzystuje singleton'a.
http://phpedia.pl/wiki/Singleton

Czy to rozwiązanie jest dużo lepsze od przedstawionego poniżej? Bo Twój przykład poniżej, a mój kod wstawiony w poprzedniej wiadomości znacznie się różnią wielkością.
Cytat
3. Możesz użyć:
  1. $db_connection = null;
  2. function polaczenie() {
  3. global $db_connection;
  4. $mysql_server = "xxx";
  5. $mysql_admin = "xxx";
  6. $mysql_pass = "xxx";
  7. $db_connection = mysql_connect($mysql_server, $mysql_admin, $mysql_pass) or die('Brak połączenia z serwerem MySQL.');
  8. @mysql_select_db($db_connection);
  9. }

ale będziesz musiał przepisać kod bo $connection->query() nie będzie już działać.

Czyli zamiast
  1. $wynik = $connection->query()

mam wpisać
  1. $wynik = $db_connection->query()
?
Dzięki za pomoc :)

Cytat(MESSIAH :) @ 20.08.2015, 08:22:39 ) *
Mysql oczekuje jakiś jeden parametr a otrzymał Goowno. Innymi słowy :
  1. mysql_fetch_assoc ( $wynik ))
podstaw odpowiedni parametr do $wynik zobacz w dokumentacji - pewnie chodzi o połączenie z bazą danych.

Ale zmienna $wynik odwołuje sie do
  1. $wynik = $connection->query()
, zaś $connection do
  1. $connection = dbconn::instance();
.
W takim razie jak zmienię skrypt logowania na przykład na ten zaproponowany przez kapslokk i powinno być wszystko ok?
viking
Ogólnie cały ten kod singletona, twojej klasy db nadaje się do kosza chyba tylko. Przede wszystkim stare mysql_ zamiast PDO albo Mysqli. Zero możliwości, niezabezpieczony i tworzy kłopoty. Jest jakiś powód dla którego piszesz w ten sposób?
kecajs
Cytat(viking @ 20.08.2015, 18:57:37 ) *
Ogólnie cały ten kod singletona, twojej klasy db nadaje się do kosza chyba tylko. Przede wszystkim stare mysql_ zamiast PDO albo Mysqli. Zero możliwości, niezabezpieczony i tworzy kłopoty. Jest jakiś powód dla którego piszesz w ten sposób?

Nie, nie ma żadnego. Swego czasu ktoś mi napisał taki skrypt do łączenia się z bazą i go używam do teraz.
Czy w zupełności wystarczy mi skrypt zaproponowany przez kapslokk?
viking
Kapslokk zaproponował gołą funkcję łączącą się z bazą. Zrób to nowocześnie i bezpiecznie.
kecajs
A jak to zrobić nowocześnie i bezpiecznie? Czy dla celów testowych wystarczy ta goła funkcja łącząca się z bazą?
viking
Odpal mysql_error() w kodzie po kolejnych krokach oraz zapoznaj się z Temat: Jak poprawnie zadac pytanie oraz przygotowac srodowisko pracy jak wyświetlać błędy. Nowocześnie to PDO + prepared statements.
kecajs
Trochę pozmieniałem.
Do pliku db_con.php wrzuciłem to, co zaproponował kapslokk. Z kolei kod w pliku pokaz.php wygląda teraz tak. (od części nawiązującej do bazy danych).
  1. <?php
  2.  
  3. require "db_con.php";
  4. $connection = connection();
  5. // tutaj wywolanie zapytania do bazy
  6. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  7. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);
  8. $zapytanie = "
  9. SELECT
  10. LacznikID,
  11. Nazwa,
  12. Material,
  13. DostawcaID,
  14. ProducentID,
  15. Lokacja,
  16. Waga,
  17. Stan
  18. FROM
  19. tb_laczniki_main
  20. WHERE
  21. LacznikID=.$tut_nr";
  22. $wynik = $connection->query($zapytanie);
  23. }
  24.  
  25. while ($r = mysql_fetch_assoc($wynik)) {
  26. echo '<tr>';
  27. echo '<td width="20" class="table_small">' . $r['LacznikID'] . '</td>';
  28. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  29. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  30. echo '<td width="60" class="table_small">' . $r['DostawcaID'] . '</td>';
  31. echo '<td width="60" class="table_small">' . $r['ProducentID'] . '</td>';
  32. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  33. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  34. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  35. echo "</tr>";
  36. }
  37. ?>

Teraz mam taki komunikat:
Fatal error: Call to a member function query() on a non-object in ...
Jak to ugryźć?
viking
$connection = connection(); // tu wywołujesz funkcję

$connection->query($zapytanie); // tutaj powinien być obiekt.

Poczytaj jakiś kurs o podstawach. Tworzenie obiektów a zamiast tak rzeźbić użyj PDO.
kecajs
Znalazłem coś takiego na Wikibooks:
  1. <?php
  2. $mysql_host = 'localhost'; //lub jakiś adres: np sql.nazwa_bazy.nazwa.pl
  3. $port = '3307'; //domyślnie jest to port 3306
  4. $username = 'login';
  5. $password = 'hasło';
  6. $database = 'nazwa_bazy'; //'produkty'
  7.  
  8. try{
  9. $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
  10. echo 'Połączenie nawiązane!';
  11. }catch(PDOException $e){
  12. echo 'Połączenie nie mogło zostać utworzone.<br />';
  13. }
  14. ?>

Podstawiłem tu moje dane i jest to plik db_con.php

Znalazłem tu także kod umożliwiający połączenie się z bazą:
  1. <?php
  2.  
  3. try
  4. {
  5. $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root');
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.  
  8. $stmt = $pdo->query('SELECT id, nazwa, opis FROM produkty');
  9. echo '<ul>';
  10. foreach($stmt as $row)
  11. {
  12. echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
  13. }
  14. $stmt->closeCursor();
  15. echo '</ul>';
  16. }
  17. catch(PDOException $e)
  18. {
  19. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  20. }
  21. ?>

I teraz zastanawiam się, jak podmienić ten mój kod w pliku pokaz.php i wykorzystać ten powyższy kod, jednocześnie nie budować kompletnie mi w tym przypadku nie potrzebnej tabeli z wierszami wynikowymi, bo jak pisałem we wcześniejszych postach - w tym przypadku wynik będzie zawsze jednowierszowy.
I proszę mnie potraktować trochę ulgowo, bo to co robię, ma na celu jedynie przedstawić możliwości i ogólny zarys funkcjonowania aplikacji. Po akceptacji osób decyzyjnych i tak zajmie się tym programista. Ja jestem początkującym amatorem próbującym coś tam klecić, a nie uważam się za programistę. Jestem ekonomistą :)

Pozdrawiam

Hmm, no cóż, wygląda na to, że pozostałem sam na polu boju... Nic nowego. Temat można zamknąć, bo po co ma wisieć martwy.
viking
Ale jaki jest tym razem problem konkretnie? Piszesz że nie chcesz budować tabeli - i nie budujesz. Masz generowana listę ul-li.
kecajs
Chodzi o to, w jaki sposób przedstawić wynik dla jednego konkretnego artykułu. Dla większej liczby budujemy tabelę funkcją mysql_fetch_assoc(), zaś dla jednego, konkretnego wyniku jak pokazać te informacje?
Z racji tego, że chodzi mi tylko o zaprezentowanie funkcjonalności, a nie tworzę aplikacji do użytkowania, więc sposób łączenia z bazą pozostawiam tak, jak w początkowych wpisach przedstawiłem - nie wykorzystuję pdo i mysqli, tylko mysql.
Dzięki za odpowiedź.
viking
W zapytaniu LIMIT 1. Wybranie jednego rekordu w PHP http://www.php.net/manual/en/pdostatement.fetch.php
kecajs
OK, ale czy do tego celu muszę stosować funkcję mysql_fetch_array(), czy też mogę zaprezentować te dane w inny sposób? W ogóle nie chcę ich prezentować w układzie tabelarycznym (nagłówek u góry i dane poniżej), a bardziej w układzie formularza (nazwa pola i obok dane, np. |Nr artykułu| 1|Nazwa artykułu|Śruba M16 x 110| i tak dalej. Jak to mogę zaprezentować?
nospor
fetch() zwraca ci jeden rekord w postaci tablicy. Jak ty to sobie wyswietlisz i gdzie to tylki i wylacznie Twoja sprawa.
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.