Nie dodaje mi rekordu do bazy

0

Witam! Napisalem prosty formularz ktory ma dodawac dane do bazy danych jednak cos jest nie tak i nie dodaje rekordu, tylko dlaczego skoro kod jest wporzadku?

<html>
<head>
<title> MikroTurniej </title></head>
<body> 
 <form method="POST" action="gamesreg.php">
Podaj swoj nick: <input type="text" size="30" name="userName"><br>
<input type="submit" value="Zarejestruj sie!">
</form>
</body>
</html>

Plik gamesreg.php

<?php
session_start();
$userName = $_POST['userName'];
$stmt = $user_home->runQuery("INSERT INTO tbl_mikrotour (userName) VALUES ($userName)");
$stmt->execute();
?>

Formularz ma dawac nam akcje: uzytkownik wpisuje nick i zarejestruj sie, w bazie danych jest tabela o nazwie tbl_mikrotour w dwiema kolumnami: id ktora ma wartosc A.I oraz userName ktory ma przechowywac nick ktory wpisal uzytkownik.
Wydaje mi sie ze moglem popelnic blad w nawiasie VALUES ale dlaczego probowalem dodawac cudzyslow i kropki ale nic to nie dalo ;(

0

a co robi to cudo $user_home->runQuery?

0

W doc php nie znalazłem runQuery, więc to pewnie czyjś wynalazek. Nie wiadomo co robi. Spróbuj użyć parametrów, bo faktycznie zmienną powinieneś mieć w apostrofach, a i nie sprawdzasz, co dostajesz $_POSTem

0

a sprawdzałeś czy w ogóle prawidłowe połączenie z bazą?

0

Może podaj jaki błąd Ci się pokazuje - to pomoże. Btw kod brzydki i dziurawy.

0

To moje poczatki z programowaniem wiec rozumiem i dziekuje za krytyke na temat mojego kodu :D z biegiem czasu moze bedzie wygladal ladniej, a wracajac do tematu:

co robi funkcja runQuery:

public function runQuery($sql)
	{
		$stmt = $this->conn->prepare($sql);
		return $stmt;

W sumie to moze faktycznie jest problem z polaczeniem z baza danych poniewaz nie wyswietla mi nawet nicku uzytkownika po zalogowaniu

EDIT: po wpisaniu swojego nicku i kliknieciu zarejestruj wyswietla mi blad:
Warning: Cannot modify header information - headers already sent by (output started at /home/..........)

0

Najprościej Ci będzie wyświetlić w funkcji runQuery treść zapytania i wkleić do PHPMyAdmina. Wtedy zobaczysz co za zapytanie Ci w ogóle idzie do bazy i czy w ogóle jest poprawne. Patrząc na składnie, stawiam, że już sam model bazy jest do poprawienia. Potem szukaj problemu dalej jeżeli okaże się że zapytanie jest ok.

To moje poczatki z programowaniem wiec rozumiem i dziekuje za krytyke na temat mojego kodu

Może najpierw skonstruuj sobie cały szablon plików (header,footer, funckje do sesji, funkcje do sqla itd) i dopiero baw się w całą resztę. Zakładam że try/catch nie znasz etc. więc dobrze byłoby tak opakować kod abyś wiedział, jakie błędy w PHP/SQLu są generowane, inaczej będziesz szukał 100 lat prostego błędu.

Rzuć okiem PHP Login and Registration Script with PDO and OOP. Obiektowo co prawda, ale da się wszystko zrozumieć razem z wyjątkami, którymi zbierzesz błędy SQLa

0

Najlepsze jest ze moj poczatkowy silnik jest wlasnie z tej strony pobrany, ale juz z wgranym skryptem rejestracji logowania oraz strony Twój profil, fajnie trafiles co do polaczenia z baza chyba go nie ma choc uwazam ze jest to dziwne poniewaz w pliku class.user.php wywoluje dbconnect.php tak wiec powinno to polaczenie byc

0

Hm a jakbym zrobil to wszystko w obrebie jednego pliku? Czy lepiej zrobic odrebny plik z kodem tylko php dodajacym rekord?
Nakombinowalem cos takiego:

<html>
<head>
<title> MikroTurniej </title></head>
<body> 
 <form method="POST">
Podaj swoj nick: <input type="text" size="30" name="userName"><br>
<input type="submit" value="Zarejestruj sie!">
</form>
</body>
</html>
<?php 
include_once 'header.php';

if (isset($_POST['userName']))
{

	$userName = $_POST['userName'];
	$stmt = $user_home->runQuery("INSERT INTO 'tbl_mikrotour' ('','userName') VALUES ('','$userName')");
	$stmt->execute();
	echo 'Zarejestrowales sie';
}
else {
	echo 'Cos poszlo nie tak';
}

include_once 'footer.php';

?>

I teraz po wpisaniu nicku i kliknieciu zarejestruj sie wyswietla mi jakis super dlugi komunikat:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''tbl_mikrotour' ('','userName') VALUES ('','Tester1')' at line 1' in /home/games.php:29 Stack trace: #0 /home/games.php(29): PDOStatement->execute() #1 {main} thrown in /home//games.php on line 29
Zaczyna mnie to draznic.. ^^

0

Masz kilka opcji:

  1. Nauczyć się samemu mysql'a za pomocą ogólnodostępnych tutoriali/dokumentacji
  2. Zapisać się na jakiś codeCamp - gdzie wydasz pewnie z kilka/kilkanaście tysi i wtedy poradzisz sobie nie z takimi błędami
  3. Samemu szukać rozwiązań - bo błąd masz jasny "Zapytanie SQL jest błędne" - wykorzystując do tego google
  4. Liczyć na to że dostaniesz podane rozwiązanie na tacy - ale w ten sposób nigdy się niczego nie nauczysz.
  5. Zaoferować pisiont złotych za 15 minut pracy kogoś kto się zna.
  6. Wypić melisę - by nie być rozdrażnionym.

Co wybierasz ?

0

Z tego wzgledu ze chcialbym sie tego nauczyc to wybralbym 1 i 3 a takze oczywiscie 6 szkoda tylko ze nie mam melisy w domu musze kupic :D moglbym zaplacic pisiont zlotych gdyby ktos naprawil mi to z wytlumaczeniem abym zrozumial co robie zle ;)

0

Zaoszczędzone pisiont złotych wydaj na książkę :)
Czy możesz połączyć się z bazą spoza kodu php? Masz jakieś narzędzie albo dostęp do phpmyadmina? Jeśli tak to najpierw potestuj sobie zapytania SQL.
Patrząc na Twój kod nie mogę Ci pomóc, bo nie wiem czy w bazie danych masz daną tabelę, czy poprawnie łączysz się z bazą itp itd
Patrząc na samo zapytanie - masz tam niepotrzebne kolumny, a tym bardziej błędną kolumnę z pustymi cudzysłowami.
Zobacz jak wyglądają zapytania sql w jakimś tutorialu, porównaj ze swoim. Poza tym mam wrażenie (a nawet 99% pewności), że ten twór na bazie którego coś tam starasz się programować - jest oparty na PDO, zatem poczytaj jak się robi "prepared statements" i jak się binduje wartości i co to jest sql injection.
Obecnie Twoja baza może zostać skasowana nawet bez znajomości hasła do niej (sql injection).

