|
StrongholdNet - forum graczy Stronghold Największe polskie forum o grach z serii Stronghold. |
|
Internet i komputery - Problemy z systemem newsów (PHP, MySQL)
Tay - 12 Wrzesień 11, 08:56
Mam "mały" problem przy pisaniu systemu newsów. Otóż mam podstronę z rozszerzeniem .html z takim oto formularzem:
Kod: | <html>
<body>
<form action="news.php" method="post">
<table border="0">
<tr>
<td>Tytuł newsa:</td><td><input type="text" name="tytul" size="15"></td>
</tr>
<tr>
<td>Treść newsa:</td><td> <textarea name="tresc" rows="5" cols="20"></textarea></td>
</tr>
</table>
<input type="submit" value="Wyslij"><br>
</body> |
Służy ona jak widać do dodawania newsów.
Następnie jest plik news.php do którego przesyłane są dane z formularza (te div'y tak na razie tylko wstawiłem, kombinuję tam z nimi, ale nie o to chodzi):
Kod: | <html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<?php
require "connection.php";
connection();
$id = $_POST['id'];
$tytul = $_POST['tytul'];
$tresc = $_POST['tresc'];
$data = $_POST['data'];
$zapytanie = "INSERT INTO newsy VALUES ('$id')";
mysql_query($zapytanie);
$zapytanie = "INSERT INTO newsy VALUES ('$tytul')";
mysql_query($zapytanie);
?>
<div id="NEWS">
<div id="TYTUL_NEWSA"><h3>$tytul</h3></div>
<div id="TRESC_NEWSA"><p>Treść newsa</p></div>
<div class="pasek4"></div>
</div>
<div id="NEWS">
<div id="TYTUL_NEWSA"><h3>Tytuł newsa</h3></div>
<div id="TRESC_NEWSA"><p>Treść newsa</p></div>
<div class="pasek4"></div>
</div>
</body>
</html>
|
I tutaj mam problem:
Kod: | $zapytanie = "INSERT INTO newsy VALUES ('$id')";
mysql_query($zapytanie);
$zapytanie = "INSERT INTO newsy VALUES ('$tytul')";
mysql_query($zapytanie); |
Problem polega na tym, iż gdy dodaję sobie newsa w formularzu, następnie wchodzę w phpmyadmin żadnych rekordów w bazie nie ma. Zmieniałem już te wpisy na różne sposoby. Jestem baardzo zielony w php, więc proszę o pomoc. Tak samo zastanawia mnie jak "wyciągnąć" potem te newsy z bazy, aby były one widoczne na np. stronie głównej. Z góry dzięki za pomoc, mam nadzieję, że rozumiecie o co mi chodzi
Siwy - 12 Wrzesień 11, 15:07
Podstawy SQL'a się kłaniają . Po pierwsze - pokaż strukturę tabeli (eksport z PHPMyAdmina). W każdym razie do dodawania rekordów używa się jednego zapytania, a nie jak Ty robisz 2, czy więcej .
$id zbędny - od tego sa pola id w tabeli z nadanym auto_increment (autouzupełnianiem kolejną liczbą). $data to powinien być IMO albo czas od 1 stycznia 170 (time()), albo data w formie SQLowej, czyli odpowiednio sformatowena funkcja date do postaci YYYY-MM-DDD (oczywiście dla pola w tabeli musisz nadać odpowiedni rodzaj - DATE). Inna sprawa, że w formularzu nie są tworzone zmienne $_POST['id'], $_POST['data'] .
Jeśli zaś chodzi o finalne dodanie - najlepiej sprawdzać, czy funkcja mysql_query() zwróciła true (co oznacza, że wszystko poszło ok) i też else, aby wyświetlić jaki jest problem (funkcja mysql_error()). Samo zapytanie, zależnie od tego, jak wygląda struktura tabeli, powinno mieć mniej więcej taki kształt:
Kod: | $zapytanie = "INSERT INTO newsy VALUES(NULL [pole auto_increment samo doda id], '$tytul', '$tresc', $$data'";
if(mysql_query($zapytanie))
{
echo "Poprawnie dodano newsa!";
}
else
{
echo "Wystąpił błąd".mysql_error();
} |
Co się zaś tyczy samego HTMLa - do tworzenia formularzy nie używaj tabel . Najlepiej skonstruować formularz na label'ach.
Jeśli chodzi o 'wyciąganie' newsów z bazy - mówię, to są podstawy SQL'a. Z czego się uczysz btw.?
Kod powinien mieć mniej więcej taki kształt:
Kod: | $zapytanie = "SELECT * FROM newsy ORDER BY id DESC"; // * oznacza wszystko, w innym wypadku wymieniaj pola jakie chcesz wyciagnac po przecinku
$wynik = mysql_query($wynik);
$ile = mysql_num_rows($wynik); // przeliczenie zwroconych wynikow
for($i = 0; $i < $ile; $i++)
{
$news = mysql_fetch_assoc($wynik); // ta funkcja zwraca aktualny rekord w postaci tabeli z indeksami jako nazwy pol
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
} |
Tay - 12 Wrzesień 11, 15:18
Siwy napisał/a: | W każdym razie do dodawania rekordów używa się jednego zapytania, a nie jak Ty robisz 2, czy więcej . |
Wiem, po prostu jak dawałem 1 to nie działało, więc kombinowałem z tym
Dzięki za wszystkie rady, wieczorem przysiądę nad tym i poprawię jak rozkazałeś
Uczę się (rzadko, ale jednak ) z PHP i MySQL. Vademmecum Profesjonalisty.
Jeszcze raz dzięki.
Siwy - 12 Wrzesień 11, 15:23
Też uczę się z tej książki (tzn. teraz już często do manuala także zaglądam ). Które wydanie?
Tay - 12 Wrzesień 11, 16:08
Wydanie czwarte
Odyn - 12 Wrzesień 11, 17:10
Siwy napisał/a: |
$wynik = mysql_query($wynik);
$ile = mysql_num_rows($wynik); // przeliczenie zwroconych wynikow
for($i = 0; $i < $ile; $i++)
{
$news = mysql_fetch_assoc($wynik); // ta funkcja zwraca aktualny rekord w postaci tabeli z indeksami jako nazwy pol
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
} |
Ten kod można sporo uprościć:
Kod: | $wynik = mysql_query($zapytanie);
while($news = mysql_fetch_assoc($wynik))
{
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
}
|
Tay - 12 Wrzesień 11, 18:13
Zrobiłem, to co poradziliście i podmieniłem kod, jednakże po otwarciu pliku news.php jest taki oto napis:
Wystšpił błšdYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Natomiast plik news.php wygląda następująco:
Kod: |
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<?php
require "connection.php";
connection();
$tytul = $_POST['tytul'];
$tresc = $_POST['tresc'];
$zapytanie = "INSERT INTO newsy VALUES (NULL, '$tytul', '$tresc'";
if(mysql_query($zapytanie))
{
echo "Poprawnie dodano newsa!";
}
else
{
echo "Wystąpił błąd".mysql_error();
}
$zapytanie = "SELECT * FROM newsy ORDER BY id DESC"; // * oznacza wszystko, w innym wypadku wymieniaj pola jakie chcesz wyciagnac po przecinku
$wynik = mysql_query($zapytanie);
while($news = mysql_fetch_assoc($wynik))
{
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
}
?>
</body>
</html>
|
Proszę o dalszą pomoc
Siwy - 12 Wrzesień 11, 18:18
Require to funkcja. Choć błąd nie tego dotyczy. Nie zamknąłeś nawiasu za values - IMO tego dotyczy błąd. Jednak dalej nie przedstawiłeś nam struktury tabeli, a co za tym idzie wydaje mi się, że następny błąd (po poprawieniu tego) będzie w insercie - pola mogą być w innej kolejności/jest ich więcej etc.
[ Dodano: 12 Wrzesień 11, 19:19 ]
Cwaniaczek, ja mam 3 ;P. Btw. Masz tam wszystko co trzeba opisane, jeśli chodzi o to, o co teraz pytasz . Przewertuj ją dokładnie. Co nie oznacza, że nie chcę Ci pomóc .
Tay - 12 Wrzesień 11, 18:36
Siwy napisał/a: | Require to funkcja. |
Czyli mam zastąpic cudzysłów nawiasem okrągłym?
Siwy napisał/a: | Nie zamknąłeś nawiasu za values - IMO tego dotyczy błąd. |
Poprawione, dzięki.
Siwy napisał/a: | ednak dalej nie przedstawiłeś nam struktury tabeli, a co za tym idzie wydaje mi się, że następny błąd (po poprawieniu tego) będzie w insercie - pola mogą być w innej kolejności/jest ich więcej etc. |
Co do tabeli - skopiowałem polecenie sql z Twojego artykułu "System komentarzy", jednak wyedytowałem je. Czyli nazwa tabeli to newsy, a reszta wygląda tak:
# Kolumna Typ Metoda porównywania napisów Null Domyślnie Dodatkowo
1 id int(11) Nie None AUTO_INCREMENT
2 tytul char(40) latin2_swedish_ci Nie None
3 tresc text latin2_swedish_ci Nie None
4 data int(11)
Mam nadzieję, że jest to w miarę czytelne dla Ciebie Czyli faktycznie, pól mam więcej... a więc co winienem zrobić?
Dodam jeszcze, że teraz po otwarciu pliku mam napis:
Wystšpił błšdColumn count doesn't match value count at row 1
Siwy - 12 Wrzesień 11, 18:44
Cytat: | (...)wydaje mi się, że następny błąd (po poprawieniu tego) będzie w insercie - pola mogą być w innej kolejności/jest ich więcej etc. |
Cytat: | Wystšpił błšdColumn count doesn't match value count at row 1 |
Miałem rację .
Są dwa sposoby dodawania danych do bazy, pierwszy, gdy dodajemy dane do każdego pola, czyli taki jaki stosujesz teraz:
Kod: | INSERT INTO tabela VALUES(wszystkie dane po przecinku w kolejności w jakiej są pola); |
Można dodawać dane tylko do określonych pół, np.
Kod: | INSERT INTO `id`, `tytul` VALUES(NULL, 'Tytuł'); |
Czyli po prostu dodawaj datę, jako ostatnią wartość, np.
Kod: | INSERT INTO newsy VALUES(NULL, 'Tytuł', 'Treść', 'Data'); |
Btw.
wtf? xd
Cytat: | Czyli mam zastąpic cudzysłów nawiasem okrągłym? |
Jeeej xd. Wartość jest przekazywana funkcji, jak słusznie mówisz, w nawiasie, jednak wewnątrz nawiasu także musi być cudzysłów . Czyli...
Kod: | require('wzgledna_sciezka_do_pliku.php'); |
Tay - 12 Wrzesień 11, 19:09
Dzięki, jesteś wielki, poprawiłem wszystko i działa Jednakże... tak, ja to zawsze mam jakiś problem ;D Newsy pokazują się, ale w każdym z nich nie ma wartości z tabeli newsy, tylko wszędzie jest tak:
tytul
tresc
Dzieje się tak zapewne z powodu tego:
Kod: |
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
|
Tylko na co mam zamienić słowa tytul i tresc, aby wyświetlał mi się tytuł i treść newsa z bazy danych?
Poniżej załączam kod z tych dwóch plików (na wszelki wypadek) oraz linki do stron:
www.tay.cba.pl/news.php
Kod: |
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<?php
require ('connection.php');
connection();
$tytul = $_POST['tytul'];
$tresc = $_POST['tresc'];
$data = $_POST['data'];
$zapytanie = "INSERT INTO newsy VALUES(NULL, '$tytul', '$tresc', '$data')";
if(mysql_query($zapytanie))
{
echo "Poprawnie dodano newsa!";
}
else
{
echo "Wystąpił błąd".mysql_error();
}
$zapytanie = "SELECT 'tytul', 'tresc' FROM newsy ORDER BY id DESC"; // * oznacza wszystko, w innym wypadku wymieniaj pola jakie chcesz wyciagnac po przecinku
$wynik = mysql_query($zapytanie);
while($news = mysql_fetch_assoc($wynik))
{
echo "<h1>".$news['tytul']."</h2>";
echo "<p class=\"data\">".$news['data']."</p>";
echo "<p>".$news['tresc']."</p>";
}
?>
</body>
</html>
|
www.tay.cba.pl/addnews.html
Kod: |
<html>
<body>
<form action="news.php" method="post">
<table border="0">
<tr>
<td>Tytuł newsa:</td><td><input type="text" name="tytul" size="15"></td>
</tr>
<tr>
<td>Treść newsa:</td><td> <textarea name="tresc" rows="5" cols="20"></textarea></td>
</tr>
<tr>
<td>Data:</td><td> <input type="text" name="data" size="15"></td>
</tr>
</table>
<input type="submit" value="Wyslij"><br>
</body>
</html>
|
Siwy - 12 Wrzesień 11, 20:51
Hmm po pierwsze oddziel dodawanie newsa od ich wyświetlania . Bo co każde wyświetlenie dodają się chyba puste rekordy mi się wydaje. Albo poprzez sprawdzenie czy coś przyszło z formularza, albo przez osobny plik .
Aby sprawdzić czy przyszły jakieś dane z formularza użyj
Kod: | // moze byc tez np. GET
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
kod dodawania newsa
}
else
{
wyswietlanie nmewsow
} |
Co do Twojego problemu wydaje mi się, że rozwiązaniem będzie usunięcie cudzysłowów z nazw pól . Czyli
Kod: | SELECT tytul, tresc FROM newsy ORDER BY id DESC; |
Zawsze nazwy pól podaje się albo bez niczego, albo w tych tajemniczych znakach koło jedynki - ` .
Tay - 12 Wrzesień 11, 20:55
Siwy napisał/a: | Hmm po pierwsze oddziel dodawanie newsa od ich wyświetlania |
Zrobię to, na razie tylko testowałem
Siwy napisał/a: | Co do Twojego problemu wydaje mi się, że rozwiązaniem będzie usunięcie cudzysłowów z nazw pól |
Dobrze Ci się wydaje Dzięki wielkie!
Teraz pozostało mi tylko przenieść wyświetlanie newsów na stronę główną oraz zrobienie jakiegoś ich wyglądu w CSS
Jeszcze raz dzięki, choć znając mnie jeszcze nieraz będę musiał szukać u Ciebie pomocy
Siwy - 12 Wrzesień 11, 21:00
Zostało Ci jeszcze uwierzytelnianie admina .
Cytat: | Jeszcze raz dzięki, choć znając mnie jeszcze nieraz będę musiał szukać u Ciebie pomocy |
Nie ma sprawy, to przyjemność . Dodaje kopa, aby dalej się uczyć etc., bo widać tego efekty nie tylko w postaci własnych skryptów, ale także pomocy innym .
Tay - 12 Wrzesień 11, 21:40
Niestety napotkałm kolejny problem. Ale skoro to dla Ciebie przyjemność, to możesz mi pomóc, prawda?:D
Otóż dodałem do tych newsów div'y, aby to jakoś wyglądało:
Kod: |
while($news = mysql_fetch_assoc($wynik))
{
<div id="NEWS">
<div id="TYTUL_NEWSA">
echo "<h3>".$news['tytul']."</h3>";
</div>
<div id="TRESC_NEWSA">
echo "<p>".$news['tresc']."</p>";
</div>
<div class="pasek4">
</div>
</div>
}
?>
|
Problem z tym, że mam błąd. Nie wiem jak osadzić html w php. Próbowałem naprawdę wielu sposobów - dodawałem cudzysłowy, echa itd. Jednak jestem na to za głupi i muszę kolejna raz prosić Cię o przysługę ;D Pomożesz?
PS: Chciałbym też aby w jednym takim divie z treścią wyświetlała się treść jednego newsa, bo teraz to chyba będą się wyświetlać wszystkie wrzucone do tabeli treści. Podobnie z tytułami. No i aby najnowsze newsy były u góry
|
|