[PHP MySQL] - Błąd w pobieraniu danych z bazy

Plik polacz.php…:

<?php


$host = "localhost";

$user = "root";

$pass = "";

$db = "blog";


$polaczenie = mysql_connect($host, $user, $pass);

mysql_select_db($db);


if(!$polaczenie){

	die('Błąd połączenia: ' . mysql_error());

}


?>

… i kod na stronie…:

<?php

	include 'polacz.php';

	$query = mysql_query("select * from newsy where id='".(int)$_GET['id']."'");

	$rekord = mysql_fetch_array($query);

	echo '

‘.$rekord[4].’

Autor: '.$rekord[2].‘Data: ‘.$rekord[3].’ ‘.$rekord[5].’’; ?>[/code] … i wyświetlany błąd…:[9683575700_1377621386_thumb.jpgDodane 27.08.2013 (Wt) 18:39 – Nie wiem co dokładnie jest źle, ale 25 linijka to ta:

[code]$query = mysql_query(“select * from newsy where id=’”.(int)$_GET[‘id’]."’");
tzn. coś z tym

WHERE id='".(int)$_GET['id']."'");

](http://obrazki.elektroda.pl/9683575700_1377621386.jpg)

Zrób sobie skrypt

<?php

var_dump($_GET);

?>

I pobaw się nim. W szczególności sprawdź kiedy wartość $_GET[‘id’] istnieje a kiedy nie.

A poza tym sprawdź co to jest “sql injection” i “prepared statement”.

@etam

Jak w tym zapytaniu jesteś w stanie zrobić sqli to prawdopodobnie masz w ręku moc niewyobrażalną…

@Jacko1998

Twoje pytania na tym forum są poniżej jakiejkolwiek krytyki. To nie jest już śmieszne. To stało się irytujące.

@tfl: nie każdy musi wiedzieć co zrobi rzutowanie do int-a :slight_smile:

W tym przypadku akurat się nie uda, ale tworząc w ten sposób zapytania łatwo się zapomnieć lub pomylić i miejsce na sqli gotowe. Używając prepared statement ma się czytelniejsze zapytania i bezpieczny kod.

Dzięki poradziłem sobie w inny sposób :slight_smile: Ale nie wiem jak zrobić, aby każdy tytuł posta był podlinkowany i kierował on do osobnej strony, gdzie w późniejszym czasie, umieściłbym możliwość komentowania.

Pochwal się jak.

<?php

	mysql_connect ("localhost", "root", "") or die ("Błąd podczas łączenia się z MySQL !");


	mysql_select_db ("szkola") or die ("Błąd podczas wybierania bazy !");


	$wynik = mysql_query ("SELECT * FROM newsy");

	while ($wynik && $rekord = mysql_fetch_array ($wynik)) {


	$tytul = $rekord['tytul'];

	$tresc = nl2br($rekord['tresc']);

	$autor = $rekord['autor'];

	$data = $rekord['data'];


	echo "

“.$rekord[‘tytul’].”

“; echo “Autor: “.nl2br($rekord[‘autor’]).” Data: “.$rekord[‘data’].””; echo " “.$rekord[‘tresc’].””; } ?>[/code]

Tylko funkcje nl2br nie wiem gdzie wstawić, żeby działa.

Boże, widzisz i nie grzmisz… jacko1998 mam bardzo złą wiadomość dla Ciebie - nie nadajesz się do tego. Po prostu. Deal with it.

No i błąd zauważyłem. :wink:

code=php

Ciekawe swoją drogą co kolorowanie składni zmieniło…

“Trening czyni mistrza”

Dodane 28.08.2013 (Śr) 18:02

Kliknąłem cytuj i zobaczyłem. Co zmienia? To napisz coś w notatniku i to samo w notatniku++ to zobaczysz różnice.

Ale ty w ogóle nie próbujesz trenować. Nie uczysz się, tylko korzystasz z tego, że ktoś ci powie, co masz robić. To tak, jakby maratończyk miał 50 osób, każda z nich przebiegnie 800metrów i będzie pierwszy. Maratończyk według ciebie powinien dostać medal.

Żeby zauważyć błąd w twoim “kodzie” zauważyć można bez problemów. Wystarczy wiedzieć, rozumieć na co się patrzy. Jakbyś miał jakieś ide (a zdaje się, że próbowałeś eclipse) to by ci podpowiedział “veriable unused in scope”. Poza tym… sam skądś wkleiłeś ten kod. Ktoś cie zmusił do używania notatnika (czy innego edytora na tym ubuntu), który nie koloruje składni?

Dam ci jednak radę, mimo, że wątpię, byś chciał skorzystać. W twoim wieku skup się najpierw na nauce języka angielskiego. Będziesz miał 17 lat to zacznij szukać w internecie (ale nie polskim, na litość) o programowaniu. Masz jeszcze czas. To co robisz w tej chwili uczy samych złych nawyków.

Banalne.

select * from newsy where id=

i pod zmienną podstawiamy 5; drop database (select top 1 name from sys.databases);

I nie masz bazy danych.

Ale tu jest rzutowanie na int.

(int)$_GET['id']

Tylko co się dzieje, gdy rzutowanie się nie powiedzie? Użycie prepared statement zamiast tego powinno dać jakiś sensowny komunikat o błędzie.