woxala123
10.12.2016, 20:55:46
Witam!
Zrobiłem dodatkową kolumnę 'time' - określiłem w niej godzinę do której user mógł zapisać rekord. I teraz mam pytanko jaki warunek dopisać do
zapytania aby gdy jest już po czasie to user nie dopisze rekordu.
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < CURRENT_TIME()";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Dodajesz w czasie'!'</center>"; }else{
echo "<center>' Dodajesz po czasie'</center>";
Tylko nie chcę by zapisywało do rekordu
Czy jest ktoś w stanie pomóc w tym temacie jak to zrobić by user tylko zapisywał dane do konkretnej godziny. Gdyby próbował wyskakiwał by mu błąd że czas minął na dodanie rekordu.
Proszę o wskazówki.
Pozdrawiam
Pyton_000
10.12.2016, 21:05:45
Eeee... przecież masz już to co chciałeś albo ja Cię nie rozumiem.
woxala123
10.12.2016, 21:16:49
Chcę by user nie mógł zapisywać rekordu po minionym czasie. Np: teraz czas w kolumnie jest zdefiniowany na 22:00:00 gdy minie ten czas to user ma nie zapisać i wyskoczyć komunikat że może zapisać do określonej godziny. Bo owszem pokazuje sie komunikat że zapisuje rekord przd czasem albo po czasie -Ale włąśnie zapisuje nawet po czasie.
olszam
10.12.2016, 22:19:06
sprawdź normalnie na losowym użytkowniku czy mimo wszystko zwróci ci zero wyników i dodatkowo sprawdź jaki wynik ci zwraca mysql_num_rows i jeszcze zobacz jaki czas serwera masz ustawiony
woxala123
10.12.2016, 22:30:29
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "SELECT * FROM loro WHERE `time` = '".$time."'";
echo '<center>Oddajesz rekord po czasie!!!</center>';
echo '<center>Dodano rekord w czasie!</center>';
}
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `date` = CURRENT_DATE() ";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Wykorzystałeś limit '".$username."'!'</center>";
} else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Rekord dodany'</center>";
$insertSQL = sprintf("INSERT INTO loro (`username`, `bal1`, `bal2`, `bal3`, `bal4`, `bal5`, `bal6`, `date` ) VALUES ('".$username."',$bal1, $bal2, $bal3, $bal4, $bal5, $bal6, (NOW()))", GetSQLValueString($_POST['hiddenField'], "int"));
}
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `date` = CURRENT_DATE()";
if($totalRows_Recordset1 >= 2){
echo '<center>Dodałeś już wszystkie 2 rekordy!</center>'; }
else if($totalRows_Recordset1 ==1){
echo '<center>Dodałeś '.$totalRows_Recordset1.'-pierwszy rekord!</center>';
}
else if($totalRows_Recordset1 >1){
echo '<center>Dodałeś '.$totalRows_Recordset1.' typy!</center>';
} else if($totalRows_Recordset1 == 0){
echo '<center>Dodano rekord po raz pierwszy!</center>';
}
}
To kawałek kodu i teraz gdzie leży tu błąd aby user nie zapisywał rekordu gdy jest przekroczony czas?
Czas lokalny z mojego kompa na razie localhost
Pozdrawiam
Niree
10.12.2016, 22:36:16
$aktualnyczas = date("H:m:s");
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` > $aktualnyczas";
Skoro "time" stanowi limit, to musi być "time" większy niż $aktualna godzina. Jeśli time będzie mniejszy, to zwróci Ci zerowierszy .
Poza tym nie używaj w jednym pliku takich samych nazw zmiennych (już któryś raz widzę $query_Recordset) bo jedna zmienną podmieni daCo ne drugiej zmiennej i będzie syf. Ustal sobie od czego są konkretne zapytania i tak je nazywaj, np $query_checktime
woxala123
10.12.2016, 22:46:29
Na razie wg. twoich wskazówek zrobiłem tak - z tymi zmiennymi masz racje zaraz jeszcze to poprawię ale nadal zapisuje
$times = date("H:mm:ss");
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "ELECT * FROM loro WHERE `username` = '".$username."' AND `time` > $times";
echo '<center>Oddajesz rekord po czasie!!!</center>';
} else {
echo '<center>Dodano typ w czasie!</center>';
poprawiłem już na takie coś
$times = time("H:mm:ss");
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < $times";
echo '<center>Oddajesz rekord po czasie!!!</center>';
} else {
echo '<center>Dodano typ w czasie!</center>';
}
Niree
10.12.2016, 22:55:49
Daj H:m:s, jestem na telefonie i mi się rozmnożyły te literki.
Czas w kolumnie musi być w też w takim formacie.Ewentualnie mozesz wcześniej zrobić zapytanie do bazy o ostatni wpis danego użytkownika (limit 1 order by id) i robić np warunek
if($danebaza['time'] > $Times) echo 'dodano'; else 'po czasie';
Wtedy usuwasz w warunku zapytania kolumnę time I wyciągasz ostatni wpis danegoużytkownika .
woxala123
10.12.2016, 23:02:23
Już troche pogubiłem z tym się dziś. Co dalej?
Niree
10.12.2016, 23:15:49
$query_time= "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < $times";
Popatrz na warunek czasu. Napisałem Ci, że time musi być większe od $times. Ty dałeś na odwrót.
woxala123
10.12.2016, 23:21:35
To jest teraz jak piszesz i nadal to samo dodae i wyskakuje komunikat dodałeś rekord w czasie
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < $times";
echo '<center>Oddajesz rekord po czasie!!!</center>';
} else {
echo '<center>Dodano rekord w czasie!</center>';
}
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `date` = CURRENT_DATE() ";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Wykorzystałeś limit '".$username."'!'</center>";
} else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Rekord oddany'</center>";
$insertSQL = sprintf("INSERT INTO loro (`username`, `bal1`, `bal2`, `bal3`, `bal4`, `bal5`, `bal6`, `date` ) VALUES ('".$username."',$bal1, $bal2, $bal3, $bal4, $bal5, $bal6, (NOW()))", GetSQLValueString($_POST['hiddenField'], "int"));
Niree
10.12.2016, 23:26:21
...
Nie < tylko >.
Poza tym zły warunek z tym (!= 0), tak logicznie sobie przetłumacz co się dzieje z kodem krok po kroku.
woxala123
10.12.2016, 23:28:06
I cały czas to samo
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < $times";
echo '<center>Oddajesz rekord po czasie!!!</center>';
} else {
echo '<center>Dodano rekord w czasie!</center>';
}
$query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `date` = CURRENT_DATE() ";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Wykorzystałeś limit '".$username."'!'</center>";
} else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Typy oddany'</center>";
$insertSQL = sprintf("INSERT INTO loro (`username`, `bal1`, `bal2`, `bal3`, `bal4`, `bal5`, `bal6`, `date` ) VALUES ('".$username."',$bal1, $bal2, $bal3, $bal4, $bal5, $bal6, (NOW()))", GetSQLValueString($_POST['hiddenField'], "int"));
nospor
10.12.2016, 23:45:30
Sprawdzales w ogole czy $username masz poprawnie ustawione?
echo "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < $times";
I sprawdz jak wyglada to zapytanie. Jesli wg. ciebie jest ok to odpal je w konsoli mysql i zobacz co dokladnie dostaniesz
Niree
11.12.2016, 02:04:03
`time` < $times
Nie będę tysiąc razy powtarzał, że coś tu jest źle :-)
woxala123
11.12.2016, 08:13:12
Otrzymuje to
"SELECT * FROM loro WHERE `username` = 'w' AND `time` < 1481439184"
Poprawiłem zmienną co wcześniej podawałeś tzn:
$times = time("H:m:s") na
i daje komunikat
"SELECT * FROM loro WHERE `username` = 'w' AND `time` < 08:12:51" i potem jak wysyłam do zapisu daje komunikat
SELECT * FROM loro WHERE `username` = 'w' AND `time` < 08:12:40You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':12:40' at line 1
Co to może być?
Niree
11.12.2016, 08:23:10
A dałeś to w cudzysłów? Tą $times w zapytaniu.
arturpiotrowski
11.12.2016, 08:25:53
a 08:12:51 nie powinno być w cudzysłowie?
Niree
11.12.2016, 08:31:27
Poza tym masz zły znak większości. To 'time' ma być większy , a nie $times.
Popraw na:
`time` > '".$times."'
woxala123
11.12.2016, 08:36:13
Poprawiłem i teraz komunikat
SELECT * FROM loro WHERE `username` = 'w' AND `time` > '08:12:28' You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':12:28' at line 1
Niree
11.12.2016, 08:43:44
A w tabeli jaką masz godzinę wpisaną?
woxala123
11.12.2016, 08:44:23
22:00:00 -custom kolumna time
czyli tak ma być
$times = date("G:m:s ");
Niree
11.12.2016, 08:47:19
W $times daj G:m:s
//tak, tak ma być, tylko bez tej spacji na końcu
woxala123
12.12.2016, 17:33:43
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_time= "SELECT * FROM loro WHERE `username` = '".$username."' AND`time` > '".$times."'" ;
echo '<center>Oddajesz rekord w czasie!!!</center>';
} else {
echo '<center>Dodano rekord po czasie!</center>';
}
echo "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < '".$times."'"; $query_Recordset1 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `date` = CURRENT_DATE() ";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Wykorzystałeś limit '".$username."'!'</center>";
} else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Rekord oddany'</center>";
Taka mam wersję i nadal zapisuje -gdy np: ustawię godzinę 08:00:00 czyli teraz gdy ktoś próbuje zapisac po tej godzinie to zapisuje. Dobrze b było by blokowało taką możliwość
A może spróbować tą drogą że robie zmienna $times=date('2016:12:11 08:00:00) i tutaj zacząć porównywać pole time z zmienną.
Tylko jak to ropzpisać wraz z select?
Okey na razie działa na takiej zasadzie oto kod
Mam ustawioną na godzinę 10:00:00 - i teraz jak ktoś chce dodać rekord po tej godzinie to nie dodaje ale jak ustawie wyższą od aktualnej to doda. Tylko pozostała mi rzecz by tylko 2 rekordy wpisywał.
Jest to na razie zbyt prostę rozwiązanie i łopatologiczne gdzie codziennie będę musiał wpisywac wartości pole time Ale jeszcze nad tym rozwiązaniem trzeba pomysleć
$times=date("Y-m-d h"m
"s");
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_Recordset12 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `time`>='".$times."'";
echo "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` < '".$times."'" ;
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Próbujesz wstawić rekord po czasie '".$username."'!'</center>"; } else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Rekord dodany w czasie'</center>";
Czy ktoś moze podać jakieś inne przykłady?
Witam!
Niree albo ktoś inny z fum czy może mi dpowiedzieć na pytanie- czy to jest dobre rozwiązanie?
$times=date("Y-m-d h:m:s");
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_Recordset12 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` > '".$times."'";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Wykorzystałeś limit na dziś '".$username."'!'</center>";
// akcja po znalezieniu że dodał wszystkie rekordy
echo "<center>'Nie możesz dodać rekordu '".$username."'!'</center>"; } else {
// akcja po stwierdzeniu że dodał rekord
echo "<center>' Wstawiłeś rekord w czasie'</center>";
Niree
13.12.2016, 01:33:27
// akcja po znalezieniu przynajmniej dwóch rekordów
echo "<center>'Wykorzystałeś limit na dziś '".$username."'!'</center>";
// akcja, gdy ilość wyszukanych rekorów wynosi 0
echo "<center>'Nie możesz dodać rekordu '".$username."'!'</center>"; } else {
// akcja po stwierdzeniu że zarówno limit(2) nie jest przekroczony, jak i ilość rekordów nie wynosi 0
echo "<center>' Wstawiłeś rekord w czasie'</center>";
Nic wielkiego nie zmieniłem, oprócz operatora porównania
mysql_num_rows($Recordset12) == 0Reszta powinna być OK. Działa Ci to w ogóle?
woxala123
13.12.2016, 02:21:08
Teraz jest tak,że data ustawiona jest 2016-12-13 11:00:00 to nie można dodać rekordu-coś zaczyna juz sue dziać tylko nie tak bo powinien dodawac rekord.
Niree
13.12.2016, 04:42:23
A dałeś tez datę w $times?
//edit widzę ze dałeś
Dlaczego zmieniłeś format godziny? Czytałeś manuala? Dlaczego wcześniej było G:m:s i czym to się różni od tego co aktualnie masz w $times?
woxala123
13.12.2016, 08:54:19
Tak dałem datę też w kolumnie time i zmieniłem na datetime
viking
13.12.2016, 09:23:04
Małe h oznacza 12-godzinny format.
woxala123
13.12.2016, 12:08:19
A może viking coś konkretnie - dał jakiś przykład. Już próbowałem róznych opcji z ustawieniem daty. teraz wróciłem do czasu G:m:s a w kolumnie Time, typ danych Time
viking
13.12.2016, 12:34:29
W twoim programowaniu widać gigantyczny chaos. Bardziej strzelasz niż myślisz. Moja rada. Weź kartkę papieru, spisz co chcesz osiągnąć, warunki jakie mają być spełnione. Utwórz na papierze strukturę danych i dopiero to przepisuj do PHP. Coś tu jest nie tak jeśli nie ma znaczenia czy to data, czy czas.
woxala123
13.12.2016, 12:52:59
Znaczenie ma w tym przypadku teraz czas -Teraz czas mam ustawiony na 15:00:00 - i jest tak że dodaje 2 rekordy gdzie najpierw wyrzuca komunikat-"Dajesz rekord w czasie"- a jak ktos dał już 2 rekordy to wywala mu komunikat Masz juz limit wykorzystany. Tylko jak ustawie godzinę 11:00:00 czyli mniejsza od aktualnego to dodaje rekordy ile razy kliknę. Czyli jeszcze bym musiał dać jakis select co będzie informował że daje rekordy po tym czasie. Tylko zastanawiam jak to najlepiej ująć - Prosze o poradę.
Pozdrawiam.
$query_Recordset12 = "SELECT * FROM loro WHERE `username` = '".$username."' AND `time` > '".$times."'";
// akcja po znalezieniu przynajmniej dwóch rekordów
echo "<center>'Masz już dziś limit '".$username."'!'</center>";
}else{
echo "<center>'Dajesz rekord w czasie'".$username."'!'</center>";
viking
13.12.2016, 13:15:42
Czyli dla jednego usera w tabeli loro jest np
woxala123 | 13:21:12
woxala123 | 10:22:15
Jeśli tak to dlaczego countem nie sprawdzisz ile było dodane?
woxala123
13.12.2016, 13:24:30
Mi cały czas biega o to żeby user nie mógł dodawać rekordu po czasie nawet jak wcześniej nawet nie dawał rekordu-czyli jak zapisuje to w ten sposób
'w''2016-12-13', '15:00:00');
Mogę zrobić następną kolumnę gdzie będzie zapisywać dodanie rekordu automatycznie ale nie chce na razie tego robić.
viking
13.12.2016, 13:29:56
Ok. A odpowiesz na pytanie wyżej? Bo od tego zależy ile rekordów jest zwracanych.
woxala123
13.12.2016, 13:35:30
Nie wiem jak to countem sprawdzić-.
viking
13.12.2016, 13:43:22
select COUNT(*) from loro where czas > CURTIME() AND username = 'w'
woxala123
13.12.2016, 13:54:57
Zrobiłęm to tak . Ale co mi to da i jakie warunki bym musiał postawić?
[php]
SELECT COUNT(*) FROM loro WHERE `time` >CURTIME() AND `username` = '".$username."'
/php]
viking
13.12.2016, 13:58:54
Da ci to liczbę rekordów w przedziale czasowym.
Bardziej mnie zastanawia czym ten temat różni się od 4 poprzednich (http://forum.php.pl/index.php?showtopic=253331&hl=) w którym już podobno był działający kod.
woxala123
13.12.2016, 13:59:44
Tutaj było do konkretnej daty ale tu chodzi by nie było możliwości zapisywania rekordu oo podanym czasie np: ustawionym w custom.
viking
13.12.2016, 14:08:36
No patrz
http://forum.php.pl/index.php?s=&showt...t&p=1205960Możesz też wkładać przez funkcję:
CREATE PROCEDURE `insertCostam`(
IN `username` VARCHAR(50)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare records int;
SELECT COUNT(*) INTO records FROM t1 WHERE czas > CURTIME() AND user = username;
IF records > 2 then
SIGNAL SQLSTATE 'ERR0R' SET MESSAGE_TEXT = 'Błąd...';
end IF;
END
call `insertCostam`('test')
woxala123
13.12.2016, 16:33:14
Tej funkcji nie użyje-nawet nie potrafiłbym jej zastosować. Myślałem może od BETWEEN tzn że w jednej kolumnie mam zdefiniowany czas 06:00:00 a w drugiej kolumnie czas np: 20:00:00 i wtedy
gdzie $times BETWEEN 06:00:00 AND 20:00:00 to by mógł godać rekord a po gdy nie występuję select to nie dodaje rekordu czy to jest dobry pomysł ewentualnie jeśli tak to jak zrobić zapytanie i if.
Pozdrawiam
trueblue
13.12.2016, 17:02:14
A nie wystarczy Ci jedno zapytanie?
INSERT INTO tabela
SELECT wartosc1,wartosc2,...wartoscN FROM loro WHERE username=XXXX AND time<NOW()
GROUP BY username
HAVING COUNT(*)<1
woxala123
13.12.2016, 17:12:09
Spróbuję to zastosować późnym wieczorem - bo teraz idę do roboty. Ale jeszcze fajnie by było czy w wartości podawać nazwe kolumn czy godziny które podałem i jeszcze co ta ...wartośćN ?
trueblue
13.12.2016, 17:18:12
W wartościach wstawiasz albo suche wartości, albo nazwy kolumn. Przy czym jest to zapytanie grupujące, więc...nie wchodząc w szczegóły...może nie działać do końca tak jak chcesz.
Czy wartości, które chcesz wstawić są w tabeli loro? Czas, zakładam, że wstawiasz aktualny, czyli NOW(), a nie wartość kolumny time.
woxala123
13.12.2016, 17:23:07
Kolumna time jest ustawiona sztywno tzn. że ma okresloną godzine w custom w tym przpadku np16:00:00 lub można zmienić że dzisiejsza data i sztywna godzina. I tylko mi zalezy by user nie mógł dodawac rekordu po wyznaczonym czasie w kolumnie time
trueblue
13.12.2016, 17:27:21
Przecież od tego jest warunek w klauzli WHERE.
woxala123
19.12.2016, 16:43:57
okey póżniej to sprawdzę na razie dzięki za zainteresowanie.
Witam!
Sorry że jeszcze wracam do tematu. Ale zrobiłem taką wersję zapisywania do konkretnej godziny.
Oto kawałek kodu.
if((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $query_Recordset1 = "SELECT * FROM loro";
if ($date > $date5 ){
echo "<center>'Po czasie'".$username."'!'</center>";
}else{
$query_Recordset1 = "SELECT * FROM loro ";
if($totalRows_Recordset1 >=3){
//Jeśli osiągnął 3 rekordy to koniec
echo "<center>'Wykorzystałeś limit oddawania głosów'".$username."''</center>"; }else{
echo "<center>'Głosujesz'</center>";
Pytanko -Czy jest to dobre rozwiązanie - czy jest cos takiego żeby zmienna $date5 zmieniała swoją wartośc automatycznie co 24 godziny. pozdrawiam.
nospor
19.12.2016, 16:51:35
Ty wez w koncu usiadz raz a porzadnie na tych datach bo sie bujasz i bujasz z banalnym kodem
$date5 = strtotime(date("2016-12-11 22:00:00"));
Czy to nie tobie juz mowilem, ze
date('2016-01-01')
to jest to samo co
2016-01-01
?
jak chcesz miec date z danego dnia, to wstawiaj tam formaty daty a nie date z palca...
$date5 = strtotime(date("Y-m-d 22:00:00"));
woxala123
19.12.2016, 21:28:48
Teraz wyszedł jeden z problem. W momencie gdy jeden z userów doda rekordy inny user już nie może oddać bo wyskakuje komunikat 'Wykorzystałeś limit oddawania głosów'.
Kod powyżej. Jakie założenie trzeba zrobić?
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.