Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PHP / MySQL] - Edycja tabeli przy użyciu formularza.

11111olo 29 Mar 2016 15:07 795 22
  • #1 29 Mar 2016 15:07
    11111olo
    Poziom 43  

    Witam.
    Chciałem na stronie dodać najczęściej odwiedzane tematy.
    Wydaje mi się, ze nie jest to skomplikowane, jednak zanim bym to zrobił muszę jeszcze uzupełnić tabelkę w bazie i nie chcę tego robić przez PHP MyAdmin.
    Dlatego wpadłem na pomysł aby dodać formularz, który zawierałby odczytane wszystkie pola z określonej tabeli.
    Próbowałem znaleźć jakąś podpowiedź, jednak nawet skopiowanie czegoś powoduje wyświetlenie jakiegoś błędu, i nie jest to błąd składni.

    Na początku chciałem odczytać ile wierszy zawiera tabela.

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Błąd pojawia się w linii odczytującej ilość wierszy - $num_rows = mysqli_num_rows($sqlString); .
    Proszę o podpowiedź co robię nie tak.

    0 22
  • Pomocny post
    #2 29 Mar 2016 15:18
    szwagros
    Poziom 30  

    11111olo napisał:
    Błąd pojawia się w linii odczytującej ilość wierszy - $num_rows = mysqli_num_rows($sqlString);

    Powinieneś użyć wyniku zapytania sql zamiast samego zapytania:
    $num_rows = mysqli_num_rows($sqlwynik);

    0
  • #3 30 Mar 2016 12:26
    11111olo
    Poziom 43  

    szwagros pomogłeś i dobrnąłem prawie do końca.
    Jednak teraz nie chce mi się zapisać zmieniona wartość do tabeli w bazie.

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Pojawia się komunikat o nieistniejącej kolumnie.
    Error in execution: Unknown column 'nazwa jaka chce wpisać' in 'field list'
    Nazwa nieistniejącej kolumny jest taka sama jak nazwa zmiennej $nowa_wartosc.
    Kolumna nazwa w bazie jest typu TEXT.

    0
  • #4 30 Mar 2016 13:55
    szwagros
    Poziom 30  

    Nie tędy droga.
    Spróbuj tak:

    Kod: php
    Zaloguj się, aby zobaczyć kod

    Jeśli uprzesz się przy REPLACE, musisz w zapytaniu podać index pozycji którą chcesz zamienić.

    0
  • #5 30 Mar 2016 13:58
    arnoldziq
    Moderator Programowanie

    Sugeruję zacząć od niewielkiej, ale bardzo znaczącej zmiany :

    Kod: php
    Zaloguj się, aby zobaczyć kod
    na :
    Kod: php
    Zaloguj się, aby zobaczyć kod

    0
  • #6 30 Mar 2016 15:19
    11111olo
    Poziom 43  

    szwagros masz rację tylko, że UPDATE nie zaktualizuje czegoś czego nie ma.
    arnoldziq kiedyś już mi pomogłeś przy licznikach odwiedzin, jednak wpis przy zapisie wygląda tak

    Kod: php
    Zaloguj się, aby zobaczyć kod

    i co ciekawe działa. Tylko dlaczego?
    Zobacz database.php w funkcji WriteIle Link.
    Domyśliłem się, że brak ' może być problemem, jednak teraz za każdym razem jest dodawany nowy wpis.

    A efekt jest taki:

    1 wpis
    1 nowywpis
    2 wpis2
    3 wpis3
    3 nowywpis
    itd.

    0
  • #7 30 Mar 2016 16:20
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    i co ciekawe działa. Tylko dlaczego?
    Nic w tym ciekawego.
    Do momentu, aż zawartość zmiennej $nowa_wartosc nie pokryje się (przez przypadek) z nazwą tabeli albo kolumny albo predefiniowanej funkcji jak chociażby ten 'TEXT' z pierwszego postu.
    Dodając znaki ' unikasz takich problemów. Ale co ja tam wiem...
    Skoro dział, to działa.

    Nie rozumiem tylko, po co kolega zwraca się po radę, skoro ma w d... nasze odpowiedzi?

    0
  • #8 30 Mar 2016 16:41
    11111olo
    Poziom 43  

    Nie mam nikogo w d.... Sam napisałeś to z błędem a ja o tym do dziś nie wiedziałem, i tylko dlatego spytałem.
    Nie zmienia to faktu, ze na REPLACE INTO to nie działa.

    Przy użyciu UPDATE to działa, tylko szwagros popełniłeś drobny błąd przy nazwie kolumn lub zmiennych, jednak to już ogarnąłem.

    Mam jeszcze jeden kłopot z formularzem.
    Po wypełnieniu pól formularza, które są rodzaju TEXT, w adresie strony pojawia się to co jest wpisane w polach.
    Gdy nie ma przerw, to wszystko jest OK.
    Gdy one są to wygląda to tak:

    Code:
    ?ed1=2&ed2=_pusty22&ed3=pusty+2&ed4=

    Jak to zrobić lub poprawnie odczytać lub wysłać, aby zamiast znaku + była przerwa?

    arnoldziq nie zawsze każdy post jest pomocny, co nie umniejsza Twojego wkładu.
    Odczyt wartości do wpisania:
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Formularz:
    Kod: php
    Zaloguj się, aby zobaczyć kod

    0
  • #9 30 Mar 2016 16:59
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    Nie zmienia to faktu, ze na REPLACE INTO to nie działa.
    Może gdyby sie kolega zdobył na minimum wysiłku i zamieścił strukturę tej tabeli, to coś dałoby się wymyślić.

    Co do wysyłania danych tekstowych, to sugeruję użyć metody POST i problem z kodowaniem znaków ustąpi.

    0
  • #11 30 Mar 2016 17:23
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    A to odpowiedź na twoje drugie pytanie.
    Wystarczy, jak kolega zamieci skrypt SQL zawierający CREATE TABLE....
    Przepisywanie z obrazka danych, żeby utworzy taką tabelę, to strata czasu.

    0
  • #13 30 Mar 2016 18:10
    arnoldziq
    Moderator Programowanie

    Mam kilka pytań, co do tej tabeli.
    1. W jakim celu jest dodana kolumna 'index', skoro nie nie jest ona elementem głównego index-u?
    2. Jak udało się koledze dodać puste rekordy do tabeli, skoro wszystkie zmienne są opisane 'NOT NULL'?
    3. Jaki sens ma tworzenie index-u zawierającego 100 znakową nazwę?

    0
  • #14 30 Mar 2016 18:21
    11111olo
    Poziom 43  

    1. Na początku były kolumny nazwa i index, a później je zamieniłem miejscami i zapomniałem zmienić kolumnę index na PRIMARY. Dobrze, że to zauważyłeś, zaraz to zrobię.
    2. W PHP MyAdmin jest opcja dodania nowej kolumny do istniejącej tabeli co jak już się pewnie domyślasz powoduje dodanie pustych pól.
    3. Coś Ci się pomyliło. Na obrazku i zrzucie sql widać, że ta kolumna jest typu DOUBLE.

    Jak widać człowiek uczy się całe życie.

    0
  • #15 30 Mar 2016 18:24
    szwagros
    Poziom 30  

    arnoldziq napisał:
    2. Jak udało się koledze dodać puste rekordy do tabeli, skoro wszystkie zmienne są opisane 'NOT NULL'?

    Pusta wartość to co innego niż null.
    arnoldziq napisał:
    3. Jaki sens ma tworzenie index-u zawierającego 100 znakową nazwę?

    Słuszne pytanie. Ale skoro już tak, to możesz użyć replace w taki sposób:
    $sqlString = "REPLACE INTO $tablica (`nazwa`) VALUES ('$nowa_wartosc')";

    Dodano po 1 [minuty]:

    11111olo napisał:
    3. Coś Ci się pomyliło. Na obrazku i zrzucie sql widać, że ta kolumna jest typu DOUBLE.

    To, że nazwiesz kolumnę 'index' nie czyni z niej indeksu.

    0
  • #16 31 Mar 2016 10:24
    arnoldziq
    Moderator Programowanie

    szwagros napisał:
    Pusta wartość to co innego niż null.
    Dzięki.
    11111olo napisał:
    Jak widać człowiek uczy się całe życie.
    Jak się człowiek jeszce uczy, to pół biedy. Gorzej jak powtarza swoje błędy wciąż na nowo. A kolega wciąż, z uporem maniaka, próbuje zastosować typ DOUBLE jako tryb wyliczeniowy. Skoro wszyscy na całym świecie stosują typ INTEGER, o czym już dyskutowaliśmy nie raz i nie dwa, to kolega jednak wie swoje.
    11111olo napisał:
    arnoldziq kiedyś już mi pomogłeś przy licznikach odwiedzin, jednak wpis przy zapisie wygląda tak:
    $sqlString = "REPLACE INTO `licznik` (`Nazwa`,`ILOSC`) VALUES ('$nazwa' , $nowa_wartosc)";
    i co ciekawe działa. Tylko dlaczego?
    Zobacz database.php w funkcji WriteIle Link.
    Domyśliłem się, że brak ' może być problemem, jednak teraz za każdym razem jest dodawany nowy wpis.
    Czuję się przez kolegę wywołany do tablicy (ponownie), więc wyjaśniam jeszcze raz na spokojnie:
    Mój zapis, w w/w temacie jest całkowicie poprawny i działa, z jednej prostej przyczyny. Tablica którą wtedy należało zapisać miała (między innymi) dwa pola; 'ilosc' typu INTEGER (zmieniony przez kolegę na double) oraz 'nazwa' typu VARCHAR/STRING. Jako, że liczby nie wymagają w SQL-u żadnych dodatków typu apostrofy czy znaki cytatu, to takie znaki nie zostały dodane do zmiennej '$nowa_wartosc' - była ona traktowana jako liczba (w originale INTEGER). Mogły być, ale nie musiały, gdyby były, MySQL skonwertowałby STRING (otoczony ' ') na liczbę i zapisał w polu 'ilosc'. I dlatego to działa. A kolega zamienił wartości miejscami INT<->VARCHAR i próbuje mi wmówić, że to ja popełniłem błąd.
    Ja widzę olbrzymią różnicę pomiędzy moim zapisem :
    Kod: php
    Zaloguj się, aby zobaczyć kod
    A zapisem kolegi:
    Kod: php
    Zaloguj się, aby zobaczyć kod
    Skoro kolega nie widzi tutaj istotnych różnic, i jeszcze oskarża innych, to chyba nie mamy już sobie nic do powiedzenia.

    11111olo napisał:
    3. Coś Ci się pomyliło. Na obrazku i zrzucie sql widać, że ta kolumna jest typu DOUBLE.
    Jakoś nie przypominam sobie, żebyśmy przeszli 'na ty'.

    0
  • #17 31 Mar 2016 10:52
    11111olo
    Poziom 43  

    arnoldziq masz rację, bo nie przeszliśmy 'na ty' i celem tamtej odpowiedzi nie było obrażanie bądź urażanie kogokolwiek. Jeśli jednak tak to zabrzmiało, to przepraszam.
    Czyli zamiast DOUBLE powinien być INT. Zrobiłem tak i teraz kolumna index jest typu INt(11).

    0
  • #18 31 Mar 2016 10:59
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    Czyli zamiast DOUBLE powinien być INT. Zrobiłem tak i teraz kolumna index jest typu INt(11).
    To nie rozwiąże wszystkich problemów. Cała 'logika' tego skryptu do mnie "nie przemawia".
    Co ma na celu pole 'index'? To pole wyliczeniowe? Skoro tak, to czemu nie jest AUTO INCREMENT i zmienia wartość poprzez to nieszczęsne zapytanie SQL?

    0
  • #19 31 Mar 2016 11:15
    11111olo
    Poziom 43  

    Tabela o której mowa w przyszłości ma zawierać informacje o 10-ciu najczęściej odwiedzonych stronach, coś jak masz na forum najwięcej postów, najwięcej pomógł itp.
    Wymyśliłem sobie to w następujący sposób.
    Tabela od ilości wyświetleń każdej z podstron zawiera teraz dwie kolumny - nazwę strony oraz ilość wyświetleń. Powinna dodatkowo zawierać jeszcze dwie kolumny czyli rodzaj tego co jest opisane na konkretnej podstronie oraz opis potrzebny do tytułu strony.
    Natomiast tabela od najczęściej odwiedzanych stron miałaby zawierać trzy kolumny: index zawierający pozycję od 1 do 10, nazwa - nazwę strony oraz ilość - wartość każdej z odwiedzonych stron na liście.
    Wolałem pokombinować na nowej tabeli niż zniszczyć starą.

    Mam nadzieję, że teraz rozwiałem wszelkie wątpliwości dlaczego tak a nie inaczej.
    Jesli jest inaczej i nie odpowiedziałem na jakieś pytanie to chętnie udzielę odpowiedzi i nie mam zamiaru nikogo olewać twierdzenie, że wiem najlepiej, bo niestety tak nie jest.

    0
  • #20 31 Mar 2016 11:27
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    Tabela o której mowa w przyszłości ma zawierać informacje o 10-ciu najczęściej odwiedzonych stronach, coś jak masz na forum najwięcej postów, najwięcej pomógł itp.
    No spoko.
    11111olo napisał:
    Tabela od ilości wyświetleń każdej z podstron zawiera teraz dwie kolumny - nazwę strony oraz ilość wyświetleń.
    Skoro te dane są dostępne, to właściwie ma kolega już dokładnie wszystko, żeby taką listę 'najpopularniejszych' zrobić jednym zapytaniem SQL :
    Kod: php
    Zaloguj się, aby zobaczyć kod
    I lista gotowa.
    A odliczanie od 1 do 10, przy wyświetlaniu w pętli, to chyba nie muszę mówić jak zrobić?

    0
  • #21 31 Mar 2016 11:39
    11111olo
    Poziom 43  

    To mi się przyda, tylko jeszcze nie teraz.
    Tylko że tabela od ilości wyświetleń powinna zawierać cztery kolumny i tak jak napisałem na początku nie chcę jej uzupełniać z PHP My Admin, bo to jest bez sensu.
    W takiej formie jak jest teraz tabela od ilości wyświetleń to nie przejdzie.
    Nie mogę wyświetlić czegoś w stylu
    1. _kateegoria_nazwa1 1000
    2. _kateegoria_nazwa2 979
    itd. bo jak to wygląda.

    Pozostało tylko wpisanie wartości z formularza do tabeli, i to mi nie wychodzi, najlepsze jest to, ze nie wiem gdzie popełniam błąd.
    A pętla for jest zrozumiała i nie wymaga wyjaśnień.

    Nie czekam na gotowca tylko wyjaśnienie.
    Po napisaniu

    Kod: php
    Zaloguj się, aby zobaczyć kod


    pojawia się komunikat błędu
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''nazwa', `rodzaj`, 'opis') VALUES ('2', '_pusty22' , 'aaa', 'sss')' at line 1

    W takim razie co źle napisałem albo ustawiłem i jak to się ma do tego przykładu?

    0
  • Pomocny post
    #22 31 Mar 2016 12:36
    arnoldziq
    Moderator Programowanie

    11111olo napisał:
    najlepsze jest to, ze nie wiem gdzie popełniam błąd.
    Cała koncepcja jest błędna!
    Po co kopiować (dodawać do kolejnej tabeli) dane, które już są w innej tabeli?
    Skoro nazwa strony i ilość odwiedzin są znane, to brakuje tylko opisów do 'czytelnego' wyświetlania zawartości najczęściej odwiedzanej strony.
    Zgaduję, że liczba stron jest w miarę stała, co za tym idzie nie ma zupełnie sensu tworzenia formularza, tylko po to, żeby raz na kilka miesięcy dodać do listy nowy opis.
    Sugeruję stworzyć nową tabelę:
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Następnie wypełnić ją (częściowo) danymi za pomocą SQL-a (phpAdmin) :
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Dopisać opisy do stron w phpAdmin (gdyby pojawiła się nowa strona, można tego skryptu bezpiecznie użyć, do dodania jej do listy opisów).
    A następnie wyświetlić już znane opisy i ilości odwiedzanych stron (php):
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Dodano po 4 [minuty]:

    11111olo napisał:
    pojawia się komunikat błędu
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''nazwa', `rodzaj`, 'opis') VALUES ('2', '_pusty22' , 'aaa', 'sss')' at line 1
    Stosuje kolega zamiennie i bez żadnego ładu i składu znaki ` i ' -----> TO NIE JEST TO SAMO i NIE OZNACZA TEGO SAMEGO!

    0