Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Mysqli_Num_Rows() Expects Parameter 1 To Be Mysqli_Result
Forum PHP.pl > Forum > Przedszkole
darney
viewprofile.php
  1. <?php
  2. // Uruchamianie sesji.
  3. require_once('startsession.php');
  4.  
  5. // Wstawianie nagłówka strony.
  6. $page_title = 'Wyświetl profil';
  7. require_once('header.php');
  8.  
  9. require_once('appvars.php');
  10. require_once('connectvars.php');
  11.  
  12. // Przed przejściem do dalszych operacji należy się upewnić, że użytkownik jest zalogowany.
  13. if (!isset($_SESSION['user_id'])) {
  14. echo '<p class="login"><a href="login.php">Zaloguj się</a>, aby uzyskać dostęp do tej strony.</p>';
  15. exit();
  16. }
  17.  
  18. // Wyświetlanie menu nawigacyjnego.
  19. require_once('navmenu.php');
  20.  
  21. // Łączenie się z bazą danych.
  22. $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  23.  
  24. // Pobieranie danych użytkownika z bazy.
  25. if (!isset($_GET['user_id'])) {
  26. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_SESSION['user_id'] . "'";
  27. }
  28. else {
  29. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_GET['user_id'] . "'";
  30. }
  31. $data = mysqli_query($dbc, $query);
  32.  
  33. if (mysqli_num_rows($data) == 1) {
  34. // Znaleziono wiersz z danymi użytkownika, dlatego należy je wyświetlić.
  35. $row = mysqli_fetch_array($data);
  36. echo '<table>';
  37. if (!empty($row['username'])) {
  38. echo '<tr><td class="label">Nazwa użytkownika:</td><td>' . $row['username'] . '</td></tr>';
  39. }
  40. if (!empty($row['first_name'])) {
  41. echo '<tr><td class="label">Imię:</td><td>' . $row['first_name'] . '</td></tr>';
  42. }
  43. if (!empty($row['last_name'])) {
  44. echo '<tr><td class="label">Nazwisko:</td><td>' . $row['last_name'] . '</td></tr>';
  45. }
  46. if (!empty($row['gender'])) {
  47. echo '<tr><td class="label">Płeć:</td><td>';
  48. if ($row['gender'] == 'M') {
  49. echo 'Mężczyzna';
  50. }
  51. else if ($row['gender'] == 'K') {
  52. echo 'Kobieta';
  53. }
  54. else {
  55. echo '?';
  56. }
  57. echo '</td></tr>';
  58. }
  59. if (!empty($row['birthdate'])) {
  60. if (!isset($_GET['user_id']) || ($_SESSION['user_id'] == $_GET['user_id'])) {
  61. // Wyświetlanie dnia urodzenia danemu użytkownikowi.
  62. echo '<tr><td class="label">Data urodzenia:</td><td>' . $row['birthdate'] . '</td></tr>';
  63. }
  64. else {
  65. // Wyświetlanie samego roku pozostałym użytkownikom.
  66. list($year, $month, $day) = explode('-', $row['birthdate']);
  67. echo '<tr><td class="label">Rok urodzenia:</td><td>' . $year . '</td></tr>';
  68. }
  69. }
  70. if (!empty($row['city']) || !empty($row['state'])) {
  71. echo '<tr><td class="label">Miejscowość:</td><td>' . $row['city'] . ', ' . $row['state'] . '</td></tr>';
  72. }
  73. if (!empty($row['picture'])) {
  74. echo '<tr><td class="label">Zdjęcie:</td><td><img src="' . MM_UPLOADPATH . $row['picture'] .
  75. '" alt="Zdjęcie z profilu" /></td></tr>';
  76. }
  77. echo '</table>';
  78. if (!isset($_GET['user_id']) || ($_SESSION['user_id'] == $_GET['user_id'])) {
  79. echo '<p>Czy chcesz <a href="editprofile.php">zmodyfikować profil</a>?</p>';
  80. }
  81. } // Koniec przetwarzania wiersza z danymi użytkownika.
  82. else {
  83. echo '<p class="error">Wystąpił problem przy próbie dostępu do profilu.</p>';
  84. }
  85.  
  86. mysqli_close($dbc);
  87. ?>
  88.  
  89. <?php
  90. // Wstawianie stopki strony.
  91. require_once('footer.php');
  92. ?>
  93.  


