Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilka zapytań
Forum PHP.pl > Forum > Bazy danych > MySQL
pala2222
witam
Jakiś czas temu stworzyłem temat w którym dostałem odpowiedzi na moje pytania, ale został on skasowany i nie pamiętam co tam było.

jak zapisać w PHP aby stworzyć tabele z polem w którym by był automatycznie dodawany czas dodania rekordu?
blooregard
Pole w bazie musi mieć ustawione NOT NULL DEFAULT 'to co ma byc tam dodawane'
pala2222
Dziękuje

Czy jest możliwość aby po dodaniu rekordu w zwrocie dostać jego id?

np
  1. $zapytanie="dodanie jakiegoś rekordu"
  2. $wynik = mysql_query($zapytanie);

i żeby w zmiennej wynik znajdował się jego id.

Jest mi to potrzebne bo będę chciał połączyć kilka tabeli ze sobą.
przynależnością, że tab2 należy do tab2 i będzie posiadało w jakieś tabeli jego id
myślałem nad tym http://www.kess.snug.pl/?sid=10&pid=50
bo to pokazuje ostatnio dodany rekord(zgadza się?), ale jeśli się coś zatnie i będzie większy ruch dodawania rekordów to mogę uzyskać czego innego id
Może macie jakiś inny pomysł
pala2222
znalazłem tafunkcje, ale czy ona jest bezpieczna? bo ona pokazuje ostatnio dodany rekord
bo jeżeli sporo osób dodaje rekordów tym, samym czasie i jeśli coś się przytnie lub coś podobnego, to w tedy uzyskam nie swój id
Mchl
Uzyskasz zawsze ID ostatniego rekordu wstawionego w bieżącym połączeniu. Uważaj tylko na INESRTy z wieloma wierszami, bo wtedy dostaniesz id pierwszego wstawionego wiersza.
pala2222
Cytat(Mchl @ 18.04.2010, 14:16:56 ) *
Uzyskasz zawsze ID ostatniego rekordu wstawionego w bieżącym połączeniu.wtedy dostaniesz id pierwszego wstawionego wiersza.

Możesz jaśniej?
lub podaj najlepiej jakiś przykład
pala2222
Jest możliwość, aby zapisać zapytanie sql przez naku ' przy dodawaniu rekordu, ponieważ mam problem nie związany z php.
"INSERT INTO `sql` (`id`, `nazwa`) VALUES (NULL,'chodzi o tą cześć')"
Mchl
Co?
pala2222
ok już wiem w czym problem(chyba)
jak zrobić, aby dla jednej zmiennej było wyłączone Magic_quotes
bo nie chce aby do znaku ' było dodawane \ czyli \'

bo mam problem bo jak przekazuję zmienną do post to dodaje mi \ przed ' a ja tego nie chce.
to co mam zrobić?
Mchl
Kod
if(get_magic_quotes_gpc()) {
  $zmienna = stripslashes($_POST['zmienna']);
} else {
  $zmienna = $_POST['zmienna'];
}
$zmienna = mysql_real_escape_string($zmienna);
pala2222
wielkie dzięki

to co podałeś to całkowicie nie działa
zadziałało jak przez przypadek usunąłem tą linijkę
  1. $zmienna = mysql_real_escape_string($zmienna);

to jest coś ważnego?

byś mógł dodać jakiś krotki komentarz do warunku tego ifa co on robi
Mchl
get_magic_quotes_gpc() sprawdza, czy magic_quotes są włączone. Jeśli tak, to stripslashes() usuwane są wszystkie dodane przez nie \.
Na koniec mysql_real_escape_string poprawnie zabezpiecza wszelkie znaki specjalne.

I teraz pytani: co takiego chcesz zrobić, że mysql_real_escape_string Ci przeszkadza? Jak wygląda Twoje zapytanie i co do niego chcesz wstawić?
pala2222
przesyłam przez post coś takiego
  1. $a='kotek','167','4534', 'bla') '


i to wklejam
  1. $zapytanie="INSERT INTO `sql` (`id`, `czas`,`nazwa`,`numer`,`kod`,`liczba`) VALUES (NULL,NULL,".$a;

no i
  1. mysql_query($zapytanie);


i bez tej ostatniej linijki działa, a z dodaje \
Mchl
Bardzo niedobry pomysł z punktu widzenia bezpieczeństwa. Powinieneś przesłać te wartości albo jako osobne zmienne, albo w tablicy, i w samym PHP odpowiednio je obrobić.
pala2222
bo ja to wysyłam przez curl w c++
i zależy mi żeby to szło jak najszybciej, mam tam takich zmiennych z 40 i gdybym każde z osobna tak wysyłał to zajmie to dużo więcej czasu w porównaniu z tym jak to umieśćże w jednej zmiennej POST i potem to ewentualnie podzielę.
masz może jakiś pomysł, żeby to jakoś jakoś zabezpieczyć bez przesyłania tego wszystkiego z osobna?
tam nie będzie jakiś tajnych danych ale nie chce, zęby ktoś narobił mi szkód
Mchl
A dlaczego miałoby być wolniej? Jedna "duża" zmienna, czy 40 "małych" i tak wszystkie idą w ramach jednego żądania...

