Strona 5 z 6

: 03 sierpnia 2007, 14:55
autor: Demerzel
Znalazłem serwerek żeby się pobawić ale niema na nim praktycznie żadnych ułatwień. Pisząc małe co nieco do zaglądania do bazy MySQL robie jakiś głupi błąd i kręcę się w kółko.

Kod: Zaznacz cały

<?php
	$form =<<< EOF
	<H1>form</H1>
	EOF;
	if(isset($_POST['abba']))//Tu błąd
	{
	$sql_conn=mysql_connect('','','');
	mysql_select_db('',$sql_conn) or die ("bł

: 03 sierpnia 2007, 16:57
autor: jang

Kod: Zaznacz cały

$form ="<H1>form</H1>";

: 03 sierpnia 2007, 17:03
autor: Demerzel
To nie załatwia sprawy bo nagłówek jest tylko przykładem a w środku ma być cały formularz, próbowałem tak i się wywróciło. Ale rozwiązanie już znalazłem Przed EOF zlikwidowałem tabulacje i zaskoczyło. Dziwne ale działa.

[ Dodano: 2007-08-03, 17:34 ]
Prześladuje mnie jednak nieco inny problem. Kiedy wysyłam z formularza jakieś dane poczym stawiam warunek

Kod: Zaznacz cały

isset($_POST['zmienna'])
Dochodzi do czegoś takiego:
-naciskam wyślij niewpisując nic do pola text w formulażu nic nie wyświetla
-wpisze coś wyświetla zgodnie z warunkiem
-wyśle formularz z pustym polem text warunek isset zachowa się jakby pole było ustawione
probowałem tego uniknąć przez

Kod: Zaznacz cały

unset($_POST['zmienna']
nie bardzo mi się to udało.

: 04 sierpnia 2007, 15:59
autor: Stawi
isset() sprawdza czy zmienna jest ustwiona (rozna od null), a pusty tekst nie jest nullem. Lepiej zrobic to przez samym ifem albo if(!empty()) wychodzi na to samo.

Ogolnie to:

Kod: Zaznacz cały

if ($var) === if (!empty($var))
if (isset($var)) === if (!is_null($var))
if (is_scalar($var)) === if (is_bool($var) || is_int($var) || is_real($var) || is_string($var))
if (is_numeric($var)) === if (is_int($var) || is_real($var))  // i stringi liczbowe
A unset() usuwa zmienna, wiec na 99.999% tego nie chcesz ;)

: 04 sierpnia 2007, 16:46
autor: Demerzel
Za chwile powalczę z zaproponowanymi zmianami w kodzie. Tymczasem myślę nad metodą zabezpieczenia pliku który jest potrzebny do jako takiego zarządzania bazą danych. Wygląda to tak, jest serwer i trochę miejsca ale żadnych udogodnień więc napisałem sobie małe co nieco. Niestety jak zaczną się odwiedziny potrzebne będzie zabezpieczenie tego hasłem.
Pierwszy pomysł to zrobienie formularza potem if i porównanie wpisu do hasła w kodzie. Są jakieś lepsze metody gdzie:
-hasło wpisuje tylko raz i pracuje
-niema ryzyka iż hasło zostanie wyciągnięte przez kogoś niepowołanego
-metoda nie wymaga "cudów na wianku" ;) (sesji w domyśle)

Kod: Zaznacz cały

<HTML>
 <HEAD>
	<TITLE>MySQLAdmin</TITLE>
 </HEAD>
<BODY>
<?php
$serwer="";
$uzytkownik="";
$baza=$uzytkownik;
$haslo="";
$zmienna = <<< EOF
	<H2 align="center">MySQLAdmin</H2>
	<hr>
	

[b]Wy

: 05 sierpnia 2007, 16:19
autor: Stawi
Demerzel pisze:Pierwszy pomysł to zrobienie formularza potem if i porównanie wpisu do hasła w kodzie. Są jakieś lepsze metody gdzie:
-hasło wpisuje tylko raz i pracuje
-niema ryzyka iż hasło zostanie wyciągnięte przez kogoś niepowołanego
-metoda nie wymaga "cudów na wianku" ]
Logowanie prez sesje nie jest trudne, wystarczy session_start() na poczatku i pozamiatane ;)
Potem cos w stylu:

Kod: Zaznacz cały

if (count($_POST)) { // sprawdzamy czy zostala wywolana akcja przez POST
  if (($_POST['user'] == 'admin') && ($_POST['pass'] = 'debianrules')) { // czy dane sa prawidlowe?
    $_SESSION['zalogowany'] = true;  // zapisz ze zalogowano
  } else {
    $_SESSION['zalogowany'] = false;
  }
}
Zamiast drugiej liniki "nachamowej" mozna zrobic cos takiego, jesli potrzeba dostepu przez uzytkownikow:

Kod: Zaznacz cały

