Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] warunek if() ciągle wyświetla else()
Forum PHP.pl > Forum > Przedszkole
Manfred
Witam,

Skrypt działa tak: wpisujemy hasło w formularz.php nastepnie hasło jest weryfikowane w edit.php.

Problem polega na tym, że nie zależnie od tego czy wpisze hasło poprawne czy nie, zawsze wyświetla mi się: "Warunek if nie został spełniony" (else)

Za pomocą echo sprawdzalem czy zapytanie pobiera właściwe haslo, wszystko jest ok.

Kodowanie w bazie jest utf8_unicode_ci w pliku utf8

formularz.php
  1. echo "<form method=\"post\" action=\"http://$site_adress/edit.php\">";
  2. echo " <p>Wpisz hasło aby edytowac/usunąć ogloszenie: <input type=\"text\" name=\"pass\"></p>";
  3. echo " <p>";
  4. echo " <input type=\"submit\" name=\"Submit\" value=\"Edytuj\">";
  5. echo " </p>";
  6. echo " <p>";
  7. echo "</form>";



edit.php
  1. mysql_query("SET NAMES utf8");
  2.  
  3. $id = $_SESSION['id'];
  4.  
  5. $pass = $_POST['pass'];
  6.  
  7. $query = 'SELECT adv_name, adv_text, adv_city, adv_profession, adv_earnings, adv_date, adv_tel, adv_email, adv_pass ' . 'FROM adverts ' . 'WHERE adv_id = "' . $_SESSION['id'] . '"';
  8.  
  9. $result = mysql_query($query)
  10. while ($row = mysql_fetch_array($result)) {
  11. extract($row);
  12. }
  13.  
  14. echo "Dobre hasło: " . $adv_pass;
  15. echo "<br />";
  16. echo "Hasło z formularza: " . $pass;
  17. echo "<br />";
  18.  
  19.  
  20. if ($_POST['pass'] == $adv_pass) {
  21. echo "Warunek if został spełniony";
  22. } else {
  23. echo "Warunek if nie został spełniony";
  24. }


Z góry dziękuje za pomoc.
MateuszS
Może hasło zawiera polskie znaki, ma spacje gdzieś, wielkość liter jest inna?
Manfred
Nie. Wszystkie hasła składaja sie z małych i wielkich liter oraz cyfr. Bez polskich znaków, spacji, czy innych bajerów.
np. yu8772, Mds999, 23231, mmsiJK itp.itd

hasło podane w formularzu teoretycznie zgadza się z tym z bazy, ale php musi je jakoś inaczej jeszcze rozpatrzyc.

Bardziej doświadczony programista sugerował, że to coś z kodowaniem, ale jak podałem w pierwszym poście, sa takie same wszędzie,
MySQL - utf8_unicode_ci
plik.php - utf8
w meta - utf8

