[PHP] Losowy cytat - poszukuję

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.

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)

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ą?

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

@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ć.

<?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.

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']
";

?>

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:

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.

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

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.

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

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