if (login_ok($_POST['user'], $_POST['pass'])
No i oczywiscie funkcje login_ok() w postaci:

Kod: Zaznacz cały

function login_ok($user, $pass) {
  $result = mysql_query("SELECT 1 FROM users WHERE user_name='{$user}' AND user_pass='{$pass}'");
  return (mysql_num_rows($result) > 0);
}
Oczywiscie z przyczyn bezpieczenstwa polecam zapisyuwanie hasel w poscaci zaszyfrowanej, chocby przez glupie md5().
Tabela users powinna miec index unique na kolumne user_name.
Demerzel pisze:Również szukałem jak zrobić aby automatycznie wyszukiwał powtarzające sie słowa w zmiennej "słowa". Czy da się to zrobić prościej niż dwiema tablicami, przepisując z tablicy a do b przed przepisaniem z a do b sprawdzać czy w b jest takie słowo jak to to go nie przepisywać?
Polecam zapoznac sie z funkcja array_unique() i sprytnie jej uzyc. Wskazowka: explode, array_unique, implode ;)

: 07 sierpnia 2007, 19:34
autor: Demerzel
Zrobienie wyszukiwania powtarzających sie słów zajęło minutkę, dzięki.

Kod: Zaznacz cały

$podzielone = explode(" ", $slowa);
        $unikatowe = array_unique ($podzielone);
        $slowa = implode(" ", $unikatowe);
Co do prostoty sesji. Robiłem kiedyś stronę z tabelką zachowującą się jak ramka na sesji. Od tamtego czasu jakoś nie lubię pracować z sesjami ale jak mus to mus.

: 09 sierpnia 2007, 00:46
autor: Stawi
Demerzel pisze:Co do prostoty sesji. Robiłem kiedyś stronę z tabelką zachowującą się jak ramka na sesji. Od tamtego czasu jakoś nie lubię pracować z sesjami ale jak mus to mus.
Mam na koncie kilka duzych i kilkanascie mniejszych projektow. 90% z nich kozysta z sesji. Najczesciej tam gdzie jest wymagane logowanie, ale tez tam gdzie wymagane jest monitorowanie odwiedzajacych sesje to jedyne wyjscie. Oczywiscie nie mowie tu tylko o php-sessions (tym standardowym session_start itd). Tego uzywam jak potrzeba minimum, do wiekszych rzeczy korzystam z wlasnej biblioteki ktora opiera sesje na bazie danych. Wiem ze nie jest to do konca super wydajne bo kazda odslona powoduje zapis do bazy, jednak dla stron o stosunkowo niewielkiej ilosci odslon (ponizej tysiaca dziennie) nie robi to zadnych problemow, a daje duzo wieksza funkcjonalnosc, jak chocby widok od strony administracyjnej kto jest, na ktorej stronie i co robi.

Sesje nie sa zle jak je znasz, a duzo roboty z tym nie ma. Tak jak pisalem, session_start() i potem uzywac $_SESSION i wlasciwie tyle na poczatek starczy ;)

: 16 sierpnia 2007, 17:21
autor: Demerzel
Jakby komuś było potrzeba:

Kod: Zaznacz cały

<?php
	session_start();
	if(($_POST['user']=='imie')&&($_POST['password']=='hasło')) $_SESSION['logowanie']='true';
	else $_SESSION['logowanie']= 'false';
	if($_SESSION['logowanie'] == 'true')
	{
		$przenies = "cel.php";
		header("HTTP/1.1");
		header("Cache-Control: no-cache, must-revalidate");
		header("Location: ".$przenies);
	}
	else
	{
$form = <<< EOF
<form action="sesja.php" method="post">
	

użytkownik:<input type="text" name="user"></p>

	

hasło:<input type="password" name="password"></p>
	<input type="submit" value="zaloguj">
</form>
EOF;
	echo $form;
}
?>
Jakieś propozycje poprawek?

: 20 sierpnia 2007, 18:01
autor: Stawi
Do $_SESSION['logowanie'] zapisywal bym true i false jako bool (bez cudzyslowow) a nie stringi (z cudzyslowami). Niby to samo ale jednak profesjonalniej.
Przenoszenie na inny adres powinno byc wykonane tak:

Kod: Zaznacz cały

header('Status: 302 Found');
header("Location: nowyadres");
Dodawanie headera HTTP/1.1 nie ma sensu bo robi to apache sam od siebie ;)

A co do tego echo formy.. mozna zrobic tak:

Kod: Zaznacz cały

echo <<<EOF
<form>
  ...
</form>
EOF;
bo po co tworzyc zmienna jak tylko jest wyswietlona i to zaraz, albo wrecz przerwac PHP zrobic normalnie i napisac normalnie kod w html i rozpoczac PHP jeszcze raz. Dziala CHYBA najszybciej, i jak uzywasz jakiegos dobrego edytorka to ci nawet bedzie uzupelnial skladnie ;)
Jak nie do konca jest jasne to przykad:

Kod: Zaznacz cały

<?
  // KOD PHP
  if ($cokolwiek) {
?>
To zostanie wyswietlone jako [b]normalny[/b] tekst.
<?
  } else {
    //cos tam dalej..
  }
?>
I jeszce uwaga co do "Cache-Control". Niektore przeglarki maja to gdzies i i tak keszuja.. Dobrze podawac tez date modyfikacji z przeszlosci dla wiekszej pewnosci. Osobiscie nie podaje nic pozatym co podalem, i dziala dobrze.