# [SOLVED][PHP/MySQL] mysql_connect() i hasło z pliku

## Poe

Hej. musze stworzyc prace z informatyki z wykorzystaniem php i mysql (musze zbudowac strone i musze w niej poupychac jak najwiecej funkcji, ktorych uzywalismy na lekcjach). no i na sile próbuje dodac pare skryptow, ot tak, zeby nie bylo nizszej oceny. i teraz tak. jest funkcja mysql_connect(host,user,passwd); gdy podam to w takiej wersji, łaczy sie z bazą. chciałbym jednak zrobic tak, by czytał hasło z pliku .pass (zadne szyfrowane, chociaz, gdyby sie dało, to prosze o namiary). chcialem to rozwiązac w ten sposób:

```

   $file = fopen(".pass","r");

   $pass=explode('\t',fgets($file,10));

   mysql_connect(localhost,user,$pass)

   or die("Brak połączenia z bazą. Przepraszamy");

```

albo

```

if(isset($_GET["file"],$_GET["pass"]))

   

   $_GET["file"] = fopen(".pass","r");

   $_GET["pass"] = explode('\t',fgets($_GET["file"],10));

   mysql_connect(localhost,root,$_GET["pass"])

   or die("Brak połączenia z bazą. Przepraszamy");

```

konczy się tym:

```

Warning: fgets(): supplied argument is not a valid stream resource in /home/poe/public_html/prj/buy.php on line 47

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: YES) in /home/poe/public_html/prj/buy.php on line 48

Brak połączenia z bazą. Przepraszamy

```

