Czy istnieje możliwość przygotowania takiego zapytania jako prepare i bind_param:
$result = $stmt->query("INSERT INTO numery (numer,gid,mid) SELECT IFNULL(MAX(numer), 0)+1, $last_id, $mid FROM numery WHERE YEAR((nr_daty)) = YEAR(NOW())");
A jak chcesz inaczej ująć? Zapytanie jest poprawne, wystarczy bindować wartości.
P.S. YEAR((nr_daty)) tu nie jest potrzebny podwójny nawias. A zamiast YEAR(NOW()) warto również bindować rok.
Dziękuję, faktycznie nie zauważyłem tych podwójnych nawiasów. Co do bindowania, nie bardzo mam doświadczenie, mógłbym prosić o podpowiedź? Obecne zapytanie działa, ale wszędzie pisze, żeby bindować bo to bezpieczniejsze. Czy coś takiego będzie poprawne:
$result = $smtp->prepare("INSERT INTO numery (numer,gid,mid) VALUES (SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW())")); $result->bind_param('ii', $last_id, $mid);
A sprawdzałeś? To najlepsza metoda nauki.
P.S. Jeśli wcześnie używałeś zmiennej $stmt, to pewnie tu też powinieneś.
Niestety, otrzymuję komunikat o błędzie: Call to a member function bind_param() on boolean in /var/www/html... próbowałem zmienić z "i" na "s", też nic.
Czyli mówi ci to że prepare zwróciło false. Masz w ogóle połączenie z bazą?
Tak, tu na pewno jest wszystko w porządku, bo robię to w transakcji. Pierwsze zapytanie - prosty insert, też z prepare - przechodzi, natomiast tu daje błąd. Czy ta moja składnia zapytania jest poprawna? Bo tu właśnie mam wątpliwości.
INSERT INTO numery (numer,gid,mid) VALUES (SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW())
INSERT INTO numery (numer,gid,mid) SELECT IFNULL(MAX(numer), 0)+1, $last_id, $mid FROM numery WHERE YEAR((nr_daty)) = YEAR(NOW())
A nazwa zmiennej to $smtp czy $stmt?
masz
INTO numery (numer, gid, mid)
Czy przekazujesz prawidłowe typy zmiennych do tych 3 pól?
A nazwa zmiennej to $smtp czy $stmt? - źle przepisałem, przepraszam, nazwy zmiennych mam poprawne.
Czy przekazujesz prawidłowe typy zmiennych do tych 3 pól? - no i tu chyba jest mój problem, bo preparuję niejako dwie ostatnie zmienne, trzecią powinien brać z SELECTa, ale chyba źle skonstruowałem zapytanie. Natomiast tamte dwie próbowałem już jako integer i jako string, niestety ten sam błąd.
INSERT INTO numery (numer,gid,mid) VALUES (SELECT IFNULL(MAX(numer), 0)+1 FROM numery WHERE YEAR(nr_daty) = YEAR(NOW()),?,?)
P.S. Bardzo prawdopodobne, że trzeba też dodać alias do tabeli w podzapytaniu SELECT.
Zadziałało w końcu w takiej formie:
INSERT INTO numery (numer,gid,mid) SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW());
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)