Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyciaganie ostatniej wartosci
Forum PHP.pl > Forum > Bazy danych > MySQL
invx
mam taki kod

  1. <?php
  2. php: 
  3. $zapytanie = &#092;"SELECT MAX(id) AS temat FROM forum_c WHERE id_b=$_GET[id] AND id_=$forum_c[id_]\"; 
  4. $wynik = mysql_fetch_array(mysql_query($zapytanie)); 
  5. echo&#092;"$wynik['temat']\"; 
  6.  
  7. ?>


i nie wyswietla nic, a jak zamienie pole tamet na id to jest OK
popbart
Funkcje typu max(),min(),avg() etc. potrzebują grupowania.
xamil
Polecam phpmyadmin do analizy zapytań sql (w tym błędów).
invx
ok grupowanie, a moglby cos ktos wiecej napisac ?
DeyV
polecam manual MySQL i jakąkolwiek książkę o SQL....

  1. SELECT MAX(id) AS temat
  2. FROM forum_c WHERE id_b="$_GET[id]" AND id_="$forum_c[id_]"
  3. 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...)
  1. <?php
  2.  
  3. $wynik = mysql_fetch_array(mysql_query($zapytanie)); 
  4. if( $wynik === false ) {
  5.  die ( 'błąd zapytania: '. $zapytanie );
  6. }
  7. ?>


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
Ja stosuje funkcje addslashes... czy to wystarcza?
  1. <?php
  2.  
  3. $zapytanie=mysql_query(&#092;"SELECT MAX(id) AS temat FROM forum_c WHERE id_b='\".addslashes($_GET['id']).\"' AND id_='\".$forum_c['id_'].\"'
  4. GROUP BY id_;&#092;");
  5.  
  6. ?>
DeyV
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'] questionmark.gif
scanner
A jeszcze lepiej:
  1. <?php
  2. $_GET['id'] = (int) $_GET['id']
  3. ?>
coby te kilka bajtów pamięci zaoszczędzić smile.gif
xamil
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() winksmiley.jpg Dzięki... musze wkońcu przeczytać cały manual na php.net.pl;)
DeyV
No widzisz - ja np. nie uznaje nadpisywania zmiennych superglobalnych (z wyjątkiem sessji, oczywiście.. winksmiley.jpg )
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
Może:
  1. SELECT *
  2. FROM tabela ORDER BY id DESC LIMIT 1

?
kierując się zasadą: 'proste jest genialne' smile.gif
invx
  1. <?php
  2. $zapytanie = &#092;"SELECT MAX(id) AS temat FROM forum_c WHERE id_b='$_GET[id]' AND id_='$forum_c[id_]' GROUP BY id_\";
  3. $wynik = mysql_fetch_array(mysql_query($zapytanie)) or die(mysql_error());
  4.  echo &#092;"$wynik[temat]\";
  5. ?>


i nadal tylko id wyswietla a nie temat

mam taka baze:
  1. #
  2. # Struktura tabeli dla `forum_c`
  3. #
  4.  
  5. CREATE TABLE `forum_c` (
  6. `id` int(8) NOT NULL AUTO_INCREMENT,
  7. `id_` int(8) NOT NULL DEFAULT '0',
  8. `id_b` int(8) NOT NULL DEFAULT '0',
  9. `status` int(8) NOT NULL DEFAULT '0',
  10. `zablokowany` int(8) NOT NULL DEFAULT '0',
  11. `autor` varchar(255) NOT NULL DEFAULT '',
  12. `temat` text NOT NULL,
  13. `opis` text NOT NULL,
  14. `tresc` text NOT NULL,
  15. `odslony` int(8) NOT NULL DEFAULT '0',
  16. `nowy_temat` int(8) NOT NULL DEFAULT '0',
  17. `html` int(8) NOT NULL DEFAULT '0',
  18. `xcode` int(8) NOT NULL DEFAULT '0',
  19. `emoikony` int(8) NOT NULL DEFAULT '0',
  20. PRIMARY KEY (`id`)
  21. ) TYPE=MyISAM AUTO_INCREMENT=50 ;
xamil
  1. <?php
  2. $zapytanie = &#092;"SELECT MAX(id), temat FROM forum_c WHERE id_b='$_GET[id]' AND id_='$forum_c[id_]' GROUP BY id_\";
  3.  
  4. $wynik = mysql_fetch_array(mysql_query($zapytanie)) or die(mysql_error());
  5. echo &#092;"$wynik[temat]\";
  6. ?>
invx
  1. <?php
  2. $sql = &#092;"SELECT MAX(id) AS zm FROM forum_c\";
  3. $wynik = mysql_fetch_array(mysql_query($sql));
  4. $wynik['zm'] ++;
  5.  
  6. echo &#092;" wynik $wynik[zm]\";
  7. ?>


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 aaevil.gif
xamil
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
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
DeyV - Zgadzam się wpełni;)
p.s. To jak będzie z moim problemem w temacie "Jak zliczyć coś takiego?";)
invx
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
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
ok do tego id nie mam nic biggrin.gif, tylko mi chodzi jak wyciagnac wartosc nastepnego auto_incrementu.
crash
Następne? Wyciągnij największe i dodaj do niego 1...
invx
no tak tylko jak to ostatnie wyciagnac ? w tym problem tkwi.
popbart
  1. SHOW TABLE STATUS
  2. FROM nazwa_bazy LIKE 'nazwa_tabeli'

Zwróci sporą ilość danych, w tym również next auto_increment value.
invx
no ok ok. ale daleje nie wiem jak to zrobic. Powiadasz ze zwruci durzo danych ... ale jak mam wyswietlic ten auto_increment?
dr_bonzo
mysql_fetch_row lub array i przejrzyj wszystkie elementy tablic.
invx
  1. <?php
  2. $sql = &#092;"show table status from rcx like 'forum_c'\";
  3. $wynik = mysql_fetch_array(mysql_query($sql));
  4. echo &#092;"$wynik\";
  5. ?>


i dostaje tylko Array
dr_bonzo
Zaczales dobrze, otrzymales tablice ktorej zawartosc miales przejrzec

var_dump( $wynik )
lub
print_r(..)
invx
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 biggrin.gif przeoczylem thx za pomoc smile.gif
crash
"Czytanie to sztuka, której tajemnic nie przyszło Ci poznać..." - crashu
Cytat
["Auto_increment"]=> string(2) "22"
invx
niechh ...

dodaje teraz to do bazy
  1. <?php
  2.  
  3. INSERT INTO forum_c SET id_='$wynik[Auto_increment]', ...
  4.  
  5. ?>

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
Człowieku, przecież auto_increment dodaje się automatycznie.
invx
@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
W sumie to po cholere takie rozwiązanie? Nie lepiej użyc id skoro zawiera to samo co id_?
invx
a mozna przypisac w jednym zapytaniu dodajacym polu id ta sama wartosc co id_ questionmark.gif

a no po to ze pole id_ jest rowne id wtedy i tylko w tedy gdy (jak ja lubie to sformulowanie smile.gif) jest to temat, a jak to jest ost, to pole id_ ma wartosc id tematu, do ktorgo jest to odpowiedz.

edit
poprawilem ortografow klika smile.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.