(jeszcze przed chwila nie wyswietlal sie warning dot. fgets(). 

czy ktos tu widzi jakis blad, albo wie jak to inaczej rozwiązac?

pozdrawiam

----------

## v7n

moze sprawdz poprzez echo $pass co tak naprawde wyciagasz z tego pliku ( czy pod $pass kryje sie faktycznie to, co chcesz )

----------

## 13Homer

Jeśli mnie pamięć nie myli to explode tworzy tablicę dzieląc napis w miejscach, gdzie występuje pierwszy parametr (w tym wypadku '\t'). Czyli na $pass masz tablicę (być może jednoelementową), a nie hasło.

EDIT: Dodam jeszcze, że takei rzeczy najlepiej debugować za pomocą print_r a nie echo, bo pokazuje rekurencyjną postać zmiennej, jeśli jest to tablica, więc od razu widać, jakie wartości są w niej kluczami.

----------

## Poe

faktycznie, jest to tablica. po wywolaniu print_r($pass)

```

$file=fopen(".pass","r");

$pass=explode("\t",fgets($file,10));

print_r($pass);

```

dostaje wynik Array( [0] => zawartość_pliku_z_haslem). ok, to skoro tak, to czego innego uzyc do czytania z pliku?

------EDIT------

Ok, poradzilem sobie:

```

$file=fopen(".pass","r");

$pass=fgets($file,10);

mysql_connect(localhost,user,$pass)

```

a czy jest jakas mozliwosc szyfrowania tego ppliku, zeby nie dalo sie odczytac zawartosci go poprzez odpowiedni url?

----------

## c2p

 *Poe wrote:*   

> a czy jest jakas mozliwosc szyfrowania tego ppliku, zeby nie dalo sie odczytac zawartosci go poprzez odpowiedni url?

 

Do .htaccess wrzucić:

```
<Files .pass> order allow,deny deny from all </Files>
```

----------

## 13Homer

 *Poe wrote:*   

> a czy jest jakas mozliwosc szyfrowania tego ppliku

 

Pewnie jest, ale to chyba niepotrzebne, bo...

 *Quote:*   

> , zeby nie dalo sie odczytac zawartosci go poprzez odpowiedni url?

 

...nie wiem po co się tak męczyć. Równie dobrze możesz to hasło wrzucić do osobnego skryptu (powinno wystarczyć tyle: "<? $haslo="<haslo>";?>" albo podobnie, plik może sie nazywać haslo.php) i go zaincludować (require_once "haslo.php"), wtedy dostaniesz to hasło w głównym skrypcie na zmiennej $haslo. Taki plik (.php) po wpisaniu adresu do niego zwróci pustą stronę, bo nigdzie tam nie jest nic wypisywane. Żeby dostać się do tego hasła, trzebaby obejrzeć kod tego skryptu (a przez WWW łatwe to nie jest). Ewentulane de-szyfrowanie możesz zrobić w pliku głównym (wykorzystując oczywiście wartość zmiennej $haslo).

Poza tym jest jeszcze coś takiego jak .htaccess (ale to już serwer WWW a nie php).

----------

## Poe

dziękuje za podrzucenie pomyslu z require_once(). działa ładnie. 

@c2p, moze po drobnym zmodyfikowaniu by zadzialalo, ale w tej wersji w ogole nie mozna dostac sie do tej strony (error 500).

----------

## Poe

a tka się teraz zastanawiam, jak mozna ładnie wykorzystac baze mysqla z wpisami typu BLOB do formularza zamówieniowego. ogolnie mam taką wizję, ze na stronie jest formularz. nad nim wybiera się przyciskami typu radio ilosc pozycji do zamówienia. w zaleznosci od wybranej ilosci (np. 2) pokazywałyby się 2 rozwijalne listy w których bylyby wyswietlane te BLOBy. gdy user wybierze jakiegos BLOBa (np. o nazwie kwiatek) z listy, to po wyslaniu formularza otrzymywałbym na maila nazwę tego BLOBa pobieraną z pola "nazwa". nie wiem czy wystarczająco klarownie to przedstawiłem. ktos ma jakis pomysl jak moznaby to w miare sensownie rozwiązac?

----------

## 13Homer

Chcesz w combo prezentować zawartość BLOBów, czyli np. grafiki? Próbowałem kiedyś, ale mi nie wyszło. We Flashu zapewne się da. Od biedy możnaby zrobić coś takiego, że w combo masz listę np. grafik, jak wybierzesz jakąś pozycję, to na zdarzeniu onchange możesz przeładować formularz i pokazać gdzieś obok podgląd tej grafiki.

Na pewno można zrobić coś takiego: tabela X z polami: nazwa, opis, zawartość. Nazwa to np. klucz główny tabeli (nazwa pliku graficznego), opis to nazwa prezentowana w combo, zawartość to plik (np. graficzny czy pdf). Po wybraniu w combo jakiejś pozycji i wysłaniu formularza można zawartość wysłać mailem jako załącznik o określonej nazwie.

Sprecyzuj może o co Ci chodzi.

----------

## Poe

ma to być formularz do zakupu moich zdjęć. mam galerię we flashu ("simpleviewer"), więć nie mam jak dodać pod zdjęciem linka do kupna, czy cos w tym stylu, więc chciałbym w dziale "kup" miec formularz, gdzie potencjalny klient mógł zakupić sobie 1,2,3,4 czy 5 zdjec wybierajac z combo zdjęcie (dlatego chcialem to jakos BLOBem rozwiązac, zeby widzial jake chce zdjęcie, bo niekoniecznie musi pamiętac tytul. po prostu miniaturka, zeby skojarzył czy to jest na pewno to, co chce i nie mam zadnego pomyslu jak to sensownie rozwiązać. ten pomysł z tabelą nawet niezły jest, musiałbym pomyslec jak to rozwiązac dokladniej..

----------

## weni

Z tym combobox to chodzi o coś takiego: http://tw.ecritters.biz/select-icons/ ?

----------

## Poe

@weni, coś w tym stylu, tyle, że miniaturka miałaby się wyświetlać obok combosa. po wybraniu odpowiedniego wpisu z listy pojawialaby się miniaturka obok. ktos wie jak to uzyskac?

----------

## dziadu

No ba! Sam coś takiego napisałem.. no może nie do końca ale coś w ten deseń, jak zrozumiesz działanie to w pięć minut rozbudujesz całość o brakującą funkcjonalność.

Tak nawiasem mówiąć wykorzystałem do tego JavaScript + technologia DOM, projekt możesz zobaczyć tutaj (ma pewne wady, ale trzy dni przed oddaniem przypadkowo wpisało mi się rm -fr public_html i potem moje wysiłki skupiły się na odzyskaniu projektu a nie jego rozbudowie [mam reiserfs]).

Zobacz na stronę nr 2, tam jest dynamiczne tworzenie elementów HTML za pomocą JS, dodać do tego funkcjonalność w postaci ComboBox jak i miniaturki to już jest na zasadzie skopiuj->wklej->sed s/coś_tam/coś_innego/g. Powodzenia, jakby co to pytaj, mam sesję ale postaram się jakoś pomóc (-:

PS. Odnośnie poczatkowgo tematu wątku, a myślałem o wykorzystaniu md5 i szyfrowaniu zawartości zwykłego pliku tekstowego? Robiłem coś podobnego ale z wykorzystaniem Perla i zapisywałem (tworzyłem, rozbudowywałem) pliki .digest do autoryzacji przez HTTP z wykorzystaniem md5 właśnie.

----------

## 13Homer

Rzeczywiście, za pomocą JS można to zrobić i to nawet dość prosto: trzeba utworzyć skrypt, który zwróci miniaturę takiej grafiki (jeśli grafiki są na dysku w postaci plików, a nie w bazie, to nie trzeba tego skryptu). W JS trzeba na zdarzeniu onLoad wczytać do jakiejś tablicy wszystkie te grafiki (to się chyba nazywa preloading grafik, wykorzystuje się to często gdy przyciski-grafiki na stronie mają się zmieniać na zdarzenie onMauseOver albo onClick, pełno tego na sieci). Teraz tworzysz 2 pola: combo i img z boku. W combo na zdarzeniu onChange podmieniasz atrybut src w img - ponieważ wszystkie grafiki były skeszowane, więc grafika się pojawi od razu.

Pseudo kod wyglądałby jakoś tak:

```

<html>

<head>

<script>

var IMAGE_ADDRESS = 'http://adres/skrypt?id=';

function initImgs() {

var im = document.HomerImgs = new Array(), str;

var imgNames = ['']; // tu trzeba wyiterować za pomocą PHP wszystkie nazwy czy id grafik - będzie to potrzebne

                           // do odwołania się do skryptu albo pliku na serwerze

for (i = 0; i < imgNames.length; ++i) {

    str = IMAGE_ADDRESS + imgNames[i];

    im[i] = new Image();

    im[j].src = str;

}

}

function changeImage(combo) {

    var img = document.images['xyz']; // ???? 

    var comboValue;

    var selIndex = combo.selectedIndex;

    comboValue = combo.options[selIndex].value; // a może inaczej? może zależeć od przeglądarki

    img.src = IMAGE_ADDRESS + combovalue;

}

</script>

</head>

<body onload="initImgs();">

<select onchange="changeImage(this);">

<option value="name1">Opis 1</option>

<option value="name2">Opis 2</option>

</select>

<img name="xyz" src="empty">

</body>

</html>

```

 *Quote:*   

> PS. Odnośnie poczatkowgo tematu wątku, a myślałem o wykorzystaniu md5 i szyfrowaniu zawartości zwykłego pliku tekstowego? Robiłem coś podobnego ale z wykorzystaniem Perla i zapisywałem (tworzyłem, rozbudowywałem) pliki .digest do autoryzacji przez HTTP z wykorzystaniem md5 właśnie.

 

MD5 to hashowanie, a nie szyfrowanie, a tutaj chodziło o to, żeby zawartość pliku odtworzyć, hashowanie jest nieodwracalne.

----------

## Poe

hm, narazie wykoncypowałem ciut inny sposób, moze troche specyficzny.

```

while($row = mysql_fetch_row($result)){

echo("<a href='buy.php?foto=$row[0]' title='zamow' border='0'><img src='thumbs/nature/$row[0].jpg' /></a>  ");}

```

dzięki czemu wyswietlają mi sie ładnie wszystkie zdjęcia, które ładowane są z katalogu, a nie z bazy (z bazy tylko nazwy ciągnie). teraz chcę zrobic tak, zeby po kliknięciu w zdjęcie przeładowywało stronę i to zdjęcie kliknięte pojawiało się rowniez gdzies nizej w tabelce "zamówione", klikając, automatycznie wykonywałby wpis do bazy do innej tabeli pt"zamowienie" do rekordu ID, potem wpisywałoby się do formularza dane osobowe, ktore rowniez beda wysylane do tabeli 'zamowienie' do rekordów osoba i adres. wszystko fajnie, tylko nie potrafie dojsc do tego, jak to zdjecie ma sie pokazywac na dole...

----------

## dziadu

A mechanizm sesji? Możesz w nim zapamiętać wybrane zdjęcia i po przeładowniu wyświetlić co trzeba.

PS. Sorry za te md5, rzeczywiście głupota, ale od 3 w nocy przepisywałem notatki i byłem, z lekka mówiąc, trochę już ogłupiały/zaspany  :Smile: 

----------

## 13Homer

Ja bym tak nie robił, śmiecenie w bazie to zawsze jest brzydkie rozwiązanie (co zrobić, gdy użytkownik nie zdecyduje się na kupno?), lepiej przekazywać za każdym razem postem tablicę z nazwami wybranych elementów, albo trzymać tę tablicę w sesji, ewentualnie cookies. Podczas iteracji górnej części można sprawdzać, czy dana grafika nie został już wybrana (id==nazwa, więc wszystko jest dużo prostsze) i jeśli tak, to jej nie prezentować. A na dole przeiterować tę tabelę i pokazać odpowiednie grafiki.

----------

