[PHP] Losowy cytat - poszukuję


(Jaro070) #1

Witam,

Poszukuję skryptu PHP, który będzie wyświetlał losowy cytat. Ważne żeby można było łatwo dodawać/usuwać cytaty.

Z góry dziękuję za pomoc.


(Drobok) #2

Spróbuj utworzyć na serwerze plik cytaty.txt (jeden cytat na jedną linię).

A potem w miejscu gdzie chcesz wyświetlić dajesz:

<?php $l=file("cytaty.txt"); echo $l[array_rand($l)]; ?>[/code]

Oczywiście rozwiązanie optymalne nie jest (lepiej by było z bazą danych, ale musiałbyś obsłużyć dodawanie)


(R@z0r) #3

Weź random i przypisuj jako id z bazy danych i pozamiatane.

-- Dodane 20.02.2012 (Pn) 17:29 --

<?php $l=file("cytaty.txt"); echo $l[array_rand($l)]; ?>[/code]

php linie w plikach txt widzi jak tablice indexowaną?


(Grzesie K) #4

http://php.net/manual/pl/function.file.php


(Jaro070) #5

@drobok

Chcę ten skrypt podpiąć pod MyBB, więc pobieranie cytatów z bazy będzie pewnie lepszym wyborem. Nie za bardzo umie PHP i MySQL, więc proszę o jasne instrukcję jak taki skrypt mam napisać.


(struart) #6
<?php

$query="SELECT * FROM 'CYTATY' ORDER BY RAND() LIMIT 1";

$result = mysql_query($query);

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

echo "{$row['tresc_cytatu']}";

}

?>

To tak na szybko bez sprawdzenia tworzysz tabele CYTATY i w niej masz tresc_cytatu , która zawiera cytaty. Nie jest to najlepsze rozwiązanie, ale najłatwiejsze. Inne to najpierw zapytać o listę ID cytatów i z nich wylosować i potem zapytać bazę o cytat o danym ID (mam gdzieś podobny skrypt jak wrócę do domu to spróbuję dopasować).

Nie wiem jak z wydajnością, ale przypuszczam, że nie będzie cytatów jakoś strasznie dużo.

Pozostaje dopisać dodawanie i usuwanie wpisów.


(R@z0r) #7

Tak nie potrzebnie pobieramy wszystko z bazy, a przy cytatach to będzie dość sporo trwać (przykładowe pliki z cytatami jak sprawdzałem mają ok 300-1500 o.0 zależnie od kategorii czyli nie tak mało :stuck_out_tongue: ). Lepiej:

<?php

  $rand = rand(min, max); //np: rand(1, 150) przy 150 cytatach, normalnie było by od 0 ale oczywiście id 0 mieć nie będziesz ;) 

  $query="SELECT tresc_cytatu FROM cytaty where id_cytatu = '$rand'";

  $result = mysql_query($query) or die ('Błąd zapytania o cytat: ' . mysql_error());

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

  echo "$row['tresc_cytatu']
";

?>

(Drobok) #8

Pobiera jeden cytat a nie wszystkie. Pomijając fakt użycia *, oraz rand w zapytaniu będzie działać. Twoje jest bardziej optymalne. Ale skoro piszesz pod mybb to wypadałoby skorzystać z klasy mysql'a mybb :slight_smile: Nie wiem czy przejdzie takie coś :slight_smile:


(R@z0r) #9

Włśnie, że wszystkie. Normalnie LIMIT wygląda tak LIMIT 1, 10 (liczby oczywiście przypadkowe), ale pierwsza nie oznacza ilości, a od którego pobieramy. W ten sposób pobierzemy 10 rekordów od 1.


(Drobok) #10

Pierwsza oznacza początek przedziału, ale tylko jeśli oznaczysz jego koniec :slight_smile:


(struart) #11

Dodałbym jeszcze do kodu R@zora linijki które by losowały z tablicy zawierającej ID cytatów w bazie wtedy by działało niezależnie od ilości wpisów w bazie (aktualnie jest powiedzmy odgórnie ustalone, że 150 wpisów jest) i nie było by problemu gdy wylosowaną liczbą była np 15, której w bazie nie ma bo powiedzmy kolega sobie 15 cytat z bazy usunął no chyba, że ID_CYTATU nie byłoby auto_increment i nie byłoby "pustych miejsc".

Mam nadzieje, że jasno to opisałem.

Pozdrawiam.


(R@z0r) #12

No to wtedy z id twórz sobie tablice. I w rand wpisz zmienną zawierającą długość tablicy lub mysql_num_rows($result);


(Jaro070) #13

Dziękuję wszystkim za pomoc, mam nadzieję, że sobie poradzę z zakodowaniem tego żeby zadziałało z MyBB.