Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Link nie działa
Forum PHP.pl > Forum > Przedszkole
hesus
Witam,

Od paru dni nie mogę sobie poradzić z następującym problemem:

Mam link generowany przez php w źródle index.php:

if(isset($user_login)) echo "<A HREF=new.php>Nowe zgłoszenie</A><BR>";

tylko wtedy, gdy użytkownik jest zalogowany. Generalnie to działa, ale raz na kilka kliknięć strona zachowuje się tak, jakby źródło było puste tzn. po kliknięciu mam białe okno przeglądarki, w polu adresu jest nadal index.php, po wybraniu opcji "Pokaż źródło" nie dzieje się kompletnie nic.
Używam zmiennych sessji, łączę się z bazą MS SQL, procedurę połączenia ładuję przez include(), nie wiem, co jeszcze może mieć wpływ na takie działanie skryptu.

Będę wdzięczny za pomoc.
Cysiaczek
eh trochę mało danych, ale spróbójmy.

1.
  1. <?php
  2.  
  3. if(isset($user_login)) {print '<A HREF=\"new.php\">Nowe zgłoszenie</A><BR>';}
  4.  
  5. ?>


Tak chyba jest poprawniej

2. Więcej danych
hesus
Dzięki za zainteresowanie.
Ok. Spróbuję skonkretyzować problem. Generalnie za każdym razem kiedy zmieniam lokację strony (link, submit) istnieje duże prawdopodobieństwo, że ujrzę biały ekran i pozostanę na tej samej stronie.
Może zapomnijmy na chwilę o linku. Pokażę to na przykładzie submita, bo jeśli problem jest w kodzie, to chyba właśnie w tym miejscu.

Na początku strony mamy:
Kod
<?php
session_start();
if (session_is_registered('logon_info')) session_unregister('logon_info'); // komunikat o błędzie
?>

Dalej formularz logowanie i wyświetlanie komunikatu o błędzie:
Kod
     <?php
      if (isset($logon_info)) echo "<SPAN ID=serror>$logon_info</SPAN><BR>";
      if (isset($user_login)) echo "<A HREF=logoff_script.php>Wyloguj <SPAN ID=sinfo>$user_login</SPAN></A><BR>";
     ?>
     <FORM ACTION=logon_script.php METHOD=post>

      <SPAN ID=title>UŻYTKOWNIK</SPAN><BR>
      <INPUT ID=login TYPE=text NAME=login><BR>
      <SPAN ID=title>HASŁO</SPAN><BR>
      <INPUT ID=login TYPE=password NAME=password><BR>
      <INPUT ID=login TYPE=submit NAME=submit VALUE=OK>
     </FORM>
     <?php
      if(isset($user_login)) echo "<a href=new.php>Nowe zgłoszenie</a><BR>";
      if(isset($user_login)) echo "<a href=archives.php>Archiwum</a>";
     ?>

Skrypt logowania wygląda następująco:
Kod
<?php
session_start();
if (($login=="")||($password=="")) {
  $logon_info='BRAK DANYCH';
  if (!session_is_registered('logon_info')) session_register('logon_info');
  Header('Location: index.php');
  exit;
}

include("connect/connect.php");
$results=mssql_query("SELECT kod, prawa FROM uzytkownicy WHERE login='$login' AND haslo='$password'",$connection);
mssql_close($connection);

if (mssql_num_rows($results)==0) {
  $logon_info='BŁDNE DANE';
  if (!session_is_registered('logon_info')) session_register('logon_info');
  Header('Location: index.php');
  exit;
}

$row=mssql_fetch_row($results);
$user_id=$row[0];
$user_login=$login;
$user_access=$row[1];
if (!session_is_registered('user_id')) session_register('user_id');
if (!session_is_registered('user_login')) session_register('user_login');
if (!session_is_registered('user_access')) session_register('user_access');
Header('Location: index.php');
?>

Niezależnie od tego, czy zostały wprowadzone login i hasło i czy dane są poprawne po kliknięciu na przycisk SUBMIT mogą wystąpić wyżej wymienione objawy.