PS . Tylko kupując książkę - kup najnowsze wydanie (2016/2017).

0

A moglbys polecić jakas ksiazke? Widzialem kilka kursow internetowych ale sa ze starym php a podobno PDO jest najlepsze teraz stad moja proba dzialania na obcym kodzie w pdo

0

Masz racje dopiero zaczynam co do tutkow to widzialem kilka ale zazwyczaj jest pokazane tylko polaczenie z baza przez pdo. Kurs multimedialny bedzie dobry? Za 80zl znalazlem jakis

0

Dobrze poszukam a w sumie to znalazlem na youtube kilka filmikow pozniej przejrze a wracajac do kodu. Przemyslalem to wszystko jeszcz raz lezac na lozku i wprowadzilem dosc duzo zmian, dodalem polaczenie z baza danych na poczatku no i ja glupi uzywalem funkcji runQuery a zamienilem to na zwykly kod bez funkcji i nagle cos tam podzialalo. Tylko teraz mam smieszna zaleznosc bo w polu gdzie trzeba wpisac swoj nick nalezy wpisac nazwe kolumny z tabeli???????????? I jak wpisze userName i klikne zarejestruj to bez kitu ale dodaje mi normalnie wszystko do bazy, tylko ze w kolumnie userName jest wartosc 0, czyli wychodzi na to ze ustawilem sobie tak formularz ze musze w polu wpisac nazwe kolumny :D jak to teraz zmienic zeby bylo odwrotnie??

Kodzik:

<?php

include_once 'header.php';
session_start();
$database = new Database();
$db = $database->dbConnection();
?>

<html>
<head>
<title> MikroTurniej </title></head>
<body> 
 <form method="POST">
Podaj swoj nick: <input type="text" size="30" name="userName"><br>
<input type="submit" value="Zarejestruj sie!">
</form>
</body>
</html>
<?php 

