Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: INSERT z SELECTem jako prepare
Forum PHP.pl > Forum > Bazy danych > MySQL
Jdwind
Czy istnieje możliwość przygotowania takiego zapytania jako prepare i bind_param:
  1. $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())");

Nie mam pojęcia, jak ująć ten SELECT.
trueblue
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.
Jdwind
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:
  1. $result = $smtp->prepare("INSERT INTO numery (numer,gid,mid) VALUES (SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW())"));
  2. $result->bind_param('ii', $last_id, $mid);
trueblue
A sprawdzałeś? To najlepsza metoda nauki.

P.S. Jeśli wcześnie używałeś zmiennej $stmt, to pewnie tu też powinieneś.
Jdwind
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.
viking
Czyli mówi ci to że prepare zwróciło false. Masz w ogóle połączenie z bazą?
Jdwind
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.
  1. INSERT INTO numery (numer,gid,mid) VALUES (SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW())

w "zwykłym" zapytaniu nie miałem VALUES i działało:
  1. INSERT INTO numery (numer,gid,mid) SELECT IFNULL(MAX(numer), 0)+1, $last_id, $mid FROM numery WHERE YEAR((nr_daty)) = YEAR(NOW())

Dlatego właśnie napisałem, że nie do końca rozumiem jeszcze 'prepare' przy takim złożonym zapytaniu.
trueblue
A nazwa zmiennej to $smtp czy $stmt?
LowiczakPL
masz

INTO numery (numer, gid, mid)

Czy przekazujesz prawidłowe typy zmiennych do tych 3 pól?

Jdwind
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.
trueblue
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.
Jdwind
Zadziałało w końcu w takiej formie:
  1. INSERT INTO numery (numer,gid,mid) SELECT IFNULL(MAX(numer), 0)+1,?,? FROM numery WHERE YEAR(nr_daty) = YEAR(NOW());

czyli bez VALUES (czego do końca akurat nie rozumiem). W każdym bądź razie działa, dziękuję kolegom za pomoc.
EDIT:
A jeszcze jedno pytanie - czy przy "zwykłym" SELECT też używać bindowania, czy np. tylko wtedy, jeśli w zapytaniu mam zmienną pobraną z formularza?
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-2024 Invision Power Services, Inc.