Na marginesie: Pewnie wyjdę na tatalnego laika, ale nie widzę większej różnicy pomiędzy PRINT a ECHO oraz konieczności zamykania w klamrach pojedynczej instrukcji. Niemniej jednak dzięki za uwagi.
nospor
Cytat
<SPAN ID=title>UŻYTKOWNIK</SPAN><BR>
    <INPUT ID=login TYPE=text NAME=login><BR>
    <SPAN ID=title>HASŁO</SPAN><BR>
    <INPUT ID=login TYPE=password NAME=password><BR>
    <INPUT ID=login TYPE=submit NAME=submit VALUE=OK>

nadajesz różnym polom te samo id=login, wrrrr
Cytat
session_start();
if (($login=="")||($password=="")) {
$logon_info='BRAK DANYCH';
if (!session_is_registered('logon_info')) session_register('logon_info');
Header('Location: index.php');
exit;
}

A skąd masz te $login i $password? jakoś nigdzie nie widzę abyś je pobierał?Tu mogą być przez to problemy

Cytat
Na marginesie: Pewnie wyjdę na tatalnego laika, ale nie widzę większej różnicy pomiędzy PRINT a ECHO oraz konieczności zamykania w klamrach pojedynczej instrukcji. Niemniej jednak dzięki za uwagi.

Kolega też pewnie miał na myśli, że atrybuty tagów należy dawać w "", czyli
<input type="text" ... to dosyć ważna kwestia
hesus
Może rozwiązanie z ID jest niemądre, ale wykorzystuję je tylko do przypisywania znacznikom stylów, więc myślę, że nie w tym problem.

Zmienne $login i $password przekazywane są do skryptu przez formularz
Kod
<INPUT ID=login TYPE=text NAME=login><BR>
<INPUT ID=login TYPE=password NAME=password>


Zawsze tak robię i zawsze to działa. Podejrzewam, że to też nie jest problemem, bo nie działają również linki
Kod
if(isset($user_login)) echo "<a href=new.php>Nowe zgłoszenie</a><BR>";
if(isset($user_login)) echo "<a href=archives.php>Archiwum</a>";


Przykładowo strona archives.php wygląda niemalże identycznie jak ta z linkiem. Różnice twią tylko w linkach no i oczywiści w treści strony.

O zamykaniu atrubutów do tagów będę pamiętał. Dzięki.
nospor
Zgadza się. login i password są przekazywane przez formualarz (taki glupi to ja nie jestem), ale ty ich nie odbierasz. Jakoś nigdzie nie zauważyłem kawałka kodu:
  1. <?php
  2.  
  3. $login=$_POST['login'];
  4. $password=$_POST['password'];
  5.  
  6. ?>
hesus
Parametry przekazywane są do skryptu za pomocą tablicy $_POST, HTTP_POST_VARS oraz przez pojedycze zmienne o nazwach takich, jak nazwy nadane elementom formularza. Takie rozwiązanie stusuję zawsze i to raczej nie o to chodzi. Zresztę nie muszę w ogóle uruchamiać skryptu logowania, żeby wystąpił problem, o którym tutaj piszę.
Wystarczy, że kliknę na link, a może się zdarzyć, że zobaczę biały ekran a adres w polu edycyjnym zostanie niezmieniony. Stronę, do ktorej odnosi się link, mogę zobaczyć dopiero po odświeżeniu strony.
Ten problem pojawia się nawet, gdy nie umieszczam warunku zalogowania w linkach:
Kod
//      if(isset($user_login))
echo "<a href=new.php>Nowe zgłoszenie</a><BR>";
//      if(isset($user_login))
echo "<a href=archives.php>Archiwum</a>";

