Skocz do zawartości
Gość l3szcz

Błąd zapytania (?)

Polecane posty

Gość l3szcz

Robię skrypt, który ma na celu pobieranie newsów z bazy danych. Najgorsze co mogło się przytrafić to błąd o takiej postaci:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/xxxxxxxxxx/public_html/index.php on line 99

Nie jestem w stanie tego wyjaśnić, jak mam naprawić też nie wiem, wszystko wygląda poprawnie, polecenia w phpmyadmin przechodzą bezbłędnie.

Tu linia 99 i poprzednie:

#$query = "SELECT * FROM news ORDER BY id";
// przy tym tez ten sam błąd
$query = "SELECT * FROM 'news' ORDER BY id";
$sql = mysql_query($query);
while($rekord = mysql_fetch_assoc($sql))
{
$id = $rekord[0];
$nazwa = $rekord[1];
$data = $rekord[2];
$autor = $rekord[3];
$tresc = $rekord[4];
	echo '<ul>'.$nazwa.'
	<li>Autor: '.$autor.'</li>
	<li>Data: '.$data.'</li>
	</ul><br />'; // 4
	echo '<ul>'.$tresc.'</ul><br />';
	echo '<li><a href="news.php?id='.$id.'" target="_blank">Wi뤥j informacji</a></li>';
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Wielkość liter w nazwie tabeli się zgadza?

Jeśli tak to spróbuj takie zapytanie:

 

$query = "SELECT * FROM `news` ORDER BY id";

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość l3szcz
No database selected
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/xxxxxxxxxxx/public_html/index.php on line 101

Okazalo sie ze w ogole nie laczy..

$db = mysql_connect('127.0.0.1', 'pcpr_news' , 'ttt123');
$dbs = mysql_select_db("pcpr_news");

Korzystam z mysql ponieważ serwer docelowy nie ma obsługi mysqli (firma dla której pisze strone ma hosting z internetdsl.pl :o )

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość l3szcz

Dobra, problem mam dalej inny, też prawdopodobnie z zapytaniem:

SELECT * FROM tabelka WHERE 'user'='l3szcz'

W PHPMyAdmin po wykonaniu polecenia wyświetla się:

MySQL zwrócił pusty wynik (zero wierszy). ( Wykonanie zapytania trwało 0.0003 sekund(y) )

Z tabeli chce wyciągnąć kolumny id, mail, user. Wypełniłem testowo kolumny danymi:

id = '1'
mail = 'admin@localhost'
user = 'l3szcz'

Co może być nie tak?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W postach powyżej już dostałeś kilka linków. Jeśli przeczytasz te artykuły to zrozumiesz różnice pomiędzy `, a '

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość l3szcz

Dobra, kolejny problem:

Nie można dodać artykułu z powodu 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 ''admin', '2013-09-11', 'article', 'test')' at line 1

Tak wygląda zapytanie: (chodzi mi o zapytanie $mysql2, $mysql dodaje sie poprawnie)

$login = $baza['nick'];
$article_title = $_POST['article_title'];
$article_text = $_POST['article_text'];
$mysql = mysql_query("INSERT INTO articles (NULL, '$article_title', '$time', '$login', '$article_text')");
				$typ = $_GET['add'];
				$mysql2 = mysql_query("INSERT INTO logs ('$login', '$time', '$typ', '$article_title')");

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Może nie jestem jakimś geniuszem z PHP/MySQL, ale dzięki za linki do książek, których nie kupować :)

$mysql = mysql_query("INSERT INTO articles (NULL, '$article_title', '$time', '$login', '$article_text')");
                $typ = $_GET['add'];
                $mysql2 = mysql_query("INSERT INTO logs ('$login', '$time', '$typ', '$article_title')");

Ja bym to zamienił na mniej więcej coś takiego:

$zapytanie1 = "INSERT INTO `articles` (`id?(albo coś co tu masz)`, `tytul_artykulu`, `artykul`) VALUES ('', '$article_title', '$time', '$login', '$article_text')";
$idzapytania = mysql_query($zapytanie1);

$zapytanie2 = "INSERT INTO `logs` (`id`, `login`, `czas`, `typ`, `tytul`) VALUES ('', '$login', '$time', '$typ', '$article_title')";            
$idzapytani2 = mysql_query($zapytanie1);

I dorób sobie pola ID!!!

Edytowano przez Kamikadze (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość l3szcz

Samych zapytań mysql się uczyłem przez php.net :D Trochę pokaleczyłem to ;(

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Ja podstawy brałem stąd: http://webmade.org/kursy-online/kurs-mysql.php polecam ci na początek, ale później poczytaj o bezpieczeństwie.

 

Na początek to:

http://helion.pl/ksiazki/php5-bezpieczne-programowanie-leksykon-kieszonkowy-jacek-ross,php5lk.htm

 

Jest kilka ciekawych tricków w niej i dużo teorii jak na tak małą książkę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Sprawdzałeś to co ci wkleiłem? Tylko przerób tam pod swoje dane bo wpisałem przykładowe ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ja bym to zamienił na mniej więcej coś takiego:

$zapytanie1 = "INSERT INTO `articles` (`id?(albo coś co tu masz)`, `tytul_artykulu`, `artykul`) VALUES ('', '$article_title', '$time', '$login', '$article_text')";
$idzapytania = mysql_query($zapytanie1);

$zapytanie2 = "INSERT INTO `logs` (`id`, `login`, `czas`, `typ`, `tytul`) VALUES ('', '$login', '$time', '$typ', '$article_title')";            
$idzapytani2 = mysql_query($zapytanie1);

I dorób sobie pola ID!!!

 

Primo: Po czym wnosisz, że przedpiśća nie ma kolumny na klucz główny? NULL jako pierwszy parametr sugeruje (niestandardowe, ale używalne w mysqlu) użycie domyślnej wartości. Jeżeli pierwszą kolumną w definicji był właśnie klucz główny, to NULL jest o niebo zdrowsze niż '' (chociaż w zasadzie to taką kolumnę należałoby pominąć). SQL l3szcza jest fatalny, ale to akurat chyba najmniejszy z jego problemów.

 

Secundo: UTFG: SQL injection. Właśnie wystawiłeś całą swoją bazę internetom do zapisu. l3szcz zresztą też.

 

Tertio: mysql_query. Proszę Cię (i przedpiścę), nie w XXI wieku. Nie po to powstało PDO, żeby to truchło jeszcze ruszać. Zapomnijcie o istnieniu tak niskopoziomowych i skopanych na etapie samego projektowania funkcji.

 

Quarto: l3szcz, użyj jakiegoś frameworka, nie męcz się z gołym PHPem. Np. tutaj sobie poczytaj: http://webmastah.pl/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Ale żeś mu pomógł normalnie... Kolega chce się nauczyć jakichś podstaw a ty mu frameworka prezentujesz...

 

Zamiast rzucić ciekawymi linkami do tutków, artykułów to najlepiej powiedzieć że coś jest złe bo jest złe...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ale żeś mu pomógł normalnie... Kolega chce się nauczyć jakichś podstaw a ty mu frameworka prezentujesz...

 

Zamiast rzucić ciekawymi linkami do tutków, artykułów to najlepiej powiedzieć że coś jest złe bo jest złe...

 

Największą pomocą będzie jak ZOSTAWI GOŁE PHP W CHOLERĘ. To nieodwracalnie uszkadza mózg i wpaja najgorsze możliwe wzorce. Piszę całkowicie serio.

 

PHP przykryte jakimś używalnym frameworkiem (na co dzień piszę w Django, więc z głowy nie wiem, który jest używalny, dlatego odesłałem do webmastah) może być fajną platformą do developmentu. Ale takie gołe:

<? mysql_query("INSERT INTO tab VALUES($_GET[foo])") ?>

powinno być prawnie zakazane pod karą rozstrzelania.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Z tym ostatnim to się zgadzam bo sam na podobnę rozwiązania się nadziałem, ale wystarczy odpowiednie filtrowanie rzeczy idących od usera i nagle 99% problemów znika.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Z tym ostatnim to się zgadzam bo sam na podobnę rozwiązania się nadziałem, ale wystarczy odpowiednie filtrowanie rzeczy idących od usera i nagle 99% problemów znika.

 

Nie. "Odpowiednie filtrowanie" to obejście problemu, który w ogóle nie powinien istnieć, a który _rozwiązuje_ (nie _obchodzi_) użycie współczesnego interfejsu do baz danych (chociażby PDO).

 

Wiesz, że w jakimś dwubajtowym kodowaniu jeden z chińskich ideogramów zawiera ASCII 0x5c, czyli backslash? Zgadnij, jak to wpływa na "zabezpieczenia" oparte o addslashes/stripslashes/wytnij_slashes_real_escape_string. Zamiast się zastanawiać, czy na pewno Twoje "rozwiązanie" z filtrowaniem/escape'owaniem danych od klienta działa, możesz zlikwidować całą klasę problemów.

 

Użycie jakiegoś frameworka (jakiegokolwiek używanego nie tylko przez autora i jego psa) chowa przed Tobą tego typu pomysły i generalnie wymusza zdrowsze podejście (oddzielenie logiki biznesowej od prezentacji itp.).

 

Kiedyś jeszcze lepienie w gołym PHP miało sens, jak nie było powszechnych frameworków i darmowych SaaSów do wszystkiego, ale teraz naprawdę nie jestem w stanie znaleźć jakiegokolwiek uzasadnienia poza masochizmem.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Może i tak, ale mnie i tak nie przekonują FW przy programowaniu. Osobiście traktuję to jak przyjemne spędzanie czasu a nie pracę, więc może i dla tego. Może przez to że pisanie czegoś od zera daje lepszą satysfakcję niż gotowiec i dodanie tylko kilku pierdółek.

 

A co do tych filtracji - jak się rozplanuje używanie głównie cyfr / liczb to połowa filtracji schodzi z głowy bo deklarujesz typ danych i tyle + ewentualnie dodatkowo filtracja jak ktoś jest nadgorliwy :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×