startsession.php
  1.  
  2. // Jeśli zmienne sesji nie są ustawione, należy spróbować użyć do tego plików cookie.
  3. if (!isset($_SESSION['user_id'])) {
  4. if (isset($_COOKIE['user_id']) && isset($_COOKIE['username'])) {
  5. $_SESSION['user_id'] = $_COOKIE['user_id'];
  6. $_SESSION['username'] = $_COOKIE['username'];
  7. }
  8. }

Przy próbie oglądnięcia swojego profilu dostaje komunikat.

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /x/x/ftp/x/x/x/viewprofile.php on line 33


Przykład jest skopiowany z gotowych kodów które dostępne są na stronie wydawnictwa helion. Jest to przykład z ksiązki który niestety nie chce funkcjonować.

Uczę się dopiero zarządzać sesjami i użytkownikami dlatego też zwracam się z prośbą o pomoc w rozwiązaniu powyższego problemu.

temat był poruszany dla innego pliku php z tego samego ćwiczenia
http://forums.oreilly.com/topic/50019-warn...2990#entry92990
lukesh
Może się mylę, ale jakoś nie odpowiada mi Twój zapis zapytania:
  1. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_SESSION['user_id'] . "'";

Ja bym napisał:
  1. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id ='$_SESSION['user_id']'";

Chociaż obie opcje chyba będą działać...

Próbowaleś użyć mysql zamiast mysqli?
nospor
@lukesh mylisz się i to bardzo. Uczysz kogoś sam nie znając podstaw obsługi tekstów i wprowadzając użytkownika w błąd

@darney masz błąd zapytania. Jak wyświetlać błędy zapytania masz napisane tu:
Temat: Jak poprawnie zada pytanie
tylko zamiast mysql_error masz użyc odpowiednika dla mysqli
darney
ZAPYTANIE:SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '14'
Warning: mysqli_query() expects at least 2 parameters, 1 given in /logowanie2/viewprofile.php on line 31

Warning: mysqli_error() expects exactly 1 parameter, 0 given in /logowanie2/viewprofile.php on line 31
BŁĄD:

nie bardzo rozumiem błąd
nospor
Kurcze, skopiowałeś bezmyslnie przykład z linka co ci podałem
Przecież napisałem, że ty używasz mysqli a nie mysql i musisz ciut dostosować ten kod do swojej sytuacji :/
darney
zamieniłem na msqli juz na samym początku.
  1. if (!isset($_GET['user_id'])) {
  2. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_SESSION['user_id'] . "'";
  3.  
  4. $sql = $query;
  5. echo 'ZAPYTANIE:'.$sql;
  6. mysqli_query($sql) or die('BŁĄD:'.mysqli_error());
  7. }
  8. else {
  9. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_GET['user_id'] . "'";
  10. $sql = $query;
  11. echo 'ZAPYTANIE:'.$sql;
  12. mysqli_query($sql) or die('BŁĄD:'.mysqli_error());
  13. }
nospor
mysqli_query($sql)
Tylko, że mysqli wymaga więcej parametrów niż jeden :/
Mówi ci o tym błąd, mówi ci o tym manual, mówi ci o tym twój kod, który masz w książce. Dlatego napisałem, że bezmyślnie skopiowałeś. Po co ci ta książka, skoro ty z niej tylko przepisujesz, w ogóle nie wiesz co dana linijka robi i czego wymaga. Co to za nauka?

Cytat
Warning: mysqli_error() expects exactly 1 parameter, 0 given