if (isset($_POST['userName']))
{
	$userName = $_POST['userName'];
	$zapytanie = 'INSERT INTO tbl_mikrotour (userName) VALUES ('.$userName.')';
	$stmt = $db->query($zapytanie);
	$stmt->execute();
	echo 'Zarejestrowales sie';
}
else {
	echo 'Cos poszlo nie tak';
}




include_once 'footer.php';

?>
0

Heh... Taką miazgę robisz z tego kodu że ciężko jakkolwiek się do tego odnieść. :) Wiem, że masz parcie na robienie ambitnych rzeczy ale proponował bym zacząć od podstaw a konkretnie od samego PHP. Kilka zadań z samego PHP - tablice, sesje, funkcje, formularze etc. Potem obiektowe. I jak to już dobrze opanujesz to oddzielnie SQL - tabele, zapytania, relacje itd. Dopiero wtedy proponuje kombinacje w Twoim stylu. Jak dobrze ugryziesz w/w kwestię to odkryjesz coś takiego jak frameworki które tego typu rzeczy jak Twoje logowanie i rejestracje załatwiają praktycznie za Ciebie.
Moim zdaniem nie warto kupować książek do tego typu rzeczy. Wszystko jest w Internecie. Stack overflow Twoim przyjacielem ;)

0

Ciekawe te frameworki zastanawiam sie nad symfony podobno popularny w polsce :) a jakas porada co moge zrobic z tym kodem zeby to dzialalo dobrze? Cos z formularzem jest nie tak?

0

Przede wszystkim rozdziel akcje od widoku, tj. w tym pliku co masz wyświetlaj formularz a prześlij go do zewnętrznego pliku php (np. login_process.php) w którym obsłużysz POSTa. Potem w zależności od wyniku operacji wrócisz na formularz z komunikatem albo przekierujesz do akcji po poprawnym logowaniu. Najlepiej jakbyś napisał klasę User w której będziesz miał metody dot. usera (logowanie, obsługa sesji, pobieranie informacji o użytkowniku itd).
W pliku login_process.php robisz całą akcję logowania czy tam rejestracji. W ten sposób masz prawie model MVC (Model->View->Controller).

0

Chodzi mi stricte o ten problem z tym formularzem dlaczego zeby dodalo mi rekord musze wpisac w formularzu nazwe kolumny? Chcialem zrobic cos w stylu rejestracji do grupy w sensie takim ze jest przycisk na stronie i uzytkownik jak kliknie przycisk to doda go do tej tabeli a teraz wyszlo mi jakies nie wiadomo co

0

Możesz podrzucić jeszcze strukturę swojej bazy a konkretnie tablicy w której zapisujesz dane? Chodzi w szczególności o pola i ich typy

0

Dwie kolumny o nazwach id oraz userName w tym id ma auto increment i obie maja typ integer

0

Czyli masz źle formularz zrobiony. Bo userName w tabeli powinieneś mieć jako np. varchar 255 a nie INT - a to dlatego, że przesyłasz w formularzu stringa a nie INTa, chyba, że chcesz przesyłać ID usera na podstawie nicka, to musisz sobie go w akcji oddzielnie rozróżnić. Na ten moment, musisz zmienić strukturę tabeli, tak aby userName było varcharem i wtedy nick będzie wpisywany do bazy. Kumasz?

0

Jak najbardziej kumam olsnilo mnie Od razu jak przeczytalem co napisales ze przeciez nick nie moze byc integer :P ale jak przeczytalem dalsza Twoja wypowiedz to uwazam ze moze byloby to lepsze rozwiazanie? Zrobic po prostu tylko przycisk zeby nie bylo pola do wpisania nicku, po prostu uzytkownik klika przycisk rejestruj i po kliknieciu zostanie dodane do tabeli: id (wiadomo auto increment samo sie zrobi) i druga kolumna o nazwie np userID i tutaj moglaby juz byc integer i wrzucalaby tutaj ID uzytkownika, tylko nie wiem teraz jak to zrobic w zapytaniu: INSERT INTO tbl_mikrotour (id,userID) VALUES i co tutaj z tym id mam zrobic? a moze ma byc po prostu tylko userID? Z tego co slyszalem powinno wypisac sie wszystkie kolumny do takiego zapytania

0

A docelowo coś z tego projektu ma być czy tak piszesz sobie for fun? Bo jak masz coś konkretnego zakodować to proponuje opanować obiektowe najpierw i zbudować całą strukturę tego systemu a potem bawić się w resztę. Bo tak to do niczego nie dojdziesz

0

na razie staram sie nauczyc pdo troche piszac i probujac nauczyc sie na bledach ale to jest chyba zla metoda :-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1