Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]PDO i prepared sql
konrados
post 1.03.2011, 11:18:31
Post #1





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


Cześć,

Chcę się przerzucić na PDO i już pierwszy śmieszny problem. Byłem pewien, że z PDO łatwo mi pójdzie INSERT lub UPDATE na podstawie podanego arraya, robię więc coś takiego:

  1. //$gDb to globalna zmienna trzymająca pdo, połączenie jest OK, tabela "stations" istnieje.
  2. $data = array();
  3. $data['name'] = "test name";
  4. $data['formatType'] = "1";
  5. $data['resolutionType'] = "1";
  6. $sqlPrep = $gDb->prepare(
  7. 'INSERT INTO stations (name, formatType, resolutionType) VALUES (?, ?, ?)');
  8. $sqlPrep->execute($data);


I otrzymuję błąd: Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in ...

Czyżbym musiał to przekształcać na zwykłą, płaską tablicę, bez powiązanych nazw typu 'name'='coś tam'? Czy może da się inaczej?

W mojej klasie StationItem przechowuję po prostu zmienną $data która zawiera array typu "name"="coś tam", "formatType"="coś innego" i chciałbym bezproblemowo ją odczytywać z bazy danych i tam zapisywać.

Ten post edytował konrados 1.03.2011, 11:19:25
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
nospor
post 1.03.2011, 11:21:15
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A tak:
$sqlPrep->execute(array_values($data));
?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
konrados
post 1.03.2011, 11:35:12
Post #3





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


Ale Ty szybki jesteś smile.gif

Działa.

A da się jakoś tak zrobić w jednej linijce, by nie trzeba było podawać nazw pól w funk. "prepare" ani tych znaków zapytania, skoro wszystkie te informacje są już mojej tablicy $data?

Aha i drugie pytanie: skoro już się bawię w te prepared statements, to już się nie muszę bawić w czyszczenie danych w $data wprowadzonych przez usera, tak? Mam na myśli możliwe sql injection.

Ten post edytował konrados 1.03.2011, 11:37:32
Go to the top of the page
+Quote Post
nospor
post 1.03.2011, 11:38:52
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jeśli Twoje zapytanie będzie zawsze tak wyglądało, to możesz napisać funkcję, w której dynamicznie będziesz budował te zapytanie na podstawie $data. Nie widzę żadnego problemu.

Cytat
Mam na myśli możliwe sql injection.
Tak, prepared statement cię przed tym zabezpiecza. Nie mniej jednak ja tam zawsze liczby rzutuje na liczby - tak dla porządku smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
konrados
post 1.03.2011, 11:45:13
Post #5





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


OK, dzięki!
Update: ale już tworzę następny wątek smile.gif

Ten post edytował konrados 1.03.2011, 12:44:34
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: 20.06.2025 - 05:32