Identyko tu. Bład swoje, a ty swoje.
darney
no właśnie przepisuje po to by analizować dany kod. Samo nie wejdzie do póki nie przepisze i nie przemyśle każdej linii. Nie rozumiem dalej błędu. Nie wiem o co chodzi z 2 parametrami. Jestem tylko wkurzony że książka za która zapłaciłem prawie 100 zł zawiera błędy. Idę męczyć manual.
nospor
Cytat
Nie wiem o co chodzi z 2 parametrami.

Twój poprawny kod z ksiązki:
mysqli_query($dbc, $query);
Twój bezmyślnie przepisany kod:
mysqli_query($sql)

Znajdź 10 różnic
mysqli_query($dbc, $query);
mysqli_query($sql);
darney
ale ksiązkowy przykład ma 2 parametry
  1. $data = mysqli_query($dbc, $query);

jedynie ja przepisując twój przykład dałem jeden.
nospor
Cytat
jedynie ja przepisując twój przykład dałem jeden.
No właśnie.... dlatego ciągle piszę, że bezmyślnie kopiujesz :/ Bo mysqli_query wymaga właśnie dwóch parametrów.....
Ja w przykładzie użyłem mysql ty używasz mysqli więc masz myśleć a nie bezmyślnie kopiować.
darney
ZAPYTANIE:
Warning: mysqli_query() [function.mysqli-query]: Empty query in logowanie2/viewprofile.php on line 31

Warning: mysqli_error() expects exactly 1 parameter, 0 given in logowanie2/viewprofile.php on line 31
BŁĄD:

  1. if (!isset($_GET['user_id'])) {
  2. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_SESSION['user_id'] . "'";
  3.  
  4.  
  5. echo 'ZAPYTANIE:'.$sql;
  6. mysqli_query($dbc, $sql) or die('BŁĄD:'.mysqli_error());
  7. }
  8. else {
  9. $query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . $_GET['user_id'] . "'";
  10.  
  11. echo 'ZAPYTANIE:'.$sql;
  12. mysqli_query($dbc, $sql) or die('BŁĄD:'.mysqli_error());
  13. }
  14. $data = mysqli_query($dbc, $query);


naprawdę nie wiem o co tu chodzi.
nospor
ale mysqli_error() zgodnie z komunikatem błędu wymaga jednego parametru. Ty zaś nie podajesz żadnego. Czemu nie czytasz tych komunikatów? Czemu nie korzystasz z manuala by zobaczyć jak używać funkcji, których używasz? Czy wszystko po kolei trzeba ci paluszkiem pokazywać jak małemu dziecku?
darney
z edytowałem post. Tam miałem nawalone podwójnie zapytania.
nospor
No i co z tego? Nadal mysqli_error źle używasz. Tego nadal nie poprawiłeś

Poza tym dla mysqli_query zapodajesz zmienną $sql a ty zapytanie masz w zmiennej o nazwie $query
darney
ale co ja mam w środek tam wstawić w error $dbc? query ? w manualu też nic nie ma... pewnie czegoś nie rozumiem.
nospor
Cytat
w manualu też nic nie ma...
Raczysz żartować...
http://www.php.net/manual/en/mysqli.error.php

Widzę, że potrzebujesz odrobiny motywacji. Tak wiec daję ci ją: zamykam.
Gdy już uporasz się z tym banałem, zapraszam na PW, będziemy dalej kontynuować.
Nawet na forum przedszkole wymagamy mimalnego poziomu.

No i wkońcu się udało. Ostateczny błąd:
Cytat
ZAPYTANIE:SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '14'BŁĄD:Unknown column 'birthdate' in 'field list'

Problem rozwiązany smile.gif

ps:
  1. if (!isset($_SESSION['user_id'])) {
  2. if (isset($_COOKIE['user_id']) && isset($_COOKIE['username'])) {
  3. $_SESSION['user_id'] = $_COOKIE['user_id'];
  4. $_SESSION['username'] = $_COOKIE['username'];
  5. }
  6. }

