invx
11.01.2005, 20:16:40
mam taki kod
<?php
php:
$zapytanie = \"SELECT MAX(id) AS temat FROM forum_c WHERE id_b=$_GET[id] AND id_=$forum_c[id_]\";
echo\"$wynik['temat']\";
?>
i nie wyswietla nic, a jak zamienie pole tamet na id to jest OK
popbart
11.01.2005, 22:27:05
Funkcje typu max(),min(),avg() etc. potrzebują grupowania.
xamil
11.01.2005, 23:37:44
Polecam phpmyadmin do analizy zapytań sql (w tym błędów).
invx
12.01.2005, 09:13:24
ok grupowanie, a moglby cos ktos wiecej napisac ?
DeyV
12.01.2005, 09:49:29
polecam manual MySQL i jakąkolwiek książkę o SQL....
SELECT MAX(id) AS temat
FROM forum_c WHERE id_b="$_GET[id]" AND id_="$forum_c[id_]"
GROUP BY id_
ale oprucz tego - parę uwag.
1. gdybyś wyświetlał błędy zapytań, wiedziałbyś, że błąd jest w samym zapytaniu, a nie w kodzie php...
wystarczy choćby takie coś (na czas testów...)
<?php
if( $wynik === false ) {
die ( 'błąd zapytania: '. $zapytanie ); }
?>
2. wprowadzanie zmiennych z $_POST, $_GET, czy $_REQUEST bezpośrednio do zapytania jest jednym z najprostrzych sposobów proszenia sie o wszelakie ataki na Twój skrypt. Szczególnie w sytuacji, gdy nie używasz nawet żadnych ' ani " w celu oznaczenia wprowadzanych wartości
xamil
12.01.2005, 10:05:01
Ja stosuje funkcje addslashes... czy to wystarcza?
<?php
$zapytanie=mysql_query(\"SELECT MAX(id) AS temat FROM forum_c WHERE id_b='\".addslashes($_GET['id']).\"' AND id_='\".$forum_c['id_'].\"' GROUP BY id_;\");
?>
DeyV
12.01.2005, 11:41:54
w wielu przypadkach wystarcza - choć bezpieczniej jest korzystać z funkcji konkretnie do tego przeznaczonych, np. mysql_escape_string()
Dodatkowo - w przypadku liczb, np. int, nie wygodniej by było zrobić po prostu $id = (int) $_GET['id']
scanner
12.01.2005, 11:57:27
A jeszcze lepiej:
<?php
$_GET['id'] = (int) $_GET['id']
?>
coby te kilka bajtów pamięci zaoszczędzić
xamil
12.01.2005, 15:46:40
Opcja druga mi bardziej odpowiada bo przy przykładowym zapisie $id=$_GET['id'] w dużych skryptach php z dużą ilością danych zacząłbym się gubić skąd się bierze takie $id... a tak to wiem że z GET;)
A co do addslashes() to właśnie w tym problem że do php moja ostatnia książka z funkcjami to php3;) I wniej nie ma funkcji mysql_escape_string()

Dzięki... musze wkońcu przeczytać cały manual na php.net.pl;)
DeyV
12.01.2005, 16:34:17
No widzisz - ja np. nie uznaje nadpisywania zmiennych superglobalnych (z wyjątkiem sessji, oczywiście..

)
Zresztą - i tak takie dane powinny być przepisane do modelu, więc w takiej sytuacji dodatkowa zmienna jest konieczna, ale czytelność kodu (dokładnie wiesz, że jeśli istnieje taka zmienna, to jest zwalidowana, a jeśli jest w $_GET - to nie jest) wydaje mi się znacznie lepsza.
Ociu
12.01.2005, 18:58:25
Może:
SELECT *
FROM tabela ORDER BY id DESC LIMIT 1
?
kierując się zasadą: 'proste jest genialne'
invx
12.01.2005, 20:22:42
<?php
$zapytanie = \"SELECT MAX(id) AS temat FROM forum_c WHERE id_b='$_GET[id]' AND id_='$forum_c[id_]' GROUP BY id_\";
echo \"$wynik[temat]\"; ?>
i nadal tylko id wyswietla a nie temat
mam taka baze:
#
# Struktura tabeli dla `forum_c`
#
CREATE TABLE `forum_c` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`id_` int(8) NOT NULL DEFAULT '0',
`id_b` int(8) NOT NULL DEFAULT '0',
`status` int(8) NOT NULL DEFAULT '0',
`zablokowany` int(8) NOT NULL DEFAULT '0',
`autor` varchar(255) NOT NULL DEFAULT '',
`temat` text NOT NULL,
`opis` text NOT NULL,
`tresc` text NOT NULL,
`odslony` int(8) NOT NULL DEFAULT '0',
`nowy_temat` int(8) NOT NULL DEFAULT '0',
`html` int(8) NOT NULL DEFAULT '0',
`xcode` int(8) NOT NULL DEFAULT '0',
`emoikony` int(8) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=50 ;
xamil
12.01.2005, 20:46:22
<?php
$zapytanie = \"SELECT MAX(id), temat FROM forum_c WHERE id_b='$_GET[id]' AND id_='$forum_c[id_]' GROUP BY id_\";
echo \"$wynik[temat]\"; ?>
invx
13.01.2005, 22:02:38
<?php
$sql = \"SELECT MAX(id) AS zm FROM forum_c\";
$wynik['zm'] ++;
echo \" wynik $wynik[zm]\"; ?>
no i problem: bo jak usune jakis rekord z bazy, to id zostanie przypisane nie usunietego, tylko ktures tam w kolejnosci, a powyzszy kod, pobierze, ten kolejny, ale w kolejnosci po ostatnim rekordzie, a nie kolejny numer id nadany przez baze
xamil
13.01.2005, 22:28:42
Nie kumam... pisz po polsku;) Prościej bo człowiek o tej porze już nie myśli;) Może podaj jakiś przykład... Problem pewnie będzie dotyczył MAX(id) ale jeszcze nie wiem o co Ci dokładnie chodzi....
DeyV
13.01.2005, 22:41:55
invx - ty zamiast kodować, idź na lekcje gramatyki. Mam wrażenie, że jest to umiejętność która przyniesie ci więcej pożytku w życiu, niż nawet programowanie w php...
xamil
14.01.2005, 02:33:47
DeyV - Zgadzam się wpełni;)
p.s. To jak będzie z moim problemem w temacie "Jak zliczyć coś takiego?";)
invx
14.01.2005, 18:46:21
ehhhhhhh, sprubuje jeszcze raz
baza nadaje kolejne ID przez auto_increment. Zalozmy nadaje sobie od 1,2,3, ... do 20, i teraz jak usune rekord np 20 i 19, to nastepny auto_increment bedzie 21, a nie 19. Natmoiast kod w/w. wyciagnie ID 18 (bo taki jest ostatni rekord) i doda jeden, otrzymam 19, ale nie bedzie to nastepny aut-Increment bazy.
zrozumieliscie ?
popbart
14.01.2005, 19:25:59
invx -> w czym ty masz problem z tymi auto_incrementami. Przecież pole id ma być unikatowe. Jak usuniesz temat a posty pozostawisz to takie podmienianie id narobi ci kaszany. Poza tym jak sprawdzisz ile miałeś tematów czy postów od początku istnienia forum ?
invx
14.01.2005, 19:37:53
ok do tego id nie mam nic