nie mam zielonego pojęcie gdzie leży problem
Wicepsik
Zobacz źródło strony.
blooregard
  1. if ($_POST['pass'] == $adv_pass) {

Może źle widzę ,ale w którym miejscu zmienna $adv_pass otrzymuje jakąś wartość?

Bo jak dla mnie , ma ona cały czas wartość FALSE i dlatego warunek wykonuje się, jak wykonuje.
Manfred
Cytat
Może źle widzę ,ale w którym miejscu zmienna $adv_pass otrzymuje jakąś wartość?

A jak jej nadać wartość? Myślałem, że sam fakt, iż została pobrana z bazy i w echo sie wyswietla, znaczy ze ma jakąś wartość.
blooregard
~Manfred:
Zamień mysql_fetch_array na mysql_fetch_assoc, lub dodaj drugi argument do mysql_fetch_array (MYSQL_ASSOC).
Manfred
Cytat
Zamień mysql_fetch_array na mysql_fetch_assoc

Nadal nie działa

Cytat
dodaj drugi argument do mysql_fetch_array (MYSQL_ASSOC).

Jak to zrobić?
mortus
W linii 12:
  1. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
zaraz pod tym dodaj jeszcze print_r($row);, a wyniki wklej tutaj. Zobaczymy, co jest w $row.
Manfred
Wyskoczyło:

Array ( [adv_id] => 2 [adv_name] => łśćąę [adv_text] => [adv_city] => [adv_profession] => np. kelner, zmywak [adv_earnings] => do negocjacji [adv_date] => 03.27.2010 [adv_tel] => [adv_email] => [adv_pass] => dJo8g )

Najważniejsze pogrubilem. Zdaje się że hasło jest, ale nie zależnie od tego czy wpisze to hasło czy jakikolwiek inny ciąg znaków, zawsze wyskakuje else.
blooregard
Bo to jest tablica.

Musisz zmienić w warunku $adv_pass na $row['adv_pass'], nie zauw

@down:
Fakt, nie zwróciłem uwagi.
mortus
Cytat(blooregard @ 27.03.2010, 20:19:11 ) *
Bo to jest tablica.

Musisz zmienić w warunku $adv_pass na $row['adv_pass']
Nie musi, bo ma extract($row);


Teoretycznie zapytanie powinno zwrócić jeden rekord, dlatego zastąpiłbym
  1. while ($row = mysql_fetch_array($result)) {
  2. extract($row);
  3. }
tym
  1. $row = mysql_fetch_array($result, MYSQL_ASSOC);
  2. extract($row);


Tak z ciekawości wydrukuj w linii 21 (przed warunkiem sprawdzającym) tablicę $_POST i $adv_pass - print_r($_POST); echo '<br>' . $adv_pass;, wypróbuj i daj znać, co wypluło.

Albo jeszcze lepiej var_dump($_POST['pass']); var_dump($adv_pass);.
Manfred
@mortus, zwróciło:

Array ( [pass] => dJo8g [Submit] => Edytuj )
dJo8g

zrobiłem tę podmianę kodu, ale nadal nie działa ;/

mortus
Wypróbuj jeszcze var_dump-y, zobaczymy co to za typy danych i jakiej są długości, bo zdaje się, że wartość jest taka sama, ale to może być iluzja.
Manfred
@mortus, DZIĘKI biggrin.gif

przy użyciu var_dumpa dokopałem się do problemu,

var_dump($row);

array(10) { ["adv_id"]=> string(1) "2" ["adv_name"]=> string(10) "łśćąę" ["adv_text"]=> string(0) "" ["adv_city"]=> string(0) "" ["adv_profession"]=> string(18) "np. kelner, zmywak" ["adv_earnings"]=> string(13) "do negocjacji" ["adv_date"]=> string(10) "03.27.2010" ["adv_tel"]=> string(0) "" ["adv_email"]=> string(0) "" ["adv_pass"]=> string(6) " dJo8g" }


var_dump($_POST['pass']);
string(5) "CY48X"

no 5 nie pasuje do 6, więc trzeba było wziąć na celownik funkcje, która tworzy hasło, a wygląda ona tak:
  1. // generowanie losowego hasla
  2. function createkey($dlugosc) {
  3.  
  4. $dlugosc = 5;
  5.  
  6. $key=' ';
  7.  
  8. for($i=0; $i<$dlugosc; $i++) {
  9.  
  10. switch(rand(1,3)) {
  11.  
  12. case 1: $key.=chr(rand(48,57));break;
  13.  
  14. case 2: $key.=chr(rand(65,90));break;
  15.  
  16. case 3: $key.=chr(rand(97,122));break;
  17.  
  18. }
  19.  
  20. } return $key;
  21.  
  22. }
  23.  
  24. $pass = createkey($dlugosc);

wystarczyło usnąc spacje w $key (6 linijka)

i teraz śmiga jak marzenie winksmiley.jpg Jeszcze raz wielkie dzięki mortus za szybką pomoc!
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.