Jeśli w tej książce, tak podchodzą do autoryzacji, to rzuć tę książkę do ogniska. Ona przyniesie ci więcej szkody jak pożytku z takimi naukami.
darney
spokojnie to pierwszy rozdział odnośnie zarządzania userami. W kolejnych pewnie będą dalej rozwijać ten moduł ;P. Powiedz mi dlaczego jest to nie bezpieczna autoryzacja. Coś takiego mozna łatwo obejść?
nospor
Tak, każdy pseudo haker obejdzie to w 10 sekund. Nie sądze, by to poprawili dalej. To co tu podali nie powinno się pojawić na żadnym etapie uczenia. Ktoś kto to pisał, miał zerową wiedzę na temat autoryzacji a konkretnie na temat bezpiecznej autoryzacji.
darney
w takim razie jak powinna wyglądać bezpieczna autoryzacja. Proszę o nakierowanie mnie do dobrej lektury:)
nospor
Cały kawałek kodu, który ci zacytowałem, powinien zniknąć. I już na początek będzie super.


Kod, który tam jest, autoryzuje użytkownika na podstawie ciastka. A ciastko każdy głupi w 10 sekund ustawi i zaloguje się na dowolne konto w serwisie.
darney
no tak ale jak to wszystko usunę to się nie zaloguję a jakoś trzeba smile.gif
nospor
A próbowałeś?
Ja mówiłem o skasowanie tylko tego:
if (!isset($_SESSION['user_id'])) {
if (isset($_COOKIE['user_id']) && isset($_COOKIE['username'])) {
$_SESSION['user_id'] = $_COOKIE['user_id'];
$_SESSION['username'] = $_COOKIE['username'];
}
}
Nic więcej.

Jeśli naprawdę po skasowaniu tylko tego, nie możesz się zalogować to jest jeszcze gorzej niż myślałem. Pokaż wówczas kod logowania.
darney
nie no działa. Tylko cookie z tego co doczytałem pozwalają określić czas kiedy wyloguje usera który odejdzie od komputera np na 20 min. Czy można to zmienić z poza cookie. Podejrzewam że tak skoro mowa o ciastkach które są niebezpieczne. Bo autor tej książki która podobno ma się dobrze palić smile.gif używa instrukcji setcookie(session_name(), '', time() - 3600);
Jestem laikiem w sprawach logowania i dopiero się przeuczam. Wiec chcę jedynie zaczerpnąć rady jak mam myśleć żeby się nie w kopać.
nospor
Ciacho może stworzyć każdy user sam bez żadnego problemu. Jak ktoś do autoryzacji używa właśnie ciastek, znaczy, że jest totalnym laikiem w tym co pisze. I aż strach się bać o jakość pozostałego kodu. Tak więc spal to póki jeszcze masz okazję smile.gif