Jak już chcesz w jednej, wysyłaj samą listę przedzieloną przecinkami.

Kod
//$_POST['zmienna'] = "kotek,167,4534, bla"

if(get_magic_quotes_gpc()) {
  $zmienna = stripslashes($_POST['zmienna']);
} else {
  $zmienna = $_POST['zmienna'];
}
$vars = explode(',',$zmienna);

foreach($vars AS $key => $value) {
  $vars['$key'] = "'".mysql_real_escape_string($value)."'";
}

$values = implode(',',$vars);

$sql = "INSERT INTO `sql` (`nazwa`,`numer`,`kod`,`liczba`) VALUES ($values)";
pala2222
nie za bardzo to działa bo nie dodaje tych znaków prim
Mchl
Masz ustawione wyświetlanie błędów?
pala2222
tak testuje na cba żeby u siebie czegoś nie skopać przez przypadek w bazie danych

ten twój kod nie wstawia znaków prim, znaczy wstawia ale w słowie bla i je podwaja czyli jest bla,'bla'
Mchl
Zgadza się. Mój błąd:

Kod
foreach($vars AS $key => $value) {
  $vars[$key] = "'".mysql_real_escape_string($value)."'";
}
pala2222
wielkie dzięki.
A byś mógł tak krótko napisać dlaczego tak sięrobi i jakie mogą być przesto kłopoty?
ale przecież to właściwie nic nie zmienia?
jak to działa w sposób bezpieczeństwa(bo programistyczne wiem jak działa ten kod)

mozęsz napisać na co jeszcze uważać?
z takich oczywistych rzeczy, zęby nie było żadnej wtopy
Mchl
Wszystko przez to:
http://en.wikipedia.org/wiki/SQL_injection

magic_quotes miał być "cudownym" sposobem na zabezpieczenie się przed takimi atakami, ale z natury swojej takim być nie może (bo każdy system bazodanowy ma swoje własne znaki specjalne). Stąd też w nowszych wersjach PHP odchodzi się od stosowania magic_quotes. Nadal jednak na na wielu serwerach jest on włączony, stąd konieczność wykrywania i 'odczyniania' tego co zrobił (a robi tyle, że puszcza addslashes() na wszystkich zmiennych GET,POST,COOKIE i niektórych SERVER i FILES).

Jak już mamy zmienną w takiej postaci, w jakiej rzeczywiście wprowadził ją użytkownik, przepuszczamy ją przez właściwą funkcję zabezpieczającą. Dla MySQL jest to mysql_real_escape_string().
pala2222
co by było lepsze
zrobienie dodatkowych kolumn dla części rekordów, czy umieszczenie danych w jednej dodatkowej kolumnie?
podam to na przykładzie:
Załóżmy, że moja baza danych zawiera pojazdy i 1/5 z nich to auta, które zawierają dodatkowe dane abs, kolor nadwozia,paliwo,rodzaj nadwozia.

i co jest lepiej zrobić?
Stworzyć specjalnie da nich 4 kolumny w bazie z tymi wartościami, czy dodać jedną "inne" z której by też korzystały też inne pojazdy.
w tej kolumnie by były wpisywane wartości po /.
Teraz wyszukiwanie auta o Kolorze czerwonym by było poprzez %czerwony% w kolumnie "inne"

wiesz o co mi chodzi?
to jest dość bezpieczne i dobre rozwiązanie?
Mchl
To jest rozwiązanie, którego będziesz żałował. Lepiej zrobić listę EAV.

http://explainextended.com/2010/04/02/mult...-vs-not-exists/
pala2222
mam w planach szukajkę biggrin.gif by służyła tylko do szukania po tytułach
taką, że jak wypiszę call of duty 2
to najpierw wyskoczy mi
call of duty 2
potem wszystkie tytuły zawierające call of duty
i na końcu wszystkie z call lub duty
(ale tak żeby się nie powtarzało)

w cześniej się o to pytałem na forum i napisano mi, żeby zainteresował się FULL TEXT SEARCHING

naskrobałem takie coś, ale nic nie wypisuje a rekordy zawierają w kolumnie nazwa rekordy call of duty

  1. $zapytanie="SELECT nazwa FROM gry WHERE MATCH (nazwa) AGAINST ('call of duty')";
  2. $idzapytania = mysql_query($zapytanie);
  3.  
  4. while( $wiersz = mysql_fetch_array($idzapytania) ){
  5. echo "<td>".$wiersz['nazwa']."</td>";
  6. }
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.