Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> INSERT z SELECTem jako prepare
Jdwind
post 18.01.2021, 21:47:48
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 18.01.2021, 22:27:31
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Jdwind
post 19.01.2021, 00:56:50
Post #3





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
trueblue
post 19.01.2021, 09:25:55
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A sprawdzałeś? To najlepsza metoda nauki.

P.S. Jeśli wcześnie używałeś zmiennej $stmt, to pewnie tu też powinieneś.


--------------------
Go to the top of the page
+Quote Post
Jdwind
post 20.01.2021, 01:13:35
Post #5





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post 20.01.2021, 08:00:19
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Czyli mówi ci to że prepare zwróciło false. Masz w ogóle połączenie z bazą?


--------------------
Go to the top of the page
+Quote Post
Jdwind
post 20.01.2021, 08:20:21
Post #7





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 20.01.2021, 08:23:02
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A nazwa zmiennej to $smtp czy $stmt?


--------------------
Go to the top of the page
+Quote Post
LowiczakPL
post 20.01.2021, 08:23:07
Post #9





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


masz

INTO numery (numer, gid, mid)

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



--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post
Jdwind
post 20.01.2021, 11:38:41
Post #10





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 20.01.2021, 11:45:38
Post #11





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trueblue 20.01.2021, 11:48:02


--------------------
Go to the top of the page
+Quote Post
Jdwind
post 20.01.2021, 23:02:12
Post #12





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 21.12.2007
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Jdwind 20.01.2021, 23:56:48
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 09:48