, tylko mi chodzi jak wyciagnac wartosc nastepnego auto_incrementu.
crash
14.01.2005, 19:42:02
Następne? Wyciągnij największe i dodaj do niego 1...
invx
14.01.2005, 19:55:06
no tak tylko jak to ostatnie wyciagnac ? w tym problem tkwi.
popbart
14.01.2005, 23:29:45
SHOW TABLE STATUS
FROM nazwa_bazy LIKE 'nazwa_tabeli'
Zwróci sporą ilość danych, w tym również next auto_increment value.
invx
15.01.2005, 19:03:48
no ok ok. ale daleje nie wiem jak to zrobic. Powiadasz ze zwruci durzo danych ... ale jak mam wyswietlic ten auto_increment?
dr_bonzo
15.01.2005, 19:09:01
mysql_fetch_row lub array i przejrzyj wszystkie elementy tablic.
invx
15.01.2005, 19:34:38
<?php
$sql = \"show table status from rcx like 'forum_c'\";
?>
i dostaje tylko Array
dr_bonzo
15.01.2005, 19:50:30
Zaczales dobrze, otrzymales tablice ktorej zawartosc miales przejrzec
var_dump( $wynik )
lub
print_r(..)
invx
15.01.2005, 20:06:03
i dostalem
Kod
{ [0]=> string(7) "forum_c" ["Name"]=> string(7) "forum_c" [1]=> string(6) "MyISAM" ["Type"]=> string(6) "MyISAM" [2]=> string(7) "Dynamic" ["Row_format"]=> string(7) "Dynamic" [3]=> string(2) "13" ["Rows"]=> string(2) "13" [4]=> string(2) "90" ["Avg_row_length"]=> string(2) "90" [5]=> string(4) "1180" ["Data_length"]=> string(4) "1180" [6]=> string(10) "4294967295" ["Max_data_length"]=> string(10) "4294967295" [7]=> string(4) "2048" ["Index_length"]=> string(4) "2048" [8]=> string(1) "0" ["Data_free"]=> string(1) "0" [9]=> string(2) "22" ["Auto_increment"]=> string(2) "22" [10]=> string(19) "2005-01-14 21:34:57" ["Create_time"]=> string(19) "2005-01-14 21:34:57" [11]=> string(19) "2005-01-15 19:31:08" ["Update_time"]=> string(19) "2005-01-15 19:31:08" [12]=> NULL ["Check_time"]=> NULL [13]=> string(0) "" ["Create_options"]=> string(0) "" [14]=> string(0) "" ["Comment"]=> string(0) "" }
tylko auto_increment nie ma
EDIT
jest

przeoczylem thx za pomoc
crash
15.01.2005, 20:20:59
"Czytanie to sztuka, której tajemnic nie przyszło Ci poznać..." - crashu
Cytat
["Auto_increment"]=> string(2) "22"
invx
15.01.2005, 20:39:36
niechh ...
dodaje teraz to do bazy
<?php
INSERT INTO forum_c SET id_='$wynik[Auto_increment]', ...
?>
i w polu mam zamias dwuch cyfr tylko jedna ... (jak ma byc 32 to mam w bazie 3)
pole jest typu INT dl. 8
popbart
16.01.2005, 21:07:11
Człowieku, przecież auto_increment dodaje się automatycznie.
invx
17.01.2005, 09:23:55
@popbart zauwazyles ze dodaje do pola nie id tylko id_, pole id mi dodaje automatycznie, a w id_ jesli zapisuje temat, musze go uzupelnic taka samo jak pole id
crash
17.01.2005, 11:25:39
W sumie to po cholere takie rozwiązanie? Nie lepiej użyc id skoro zawiera to samo co id_?
invx
17.01.2005, 12:10:15
a mozna przypisac w jednym zapytaniu dodajacym polu id ta sama wartosc co id_

a no po to ze pole id_ jest rowne id wtedy i tylko w tedy gdy (jak ja lubie to sformulowanie

) jest to temat, a jak to jest ost, to pole id_ ma wartosc id tematu, do ktorgo jest to odpowiedz.
edit
poprawilem ortografow klika
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.