Czas sesji określa serwer a nie użytkownik.
darney
A jak na danym, serwerze stoi kilka stron i jak dam sesji żywot 10 min to każdy mój serwis po 10 minutach pada:P czy można to jakoś przypisać htaccessem ? tongue.gif
nospor
questionmark.gif
Jak serwis pada po 10 minutach? Coś ci się zaczyna pomału mieszać tongue.gif
darney
ehheehhe i kasują się wszystkie konta na facebooku:P no chodzi o sesje smile.gif to w każdym serwisie po 10 minutach wszystkich wylogowuje. I czy można to przypisać do jednego serwisu
nospor
Nie wszystkich, tylko tych co przez 10 minut nic nie zrobili. Jak ktoś po 9 minutach coś kliknął, to znowu ma 10 minut. To jest normalna sprawa i przestań nad tym biedować. Na serwerze można wydłużyć czas. Standardowo jest bodajże 20 minut a nie 10.
darney
Spójrz jeszcze na skrypt logowania i daję już spokój. smile.gif
  1. <?php
  2. require_once('connectvars.php');
  3.  
  4. // Rozpoczynanie sesji.
  5.  
  6. // Usuwanie komunikatu o błędzie.
  7. $error_msg = "";
  8.  
  9. // Jeśli użytkownik nie jest zalogowany, należy spróbować go zalogować.
  10. if (!isset($_SESSION['user_id'])) {
  11. if (isset($_POST['submit'])) {
  12. // Łączenie się z bazą danych.
  13. $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  14.  
  15. // Pobieranie danych logowania wpisanych przez użytkownika.
  16. $user_username = mysqli_real_escape_string($dbc, trim($_POST['username']));
  17. $user_password = mysqli_real_escape_string($dbc, trim($_POST['password']));
  18.  
  19. if (!empty($user_username) && !empty($user_password)) {
  20. // Wyszukiwanie nazwy użytkownika i hasła w bazie danych.
  21. $query = "SELECT user_id, username FROM mismatch_user WHERE username = '$user_username' AND password = SHA('$user_password')";
  22. $data = mysqli_query($dbc, $query);
  23.  
  24. if (mysqli_num_rows($data) == 1) {
  25. // Dane logowania są poprawne, dlatego należy ustawić zmienne (i pliki cookie) sesji z
  26. // identyfikatorem i nazwą użytkownika, a następnie przejść do strony głównej.
  27. $row = mysqli_fetch_array($data);
  28. $_SESSION['user_id'] = $row['user_id'];
  29. $_SESSION['username'] = $row['username'];
  30. setcookie('user_id', $row['user_id'], time() + (60 * 60 * 24 * 30)); // Wygasa za 30 dni.
  31. setcookie('username', $row['username'], time() + (60 * 60 * 24 * 30)); // Wygasa za 30 dni.
  32. $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/index.php';
  33. header('Location: ' . $home_url);
  34. }
  35. else {
  36. // Para nazwa użytkownika - hasło jest nieprawidłowa, dlatego należy ustawić komunikat o błędzie.
  37. $error_msg = 'Musisz podać poprawną parę nazwa - hasło, aby się zalogować.';
  38. }
  39. }
  40. else {
  41. // Użytkownik nie podał pary nazwa - haso, dlatego należy ustawić komunikat o błędzie.
  42. $error_msg = 'Musisz podać parę nazwa - hasło, aby się zalogować.';
  43. }
  44. }
  45. }
  46.  
  47. // Wstawianie nagłówka strony.
  48. $page_title = 'Logowanie';
  49. require_once('header.php');
  50.  
  51. // Jeśli zmienna sesji jest pusta, skrypt wyświetla komunikat o błędzie i formularz
  52. // logowania. W przeciwnym razie informuje o udanym zalogowaniu użytkownika.
  53. if (empty($_SESSION['user_id'])) {
  54. echo '<p class="error">' . $error_msg . '</p>';
  55. ?>
  56.  
  57. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  58. <fieldset>
  59. <legend>Logowanie</legend>
  60. <label for="username">Nazwa użytkownika:</label>
  61. <input type="text" name="username" value="<?php if (!empty($user_username)) echo $user_username; ?>" /><br />
  62. <label for="password">Hasło:</label>
  63. <input type="password" name="password" />
  64. </fieldset>
  65. <input type="submit" value="Zaloguj" name="submit" />
  66. </form>
  67.  
  68. <?php
  69. }
  70. else {
  71. // Potwierdzenie udanego zalogowania.
  72. echo('<p class="login">Zalogowany użytkownik: ' . $_SESSION['username'] . '.</p>');
  73. }
  74. ?>
  75.  
  76. <?php
  77. // Wstawianie stopki strony.
  78. require_once('footer.php');
  79. ?>
  80.  

te cookie rozumiem wywalić?
nospor
setcookie('user_id', $row['user_id'], time() + (60 * 60 * 24 * 30)); // Wygasa za 30 dni.
setcookie('username', $row['username'], time() + (60 * 60 * 24 * 30)); // Wygasa za 30 dni.
Tak, to powinno zniknąć.
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.