Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 10 z 15

Wątek: Zapisywanie wiadomości do pliku .txt oraz zagnieżdżanie warunku.

  1. #1

    Zapisywanie wiadomości do pliku .txt oraz zagnieżdżanie warunku.

    Witam.
    Mam problem z zapisywaniem wiadomości wysyłanych do bota w plik .txt. Chciałbym, aby każda wiadomość była zapisywana w nowym wierszu. Świetnie byłoby, jakby jeszcze do tego był dodawany numer osoby piszącej. Problem polega na tym, że udaje mi się tylko zapisywać jedną linię ciągłą i takie coś jest kompletnie nieczytelne. Zrobiłem to tak:

    Kod php:
    $dane $HTTP_RAW_POST_DATA;
    $file "informacje.txt";
    $fp fopen($file"a+");
    fwrite($fp$dane);
    fclose($fp); 
    Potem próbowałem, aby każda wiadomość była w nowej linii dodając $HTTP_RAW_POST_DATA = "\n"; ale to jedynie skutkowało tworzeniu się nowych pustych linii.
    Nie wiem jak to rozwiązać.

    Od razu mam też drugie pytanie.
    Chciałem zrobić zagnieżdżanie warunków, gdzie spełnieniem warunku byłoby odpowiadanie na pytanie - coś w rodzaju quizu. Aby móc później to rozwinąć, na przykład za odpowiedź dać punkt chciałem rozbić switch, gdyż wcześniej na tym to opierałem. Wadą switcha jest to, że na przykład można było udzielić odpowiedzi na następne pytanie, a z warunkiem if wyobrażałem to sobie, że nie jest możliwe przejście do następnego pytania bez poprawnej odpowiedzi na aktualne. Również możliwe jest wtedy napisanie kilka wariantów odpowiedzi, tzn. że nie musi się akurat zaczynać wielką literą, bądź małą, czyli można to uwzględnić poprzez || w warunku.
    Przykład jak chciałem to rozwiązać, a nie wychodzi:
    Kod php:
    $początek "zaczynajmy";
    $początek2 "Zaczynajmy";
    $odp "tak";
    $odp2 "nie";
    if((
    $początek == $HTTP_RAW_POST_DATA) || ($początek2 == $HTTP_RAW_POST_DATA)) {
        
    $M->addText("Oczywiście. Czy ptaki latają? A. Nie \n B. Tak"); 
        
        
      if(
    $odp $HTTP_RAW_POST_DATA) {
        
    $M->addText("Dobrze. Następne pytanie...");
      }
        if( 
    $coś tam $HTTP_RAW_POST_DATA) {
          
    $M->addText("I tak dalej...");
        }
    }
    else {
        
    $M->addBBcode('Napisz [u]zaczynajmy[/u]');
        }; 
    Przy czym "zaczynamy" jakby rozpoczyna "moduł" quizu. Niestety to nie działa tak jak myślałem. Chyba zachodzi kolizja w $HTTP_RAW_POST_DATA. Domyślanie chciałem, aby po "zaczynamy" następowało pytanie. Udzieleniem dobrej odpowiedzi, a więc spełnienie następnego warunku przenosi do następnego pytania i następny warunek. A więc zagnieżdżone w sobie if.
    A może inaczej to rozwiązać? Może kombinacja if i switch?
    Dziękuję z góry.

  2. #2
    Super Moderator Awatar Qrix
    Dołączył
    09.02.2009
    Lokalizacja
    Łódź
    Marka tel.
    Sony
    Model tel.
    Xperia M2 LTE
    FW telefonu
    Android 4.4.4
    Posty
    4,513
    Jak już to robisz to z kropką
    Kod:
    $HTTP_RAW_POST_DATA .= "\n";
    Numer GG osoby wysyłającej wiadomość uzyskasz z $_GET['from'].

    Co do drugiego:
    a jak ktoś wpisze przypadkiem "ZAczynajmy" bo shifta nie puści na czas? :> Najlepiej zmienić wszystkie litery w $HTTP_RAW_POST_DATA na małe literki. strtolower Ci w tym pomoże. Nie zaszkodzi też dać trim na wynik funkcji, gdyż ktoś może przypadkiem wysłać białe znaki w wiadomości.
    Zagnieżdżanie ifaniewiele Ci pomoże bo musisz gdzieś przechowywać informację o stanie gry. Kiedy napiszę "Zaczynajmy" to wykonany jest skrypt od początku do końca, nie zatrzymuje się nigdzie i nie czeka aż udzielimy odpowiedzi. Obecnie wygląda to tak:
    Ja: Zaczynajmy
    Bot: Oczywiście. Czy ptaki latają? A. Nie \n B. Tak
    Ja: A
    Bot: Napisz zaczynajmy
    i bot na "A" nie odpowie tak jak powinien, bo gdy napiszę "A" to skrypt znowu wykonuje się od początku.

    Generalnie jeśli budujesz quiz to warto zrobić bazę pytań (np. w pliku) i losować je użytkownikowi. Dodatkowo gdzieś w bazie (lub pliku) przechowywać informację o tym na odpowiedź do którego pytania skrypt oczekuje przy danym użytkowniku np.
    Jeśli pisze GG:100, to wysłana odpowiedź dotyczy pytania nr. 123
    Ostatnio edytowane przez Qrix ; 04.11.2012 o 20:00

  3. #3
    Doświadczony GGadacz
    Dołączył
    01.06.2011
    Lokalizacja
    Lębork
    Marka tel.
    Sony
    Model tel.
    Xperia M2
    FW telefonu
    Android 5.1
    Posty
    262
    Jak ogarniasz MySQL to ci nawet mogę taki skrypcik na Quiz podesłać. Akurat dzisiaj sb napisałem.
    W skrypcie jest tak:
    -Dodawanie zagadki wraz z odp(odp to jedno słowo ale można to zmienić).
    -Losowanie zagadki co 60 sekund,
    -Po dobrej odp losowanie zagadki,
    -Zagadka się zgadnie jeżeli w zdaniu pojawi się słowo z odpowiedzią.

  4. #4
    Kod php:
    $dane $HTTP_RAW_POST_DATA " " $_GET['from'] . "\n"
    $file "informacje.txt";
    $fp fopen($file"a+");
    fwrite($fp$dane);
    fclose($fp); 
    Działa idealnie. Właśnie taki efekt chciałem osiągnąć. Nie wiem czemu sam na takie proste rozwiązanie nie wpadłem. Jeśli będzie naraz więcej osób korzystało z bota, to żeby nie było problemów z zapisywanie to trzeba zastosować blokowanie pliku przy zapisywaniu? Na przykład poprzez fclose($fp); Nie wiem czy to jest konieczne.
    Również strtolower działa poprawnie. Zastosowałem to w if przy $HTTP_RAW_POST_DATA.
    Kod php:
    if($początek == strtolower($HTTP_RAW_POST_DATA)) 
    Dzięki temu oszczędzi mi się wiele pisania. Dziękuję.

    Jednak będę musiał zrobić bazę pytań w pliku. Domyślam się, że wtedy każde pytanie w oddzielnej linii i losować po prostu linie. Wtedy też w oddzielnym pliku, jak wspomniał Qrix, odpowiedzi i zrobić warunek?
    Załóżmy, że tak:
    $linia_z_pliku = fgets($pytania); // to wyciągnie nam jedno pytanie (zakładające, że każde pytanie to oddzielna linia) z bazy pytań w pliku.
    To teraz jak zrobić losowanie? Jak użyję switch i rand to minie się z celem. Może użyć if z rand, ale jak losować wtedy linię i w dodatku przyporządkować dobrą odpowiedź do tego? Nie za bardzo wiem jak nad tym zapanować.

    Niestety nie ogarniam MySQL, ale będę chciał spróbować.

  5. #5
    Super Moderator Awatar Qrix
    Dołączył
    09.02.2009
    Lokalizacja
    Łódź
    Marka tel.
    Sony
    Model tel.
    Xperia M2 LTE
    FW telefonu
    Android 4.4.4
    Posty
    4,513
    Najlepiej jeśli chociaż te logi (punkt pierwszy) zapisywać będziesz w bazie - nie będziesz musiał się bawić w blokowanie zapisu do pliku

    co do pytań w pliku to ja bym zrobił je w formie pliku PHP, gdzie pytania będą trzymane w tablicy. Przykładowo pytanie numer 3:
    Kod php:
    $pytanie[3]['tresc']='Stolicą Polski jest...';
    $pytanie[3]['podpowiedzi']='A: Warszawa, B: Wisła, C: Europa';
    $pytanie[3]['odpowiedz']='a'
    Pytania numerując od 0. Znając ich liczbę możesz wtedy losować sobie numer pytania:
    Kod php:
    $numerPytania=rand ILOSC_PYTAN );
    $M->addBBCode($pytanie[$numerPytania]['tresc']); 
    Taki plik z pytaniami zwyczajnie includujesz, np. include('pytania.php'); albo bardziej poprawnie w tym wypadku include_once('pytania.php');
    Ostatnio edytowane przez Qrix ; 06.11.2012 o 13:41

  6. #6
    Doświadczony GGadacz
    Dołączył
    01.06.2011
    Lokalizacja
    Lębork
    Marka tel.
    Sony
    Model tel.
    Xperia M2
    FW telefonu
    Android 5.1
    Posty
    262
    Qurix a nie łatwiej byłoby stworzyć normalny plik txt i do niego zapisywać tablicę po serialize. ? W pliku php musiał by dodawac pytania manualnie a tak mogł by dodac je przez gg np. :p i w rand musi być o ile wiem $ilośc_pytan - 1 bo tablice liczone są od 0

  7. #7
    Jakoś nie zależy mi na dodawaniu pytań przez GG. Baza pytań ewentualnie będzie lekko modyfikowana. Bardziej by mi zależało na zliczaniu punktów i tutaj może być chyba decydujące, czy w pliku, czy w skrypcie. Myślałem tak, że np. jak w pliku to do każdej odpowiedzi dopisywać ; i wtedy rozbijać tablicę do średnika, gdzie byłaby cyfra 1. Wtedy utworzyć funkcje function dodaj i jako argumenty dać wartości rozbite z tablicy i potem instrukcję dodającą te argumenty. Możliwe, że ja myślę teraz bardzo okrężnie i niepotrzebnie komplikuję sprawę. Co by oczywiście chyba wymagało kolejnego pliku, w którym byłby trzymany wynik typu "top 3".

    Jakoś nie za bardzo wyszło mi to co podałeś, Qrix. Coś muszę robić źle, albo nie zrozumiałem do końca.
    Utworzyłem bazę pytań z trzema przykładowymi pytaniami licząc od zera:
    Kod php:
    <?
      ///TABLICA PYTAŃ///
       
        $pytanie[0]['treść'] = 'Mickiewicz to:';
        $pytanie[0]['warianty'] = 'A. Poeta, B. Pisarz, C. Kucharz, D. Lotnik';
        $pytanie[0]['odpowiedź'] = 'a';
        $pytanie[1]['treść'] = 'Polska to:';
        $pytanie[1]['warianty'] = 'A. Kraj, B. Kontynent, C. Morze, D. Owoc';
        $pytanie[1]['odpowiedź'] = 'a';
        $pytanie[2]['treść'] = 'Treść pytania';
        $pytanie[2]['warianty'] = 'A. WA, B. WB, C. WC, D. WD';
        $pytanie[2]['odpowiedź'] = 'b';
    ?>
    Chyba, że to miałem stworzyć za pomocą array.
    W skrypcie głównym dołączyłem bazę za pomocą include_once. A potem skrypt do odtwarzania pytań:
    Kod php:
    $numerPytania=rand );
    $M->addBBCode($pytanie[$numerPytania]['tresc']); 
    Ale niestety nie daje to żadnego efektu. Mam jeszcze zdefiniować $numerPytania? Bo chyba coś brakuje.

  8. #8
    Super Moderator Awatar Qrix
    Dołączył
    09.02.2009
    Lokalizacja
    Łódź
    Marka tel.
    Sony
    Model tel.
    Xperia M2 LTE
    FW telefonu
    Android 4.4.4
    Posty
    4,513
    Oczywiście Ruloo ma rację i w rand ilość pytań musisz pomniejszyć o 1 czyli
    Kod php:
    $numerPytania=rand ILOSC_PYTAN -); 
    a w Twoim konkretnym wypadku
    Kod php:
    $numerPytania=rand 2); 
    Błąd masz tutaj:

    $pytanie[0]['treść'] = 'Mickiewicz to:';

    $M->addBBCode($pytanie[$numerPytania]['tresc']);
    Po prostu nie używaj polskich znaków w indeksach tablicy lub przyjmij jakąś inną konwencję by Ci się nie myliło


    Jeśli chcesz zrobić ranking użytkowników, to bazą będzie łatwiej. W pliku możesz zrobić to w ten sposób w jaki podałeś, ale bezpieczniej będzie zapisywać i trzymać wyniki dla każdego użytkownika z osobna. Wtedy nie powinny pojawić się konflikty w dostępie do pliku gdy kilku użytkowników będzie korzystać z quizu, a i zapis wyników powinien być szybszy.
    Ostatnio edytowane przez Qrix ; 06.11.2012 o 20:28

  9. #9
    Po zamienieniu znaków polskich z indeksów tablicy działa tak jak zakładało się.
    Tylko teraz nachodzi mnie kolejne pytanie. Skoro ma generować cały czas pytania, to jak zrobić warunek, żeby przy dobrej odpowiedzi generowało następne. Chyba danie warunku typu
    Kod php:
    if($HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz'])
        
    $M->addText("dobrze"); 
    za wiele nie da. Trzeba by było generować zaraz następne po wpisaniu dobrej odpowiedzi.

    A może zastosować pętlę for? Wtedy będzie inicjacją wyświetlenie pytania, warunkiem podanie dobrej odpowiedzi, a zmianą spełnienie warunku. Czyli tak trochę na odwrót. Chyba coś pokręciłem.

    Chodzi Tobie, że w bazie trzymać dla każdego z osoba? W sumie to tak...
    Może doradzicie jakiś dobry poradnik/kurs MySQL internetowy? Jak spojrzałem na tę bazę to nie miałem pojęcia co i jak. Dodam, że tam mam phpAdmin. Albo może Wy pomożecie mi to pojąć?
    Ostatnio edytowane przez Artyliusz ; 07.11.2012 o 15:11 Powód: Pętla for

  10. #10
    Doświadczony GGadacz
    Dołączył
    27.03.2012
    Posty
    131
    Ciekawy kurs MySQL masz na tej stronie

Podobne wątki

  1. Odpowiedzi: 5
    Ostatni post / autor: 05.01.2017, 10:46
  2. [iOS] Zapisywanie zdjęcia w rolce aparatu.
    By madhunt3r in forum Ciekawe sugestie
    Odpowiedzi: 4
    Ostatni post / autor: 15.11.2015, 22:35
  3. Przesyłanie pliku - sugestie
    By GruzdiX in forum Ciekawe sugestie
    Odpowiedzi: 0
    Ostatni post / autor: 01.11.2012, 15:27
  4. Nie prawidłowe wysyłanie i odbieranie wiadomości
    By gsd in forum Aplikacja Windows Phone
    Odpowiedzi: 1
    Ostatni post / autor: 20.08.2012, 17:44
  5. Odpowiedzi: 1
    Ostatni post / autor: 19.03.2012, 11:40

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •