ZalogujRejestracjaSzukaj U�ytkownicy MedaleZaloguj si�, by sprawdzi� wiadomo�ciGrupyStatystyki

Na forum.stronghold.net.pl wykorzystujemy ciasteczka. Jeśli jeszcze nie masz dość tego typu komunikatów, więcej informacji znajdziesz w Polityce Cookies. zamknij


Poprzedni temat «» Następny temat
Problemy z systemem newsów (PHP, MySQL)
Autor Wiadomość
Tay 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 09: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 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 16:07   

Podstawy SQL'a się kłaniają :P . 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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 16: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ś :D

Uczę się (rzadko, ale jednak ;) ) z PHP i MySQL. Vademmecum Profesjonalisty.

Jeszcze raz dzięki.
_________________
https://www.speedrun.com/stronghold/run/zgn8770y
 
 
 
Siwy 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 16:23   

Też uczę się z tej książki (tzn. teraz już często do manuala także zaglądam :D ). Które wydanie?
 
 
Tay 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 17:08   

Wydanie czwarte :)
_________________
https://www.speedrun.com/stronghold/run/zgn8770y
 
 
 
Odyn 
Administrator


Wiek: 34
Posty: 856
Medale: Brak

Wysłany: 12 Wrzesień 11, 18: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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 19: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 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 19: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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 19: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 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 19: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ę :P .

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.
Cytat:
latin2_swedish_ci

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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 20: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 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 21: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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 21: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 :)
_________________
https://www.speedrun.com/stronghold/run/zgn8770y
 
 
 
Siwy 
Moderator


Wiek: 28
Posty: 1481
Skąd: Nowogród Bobrzański
Medale: 1 (Więcej...)
Srebrny szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 22: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 
Wojownik


Gra w: życie
Wiek: 28
Posty: 652
Skąd: Nowy Sącz
Medale: 1 (Więcej...)
Brązowy szachista (Ilość: 1)

Wysłany: 12 Wrzesień 11, 22: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 :)
_________________
https://www.speedrun.com/stronghold/run/zgn8770y
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group | Template DarkMW created by razz