I tego właśnie pojąć nie mogę. Jeśli ktoś mi pomoże, będę wdzięczny.
nospor
Piszesz , że raz na jakiś czas. No to może to spowodowane jest przez to że nie używasz"".
Zamiast <a href=new.php>Nowe zgłoszenie</a>
daj <a href="new.php">Nowe zgłoszenie</a>
hesus
To nie to. Już sprawdziłem. Wiem, że to nieładne, ale - przez własne lenistwo - często zdarza mi się nie wstawiać "uszu" i nigdy takich problemów z otwieraniem strony nie miałem.
Wave
  1.     <?php
  2.      if(isset($user_login)) echo &#092;"<a href=new.php>Nowe zgłoszenie</a><BR>\";
  3.      if(isset($user_login)) echo &#092;"<a href=archives.php>Archiwum</a>\";
  4.     ?>

Zapis całkowicie bez sensu.
Cytat
Może rozwiązanie z ID jest niemądre, ale wykorzystuję je tylko do przypisywania znacznikom stylów, więc myślę, że nie w tym problem.

Do tego są klasy.

Na każdej stronie którą odwiedzasz poprzez sesję musi się znaleźć:
  1. <?php
  2. ?>
To chyba jasne. Nie chce mi się wertować tego kodu w poszukiwaniu błędu więc dam Ci mój przykładowy skrypt logowania:
  1. <?
  2. $log='admin';
  3.  
  4. $pas='test';
  5.  
  6. if($_GET['op'] == 'zaloguj') 
  7. {
  8.  
  9.  
  10. if ($_POST['login'] == $log && $_POST['pass'] == $pas)
  11. {
  12.  
  13. session_register(&#092;"login\");
  14.  
  15.  
  16. header(&#092;"Location: ?op=index\");
  17.  
  18. } 
  19. else if(isset($_POST['pass']) || isset($_POST['login'])) echo('Błędny login lub hasło!');
  20.  
  21.  
  22. echo('<form method=\"POST\" action=\"?op=zaloguj\">Login<input type=\"text\" name=\"login\" size=\"20\">
  23. Hasło<input type=\"password\" name=\"pass\" size=\"22\"><input type=\"submit\" value=\"Zaloguj\" name=\"zaloguj\"></form>');
  24. }
  25.  
  26.  
  27. if($_GET['op'] == 'wyloguj')
  28. {
  29. header('Location: ?op=zaloguj');
  30. exit();
  31. }
  32.  
  33.  
  34. if($_GET['op'] == 'index')
  35. {
  36.  
  37.  
  38.  
  39. if ($_SESSION['login'] != $log)
  40. {
  41. header('Location: ?op=zaloguj');
  42. }
  43. echo('Witaj ' .$_SESSION['login']. ' w Strefie Zamkniętej!<br><A href=\"?op=wyloguj\">Wyloguj</A>');
  44.  
  45. }
  46. if ($_SESSION['login'] == $log && empty($_GET['op'])) header('Location: ?op=index');
  47. else if(empty($_GET['op'])) header('Location: ?op=zaloguj');
  48.  
  49. ?>


Mam nadzieję że pomogłem. Pozdrawiam.
hesus
Jakbyś mi wyjaśnił, dlaczego ten zapis jest niemądry, to z pewnością byś pomógł. Powtarzam, że nie skrypt logowania jest tu problemem.
Oczywiście mam session_start() na początku każdej strony. Właśnie sprawdziłem, że jeśli usunę tę funkcję, to linki działają zawsze, nawet, jeśli w na stronie żadnej stronie nie rejestruję żadnych zmiennych sesji.
Help
Wave
Cytat
Jakbyś mi wyjaśnił, dlaczego ten zapis jest niemądry, to z pewnością byś pomógł

Bo wystarczy taki:
  1. <?php
  2.  
  3. if(IsSet($user_login)) 
  4. echo('<a href=\"new.php\">Nowe zgłoszenie</a><BR><a href=\"archives.php\">Archiwum</a>');
  5.  
  6. ?>
hesus
Ehhh... o to Ci chodzi. To tylko chwilowo tak było, bo na etapie testowania łatwiej i szybciej mi było sobie skopiować całą linię zamiast dopisywać kod. Miałem nadzieję, że coś konstruktywnego mi powiesz.
Jakiś błąd z samą sesją chyba robię, ale nie mam pojęcia co jest grane.
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.