Commit | Line | Data |
---|---|---|
0c5338dd TD |
1 | |
2 | <!doctype html> | |
3 | <html lang="en" class="no-js"> | |
4 | <head> | |
5 | ||
6 | <meta charset="utf-8"> | |
7 | <meta name="viewport" content="width=device-width,initial-scale=1"> | |
8 | ||
9 | ||
10 | ||
11 | ||
fb962f09 WG |
12 | <link rel="icon" href="../../assets/default.favicon.ico"> |
13 | <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.1.0"> | |
0c5338dd TD |
14 | |
15 | ||
16 | ||
17 | <title>Database Access - WoltLab Suite Documentation</title> | |
18 | ||
19 | ||
20 | ||
fb962f09 | 21 | <link rel="stylesheet" href="../../assets/stylesheets/main.33e2939f.min.css"> |
0c5338dd TD |
22 | |
23 | ||
fb962f09 | 24 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ef6f36e2.min.css"> |
0c5338dd TD |
25 | |
26 | ||
27 | ||
28 | <meta name="theme-color" content="#009485"> | |
29 | ||
30 | ||
31 | ||
32 | ||
33 | ||
fd8430cb WG |
34 | |
35 | ||
0c5338dd TD |
36 | |
37 | ||
38 | <link rel="stylesheet" href="../../stylesheets/extra.css"> | |
39 | ||
40 | ||
41 | ||
42 | ||
43 | ||
44 | </head> | |
45 | ||
46 | ||
47 | ||
48 | ||
49 | ||
50 | ||
51 | ||
52 | <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent=""> | |
0c5338dd TD |
53 | |
54 | ||
fb962f09 WG |
55 | <script>function __prefix(e){return new URL("../..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script> |
56 | ||
0c5338dd TD |
57 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
58 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
59 | <label class="md-overlay" for="__drawer"></label> | |
60 | <div data-md-component="skip"> | |
61 | ||
62 | ||
63 | <a href="#database-access" class="md-skip"> | |
64 | Skip to content | |
65 | </a> | |
66 | ||
67 | </div> | |
68 | <div data-md-component="announce"> | |
69 | ||
70 | <aside class="md-announce"> | |
71 | <div class="md-announce__inner md-grid md-typeset"> | |
72 | ||
73 | <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a> | |
74 | ||
75 | </div> | |
76 | </aside> | |
77 | ||
78 | </div> | |
79 | ||
fb962f09 | 80 | <header class="md-header" data-md-component="header"> |
0c5338dd | 81 | <nav class="md-header__inner md-grid" aria-label="Header"> |
fb962f09 | 82 | <a href="../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo"> |
0c5338dd TD |
83 | |
84 | <img src="../../assets/logo.png" alt="logo"> | |
85 | ||
86 | </a> | |
87 | <label class="md-header__button md-icon" for="__drawer"> | |
88 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg> | |
89 | </label> | |
90 | <div class="md-header__title" data-md-component="header-title"> | |
91 | <div class="md-header__ellipsis"> | |
92 | <div class="md-header__topic"> | |
93 | <span class="md-ellipsis"> | |
94 | WoltLab Suite Documentation | |
95 | </span> | |
96 | </div> | |
97 | <div class="md-header__topic" data-md-component="header-topic"> | |
98 | <span class="md-ellipsis"> | |
99 | ||
100 | Database Access | |
101 | ||
102 | </span> | |
103 | </div> | |
104 | </div> | |
0c5338dd TD |
105 | </div> |
106 | ||
fb962f09 WG |
107 | |
108 | ||
a3639e76 WG |
109 | <label class="md-header__button md-icon" for="__search"> |
110 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> | |
111 | </label> | |
112 | ||
113 | <div class="md-search" data-md-component="search" role="dialog"> | |
114 | <label class="md-search__overlay" for="__search"></label> | |
115 | <div class="md-search__inner" role="search"> | |
116 | <form class="md-search__form" name="search"> | |
117 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required> | |
118 | <label class="md-search__icon md-icon" for="__search"> | |
119 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> | |
120 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> | |
121 | </label> | |
122 | <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1"> | |
fb962f09 | 123 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg> |
a3639e76 WG |
124 | </button> |
125 | </form> | |
126 | <div class="md-search__output"> | |
127 | <div class="md-search__scrollwrap" data-md-scrollfix> | |
128 | <div class="md-search-result" data-md-component="search-result"> | |
129 | <div class="md-search-result__meta"> | |
130 | Initializing search | |
131 | </div> | |
132 | <ol class="md-search-result__list"></ol> | |
133 | </div> | |
134 | </div> | |
135 | </div> | |
136 | </div> | |
137 | </div> | |
138 | ||
0c5338dd | 139 | |
7124f4cb WG |
140 | <div class="md-header__source"> |
141 | ||
142 | <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source"> | |
143 | <div class="md-source__icon md-icon"> | |
144 | ||
fb962f09 | 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> |
7124f4cb WG |
146 | </div> |
147 | <div class="md-source__repository"> | |
148 | GitHub | |
149 | </div> | |
150 | </a> | |
151 | </div> | |
152 | ||
0c5338dd TD |
153 | </nav> |
154 | </header> | |
155 | ||
156 | <div class="md-container" data-md-component="container"> | |
157 | ||
158 | ||
159 | ||
160 | ||
161 | <main class="md-main" data-md-component="main"> | |
162 | <div class="md-main__inner md-grid"> | |
163 | ||
164 | ||
165 | ||
166 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
167 | <div class="md-sidebar__scrollwrap"> | |
168 | <div class="md-sidebar__inner"> | |
169 | ||
170 | ||
171 | ||
0c5338dd TD |
172 | <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0"> |
173 | <label class="md-nav__title" for="__drawer"> | |
fb962f09 | 174 | <a href="../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo"> |
0c5338dd TD |
175 | |
176 | <img src="../../assets/logo.png" alt="logo"> | |
177 | ||
178 | </a> | |
179 | WoltLab Suite Documentation | |
180 | </label> | |
181 | ||
7124f4cb WG |
182 | <div class="md-nav__source"> |
183 | ||
184 | <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source"> | |
185 | <div class="md-source__icon md-icon"> | |
186 | ||
fb962f09 | 187 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> |
7124f4cb WG |
188 | </div> |
189 | <div class="md-source__repository"> | |
190 | GitHub | |
191 | </div> | |
192 | </a> | |
193 | </div> | |
194 | ||
0c5338dd TD |
195 | <ul class="md-nav__list" data-md-scrollfix> |
196 | ||
197 | ||
198 | ||
199 | ||
200 | ||
201 | ||
202 | ||
203 | ||
204 | <li class="md-nav__item"> | |
205 | <a href="../../getting-started/" class="md-nav__link"> | |
206 | Getting Started | |
207 | </a> | |
208 | </li> | |
209 | ||
210 | ||
211 | ||
212 | ||
213 | ||
214 | ||
215 | ||
216 | ||
217 | ||
218 | ||
219 | ||
220 | ||
221 | ||
222 | <li class="md-nav__item md-nav__item--active md-nav__item--nested"> | |
223 | ||
224 | ||
225 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked> | |
226 | ||
227 | <label class="md-nav__link" for="__nav_2"> | |
228 | PHP API | |
229 | <span class="md-nav__icon md-icon"></span> | |
230 | </label> | |
231 | <nav class="md-nav" aria-label="PHP API" data-md-level="1"> | |
232 | <label class="md-nav__title" for="__nav_2"> | |
233 | <span class="md-nav__icon md-icon"></span> | |
234 | PHP API | |
235 | </label> | |
236 | <ul class="md-nav__list" data-md-scrollfix> | |
237 | ||
238 | ||
239 | ||
240 | ||
241 | ||
242 | <li class="md-nav__item"> | |
243 | <a href="../pages/" class="md-nav__link"> | |
244 | Pages | |
245 | </a> | |
246 | </li> | |
247 | ||
248 | ||
249 | ||
250 | ||
251 | ||
252 | ||
253 | ||
254 | <li class="md-nav__item"> | |
255 | <a href="../database-objects/" class="md-nav__link"> | |
256 | Database Objects | |
257 | </a> | |
258 | </li> | |
259 | ||
260 | ||
261 | ||
262 | ||
263 | ||
264 | ||
265 | ||
266 | ||
267 | ||
268 | <li class="md-nav__item md-nav__item--active"> | |
269 | ||
270 | <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc"> | |
271 | ||
272 | ||
273 | ||
274 | ||
275 | <label class="md-nav__link md-nav__link--active" for="__toc"> | |
276 | Database Access | |
277 | <span class="md-nav__icon md-icon"></span> | |
278 | </label> | |
279 | ||
280 | <a href="./" class="md-nav__link md-nav__link--active"> | |
281 | Database Access | |
282 | </a> | |
283 | ||
284 | ||
285 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
286 | ||
287 | ||
288 | ||
289 | ||
290 | ||
291 | <label class="md-nav__title" for="__toc"> | |
292 | <span class="md-nav__icon md-icon"></span> | |
293 | Table of contents | |
294 | </label> | |
295 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
296 | ||
297 | <li class="md-nav__item"> | |
298 | <a href="#the-preparedstatement-object" class="md-nav__link"> | |
299 | The PreparedStatement Object | |
300 | </a> | |
301 | ||
302 | <nav class="md-nav" aria-label="The PreparedStatement Object"> | |
303 | <ul class="md-nav__list"> | |
304 | ||
305 | <li class="md-nav__item"> | |
306 | <a href="#query-parameters" class="md-nav__link"> | |
307 | Query Parameters | |
308 | </a> | |
309 | ||
310 | </li> | |
311 | ||
312 | <li class="md-nav__item"> | |
313 | <a href="#fetching-a-single-result" class="md-nav__link"> | |
314 | Fetching a Single Result | |
315 | </a> | |
316 | ||
317 | </li> | |
318 | ||
319 | <li class="md-nav__item"> | |
320 | <a href="#fetch-by-column" class="md-nav__link"> | |
321 | Fetch by Column | |
322 | </a> | |
323 | ||
324 | </li> | |
325 | ||
326 | <li class="md-nav__item"> | |
327 | <a href="#fetching-all-results" class="md-nav__link"> | |
328 | Fetching All Results | |
329 | </a> | |
330 | ||
331 | </li> | |
332 | ||
333 | </ul> | |
334 | </nav> | |
335 | ||
336 | </li> | |
337 | ||
338 | <li class="md-nav__item"> | |
339 | <a href="#building-complex-conditions" class="md-nav__link"> | |
340 | Building Complex Conditions | |
341 | </a> | |
342 | ||
343 | </li> | |
344 | ||
345 | <li class="md-nav__item"> | |
346 | <a href="#insert-or-update-in-bulk" class="md-nav__link"> | |
347 | INSERT or UPDATE in Bulk | |
348 | </a> | |
349 | ||
350 | </li> | |
351 | ||
352 | </ul> | |
353 | ||
354 | </nav> | |
355 | ||
356 | </li> | |
357 | ||
358 | ||
359 | ||
360 | ||
361 | ||
362 | ||
363 | ||
364 | <li class="md-nav__item"> | |
365 | <a href="../exceptions/" class="md-nav__link"> | |
366 | Exceptions | |
367 | </a> | |
368 | </li> | |
369 | ||
370 | ||
371 | ||
372 | ||
373 | ||
374 | ||
375 | ||
376 | ||
377 | <li class="md-nav__item md-nav__item--nested"> | |
378 | ||
379 | ||
380 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" > | |
381 | ||
382 | <label class="md-nav__link" for="__nav_2_5"> | |
383 | API | |
384 | <span class="md-nav__icon md-icon"></span> | |
385 | </label> | |
386 | <nav class="md-nav" aria-label="API" data-md-level="2"> | |
387 | <label class="md-nav__title" for="__nav_2_5"> | |
388 | <span class="md-nav__icon md-icon"></span> | |
389 | API | |
390 | </label> | |
391 | <ul class="md-nav__list" data-md-scrollfix> | |
392 | ||
393 | ||
394 | ||
395 | ||
396 | ||
6923e968 WG |
397 | |
398 | <li class="md-nav__item md-nav__item--nested"> | |
399 | ||
400 | ||
401 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_1" type="checkbox" id="__nav_2_5_1" > | |
402 | ||
403 | <label class="md-nav__link" for="__nav_2_5_1"> | |
404 | Caches | |
405 | <span class="md-nav__icon md-icon"></span> | |
406 | </label> | |
407 | <nav class="md-nav" aria-label="Caches" data-md-level="3"> | |
408 | <label class="md-nav__title" for="__nav_2_5_1"> | |
409 | <span class="md-nav__icon md-icon"></span> | |
410 | Caches | |
411 | </label> | |
412 | <ul class="md-nav__list" data-md-scrollfix> | |
413 | ||
414 | ||
415 | ||
416 | ||
417 | ||
0c5338dd TD |
418 | <li class="md-nav__item"> |
419 | <a href="../api/caches/" class="md-nav__link"> | |
6923e968 WG |
420 | Overview |
421 | </a> | |
422 | </li> | |
423 | ||
424 | ||
425 | ||
426 | ||
427 | ||
428 | ||
429 | ||
430 | <li class="md-nav__item"> | |
431 | <a href="../api/caches_persistent-caches/" class="md-nav__link"> | |
432 | Persistent Caches | |
433 | </a> | |
434 | </li> | |
435 | ||
436 | ||
437 | ||
438 | ||
439 | ||
440 | ||
441 | ||
442 | <li class="md-nav__item"> | |
443 | <a href="../api/caches_runtime-caches/" class="md-nav__link"> | |
444 | Runtime Caches | |
0c5338dd TD |
445 | </a> |
446 | </li> | |
447 | ||
448 | ||
449 | ||
6923e968 WG |
450 | </ul> |
451 | </nav> | |
452 | </li> | |
453 | ||
454 | ||
455 | ||
0c5338dd TD |
456 | |
457 | ||
458 | ||
459 | ||
460 | <li class="md-nav__item"> | |
461 | <a href="../api/comments/" class="md-nav__link"> | |
462 | Comments | |
463 | </a> | |
464 | </li> | |
465 | ||
466 | ||
467 | ||
468 | ||
469 | ||
470 | ||
471 | ||
472 | <li class="md-nav__item"> | |
473 | <a href="../api/cronjobs/" class="md-nav__link"> | |
474 | Cronjobs | |
475 | </a> | |
476 | </li> | |
477 | ||
478 | ||
479 | ||
480 | ||
481 | ||
482 | ||
483 | ||
484 | <li class="md-nav__item"> | |
485 | <a href="../api/events/" class="md-nav__link"> | |
486 | Events | |
487 | </a> | |
488 | </li> | |
489 | ||
490 | ||
491 | ||
492 | ||
493 | ||
494 | ||
495 | ||
496 | ||
497 | <li class="md-nav__item md-nav__item--nested"> | |
498 | ||
499 | ||
500 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" > | |
501 | ||
502 | <label class="md-nav__link" for="__nav_2_5_5"> | |
503 | Form Builder | |
504 | <span class="md-nav__icon md-icon"></span> | |
505 | </label> | |
506 | <nav class="md-nav" aria-label="Form Builder" data-md-level="3"> | |
507 | <label class="md-nav__title" for="__nav_2_5_5"> | |
508 | <span class="md-nav__icon md-icon"></span> | |
509 | Form Builder | |
510 | </label> | |
511 | <ul class="md-nav__list" data-md-scrollfix> | |
512 | ||
513 | ||
514 | ||
515 | ||
516 | ||
517 | <li class="md-nav__item"> | |
518 | <a href="../api/form_builder/overview/" class="md-nav__link"> | |
519 | Overview | |
520 | </a> | |
521 | </li> | |
522 | ||
523 | ||
524 | ||
525 | ||
526 | ||
527 | ||
528 | ||
529 | <li class="md-nav__item"> | |
530 | <a href="../api/form_builder/structure/" class="md-nav__link"> | |
531 | Structure | |
532 | </a> | |
533 | </li> | |
534 | ||
535 | ||
536 | ||
537 | ||
538 | ||
539 | ||
540 | ||
541 | <li class="md-nav__item"> | |
542 | <a href="../api/form_builder/form_fields/" class="md-nav__link"> | |
543 | Fields | |
544 | </a> | |
545 | </li> | |
546 | ||
547 | ||
548 | ||
549 | ||
550 | ||
551 | ||
552 | ||
553 | <li class="md-nav__item"> | |
554 | <a href="../api/form_builder/validation_data/" class="md-nav__link"> | |
555 | Validation and Data | |
556 | </a> | |
557 | </li> | |
558 | ||
559 | ||
560 | ||
561 | ||
562 | ||
563 | ||
564 | ||
565 | <li class="md-nav__item"> | |
566 | <a href="../api/form_builder/dependencies/" class="md-nav__link"> | |
567 | Dependencies | |
568 | </a> | |
569 | </li> | |
570 | ||
571 | ||
572 | ||
573 | </ul> | |
574 | </nav> | |
575 | </li> | |
576 | ||
577 | ||
578 | ||
579 | ||
580 | ||
581 | ||
582 | ||
583 | <li class="md-nav__item"> | |
584 | <a href="../api/package_installation_plugins/" class="md-nav__link"> | |
585 | Package Installation Plugins | |
586 | </a> | |
587 | </li> | |
588 | ||
589 | ||
590 | ||
591 | ||
592 | ||
593 | ||
594 | ||
595 | <li class="md-nav__item"> | |
596 | <a href="../api/user_activity_points/" class="md-nav__link"> | |
597 | User Activity Points | |
598 | </a> | |
599 | </li> | |
600 | ||
601 | ||
602 | ||
603 | ||
604 | ||
605 | ||
606 | ||
607 | <li class="md-nav__item"> | |
608 | <a href="../api/user_notifications/" class="md-nav__link"> | |
609 | User Notifications | |
610 | </a> | |
611 | </li> | |
612 | ||
613 | ||
614 | ||
615 | ||
616 | ||
617 | ||
618 | ||
619 | <li class="md-nav__item"> | |
620 | <a href="../api/sitemaps/" class="md-nav__link"> | |
621 | Sitemaps | |
622 | </a> | |
623 | </li> | |
624 | ||
625 | ||
626 | ||
627 | </ul> | |
628 | </nav> | |
629 | </li> | |
630 | ||
631 | ||
632 | ||
633 | ||
634 | ||
635 | ||
636 | ||
637 | <li class="md-nav__item"> | |
638 | <a href="../code-style/" class="md-nav__link"> | |
639 | Code Style | |
640 | </a> | |
641 | </li> | |
642 | ||
643 | ||
644 | ||
645 | ||
646 | ||
647 | ||
648 | ||
649 | <li class="md-nav__item"> | |
650 | <a href="../apps/" class="md-nav__link"> | |
651 | Apps | |
652 | </a> | |
653 | </li> | |
654 | ||
655 | ||
656 | ||
657 | ||
658 | ||
659 | ||
660 | ||
661 | <li class="md-nav__item"> | |
662 | <a href="../gdpr/" class="md-nav__link"> | |
663 | GDPR | |
664 | </a> | |
665 | </li> | |
666 | ||
667 | ||
668 | ||
669 | </ul> | |
670 | </nav> | |
671 | </li> | |
672 | ||
673 | ||
674 | ||
675 | ||
676 | ||
677 | ||
678 | ||
679 | ||
680 | ||
681 | ||
682 | ||
683 | <li class="md-nav__item md-nav__item--nested"> | |
684 | ||
685 | ||
686 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" > | |
687 | ||
688 | <label class="md-nav__link" for="__nav_3"> | |
689 | Languages, Templates & CSS | |
690 | <span class="md-nav__icon md-icon"></span> | |
691 | </label> | |
692 | <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1"> | |
693 | <label class="md-nav__title" for="__nav_3"> | |
694 | <span class="md-nav__icon md-icon"></span> | |
695 | Languages, Templates & CSS | |
696 | </label> | |
697 | <ul class="md-nav__list" data-md-scrollfix> | |
698 | ||
699 | ||
700 | ||
701 | ||
702 | ||
703 | <li class="md-nav__item"> | |
704 | <a href="../../view/languages/" class="md-nav__link"> | |
705 | Languages | |
706 | </a> | |
707 | </li> | |
708 | ||
709 | ||
710 | ||
711 | ||
712 | ||
713 | ||
714 | ||
715 | <li class="md-nav__item"> | |
716 | <a href="../../view/templates/" class="md-nav__link"> | |
717 | Templates | |
718 | </a> | |
719 | </li> | |
720 | ||
721 | ||
722 | ||
723 | ||
724 | ||
725 | ||
726 | ||
6923e968 WG |
727 | <li class="md-nav__item"> |
728 | <a href="../../view/template-plugins/" class="md-nav__link"> | |
729 | Template Plugins | |
730 | </a> | |
731 | </li> | |
732 | ||
733 | ||
734 | ||
735 | ||
736 | ||
737 | ||
738 | ||
0c5338dd TD |
739 | <li class="md-nav__item"> |
740 | <a href="../../view/css/" class="md-nav__link"> | |
741 | CSS | |
742 | </a> | |
743 | </li> | |
744 | ||
745 | ||
746 | ||
747 | </ul> | |
748 | </nav> | |
749 | </li> | |
750 | ||
751 | ||
752 | ||
753 | ||
754 | ||
755 | ||
756 | ||
757 | ||
758 | ||
759 | ||
760 | ||
761 | <li class="md-nav__item md-nav__item--nested"> | |
762 | ||
763 | ||
764 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" > | |
765 | ||
766 | <label class="md-nav__link" for="__nav_4"> | |
77efcd46 | 767 | TypeScript and JavaScript API |
0c5338dd TD |
768 | <span class="md-nav__icon md-icon"></span> |
769 | </label> | |
77efcd46 | 770 | <nav class="md-nav" aria-label="TypeScript and JavaScript API" data-md-level="1"> |
0c5338dd TD |
771 | <label class="md-nav__title" for="__nav_4"> |
772 | <span class="md-nav__icon md-icon"></span> | |
77efcd46 | 773 | TypeScript and JavaScript API |
0c5338dd TD |
774 | </label> |
775 | <ul class="md-nav__list" data-md-scrollfix> | |
776 | ||
777 | ||
778 | ||
779 | ||
780 | ||
781 | <li class="md-nav__item"> | |
782 | <a href="../../javascript/general-usage/" class="md-nav__link"> | |
783 | General Usage | |
784 | </a> | |
785 | </li> | |
786 | ||
787 | ||
788 | ||
789 | ||
790 | ||
791 | ||
792 | ||
77efcd46 WG |
793 | <li class="md-nav__item"> |
794 | <a href="../../javascript/typescript/" class="md-nav__link"> | |
795 | TypeScript | |
796 | </a> | |
797 | </li> | |
798 | ||
799 | ||
800 | ||
801 | ||
802 | ||
803 | ||
804 | ||
0c5338dd TD |
805 | |
806 | <li class="md-nav__item md-nav__item--nested"> | |
807 | ||
808 | ||
77efcd46 | 809 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" > |
0c5338dd | 810 | |
77efcd46 | 811 | <label class="md-nav__link" for="__nav_4_3"> |
0c5338dd TD |
812 | New API |
813 | <span class="md-nav__icon md-icon"></span> | |
814 | </label> | |
815 | <nav class="md-nav" aria-label="New API" data-md-level="2"> | |
77efcd46 | 816 | <label class="md-nav__title" for="__nav_4_3"> |
0c5338dd TD |
817 | <span class="md-nav__icon md-icon"></span> |
818 | New API | |
819 | </label> | |
820 | <ul class="md-nav__list" data-md-scrollfix> | |
821 | ||
822 | ||
823 | ||
824 | ||
825 | ||
826 | <li class="md-nav__item"> | |
827 | <a href="../../javascript/new-api_writing-a-module/" class="md-nav__link"> | |
828 | Writing a module | |
829 | </a> | |
830 | </li> | |
831 | ||
832 | ||
833 | ||
834 | ||
835 | ||
836 | ||
837 | ||
838 | <li class="md-nav__item"> | |
839 | <a href="../../javascript/new-api_data-structures/" class="md-nav__link"> | |
840 | Data Structures | |
841 | </a> | |
842 | </li> | |
843 | ||
844 | ||
845 | ||
846 | ||
847 | ||
848 | ||
849 | ||
850 | <li class="md-nav__item"> | |
851 | <a href="../../javascript/new-api_core/" class="md-nav__link"> | |
852 | Core Functions | |
853 | </a> | |
854 | </li> | |
855 | ||
856 | ||
857 | ||
858 | ||
859 | ||
860 | ||
861 | ||
862 | <li class="md-nav__item"> | |
863 | <a href="../../javascript/new-api_dom/" class="md-nav__link"> | |
864 | DOM | |
865 | </a> | |
866 | </li> | |
867 | ||
868 | ||
869 | ||
870 | ||
871 | ||
872 | ||
873 | ||
874 | <li class="md-nav__item"> | |
875 | <a href="../../javascript/new-api_events/" class="md-nav__link"> | |
876 | Event Handling | |
877 | </a> | |
878 | </li> | |
879 | ||
880 | ||
881 | ||
882 | ||
883 | ||
884 | ||
885 | ||
886 | <li class="md-nav__item"> | |
887 | <a href="../../javascript/new-api_ajax/" class="md-nav__link"> | |
888 | Ajax | |
889 | </a> | |
890 | </li> | |
891 | ||
892 | ||
893 | ||
894 | ||
895 | ||
896 | ||
897 | ||
898 | <li class="md-nav__item"> | |
899 | <a href="../../javascript/new-api_dialogs/" class="md-nav__link"> | |
900 | Dialogs | |
901 | </a> | |
902 | </li> | |
903 | ||
904 | ||
905 | ||
906 | ||
907 | ||
908 | ||
909 | ||
910 | <li class="md-nav__item"> | |
911 | <a href="../../javascript/new-api_browser/" class="md-nav__link"> | |
912 | Browser and Screen Sizes | |
913 | </a> | |
914 | </li> | |
915 | ||
916 | ||
917 | ||
918 | ||
919 | ||
920 | ||
921 | ||
922 | <li class="md-nav__item"> | |
923 | <a href="../../javascript/new-api_ui/" class="md-nav__link"> | |
924 | User Interface | |
925 | </a> | |
926 | </li> | |
927 | ||
928 | ||
929 | ||
930 | </ul> | |
931 | </nav> | |
932 | </li> | |
933 | ||
934 | ||
935 | ||
936 | ||
937 | ||
938 | ||
939 | ||
940 | <li class="md-nav__item"> | |
941 | <a href="../../javascript/legacy-api/" class="md-nav__link"> | |
942 | Legacy API | |
943 | </a> | |
944 | </li> | |
945 | ||
946 | ||
947 | ||
948 | ||
949 | ||
950 | ||
951 | ||
952 | <li class="md-nav__item"> | |
953 | <a href="../../javascript/helper-functions/" class="md-nav__link"> | |
954 | Helper Functions | |
955 | </a> | |
956 | </li> | |
957 | ||
958 | ||
959 | ||
960 | ||
961 | ||
962 | ||
963 | ||
964 | <li class="md-nav__item"> | |
965 | <a href="../../javascript/code-snippets/" class="md-nav__link"> | |
966 | Code Snippets | |
967 | </a> | |
968 | </li> | |
969 | ||
970 | ||
971 | ||
972 | </ul> | |
973 | </nav> | |
974 | </li> | |
975 | ||
976 | ||
977 | ||
978 | ||
979 | ||
980 | ||
981 | ||
982 | ||
983 | ||
984 | ||
985 | ||
986 | <li class="md-nav__item md-nav__item--nested"> | |
987 | ||
988 | ||
989 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" > | |
990 | ||
991 | <label class="md-nav__link" for="__nav_5"> | |
992 | Package Components | |
993 | <span class="md-nav__icon md-icon"></span> | |
994 | </label> | |
995 | <nav class="md-nav" aria-label="Package Components" data-md-level="1"> | |
996 | <label class="md-nav__title" for="__nav_5"> | |
997 | <span class="md-nav__icon md-icon"></span> | |
998 | Package Components | |
999 | </label> | |
1000 | <ul class="md-nav__list" data-md-scrollfix> | |
1001 | ||
1002 | ||
1003 | ||
1004 | ||
1005 | ||
1006 | <li class="md-nav__item"> | |
1007 | <a href="../../package/package-xml/" class="md-nav__link"> | |
1008 | package.xml | |
1009 | </a> | |
1010 | </li> | |
1011 | ||
1012 | ||
1013 | ||
1014 | ||
1015 | ||
1016 | ||
1017 | ||
1018 | ||
1019 | <li class="md-nav__item md-nav__item--nested"> | |
1020 | ||
1021 | ||
1022 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" > | |
1023 | ||
1024 | <label class="md-nav__link" for="__nav_5_2"> | |
1025 | PIPs | |
1026 | <span class="md-nav__icon md-icon"></span> | |
1027 | </label> | |
1028 | <nav class="md-nav" aria-label="PIPs" data-md-level="2"> | |
1029 | <label class="md-nav__title" for="__nav_5_2"> | |
1030 | <span class="md-nav__icon md-icon"></span> | |
1031 | PIPs | |
1032 | </label> | |
1033 | <ul class="md-nav__list" data-md-scrollfix> | |
1034 | ||
1035 | ||
1036 | ||
1037 | ||
1038 | ||
1039 | <li class="md-nav__item"> | |
1040 | <a href="../../package/pip/" class="md-nav__link"> | |
1041 | Overview | |
1042 | </a> | |
1043 | </li> | |
1044 | ||
1045 | ||
1046 | ||
1047 | ||
1048 | ||
1049 | ||
1050 | ||
1051 | <li class="md-nav__item"> | |
1052 | <a href="../../package/pip/acl-option/" class="md-nav__link"> | |
1053 | aclOption | |
1054 | </a> | |
1055 | </li> | |
1056 | ||
1057 | ||
1058 | ||
1059 | ||
1060 | ||
1061 | ||
1062 | ||
1063 | <li class="md-nav__item"> | |
1064 | <a href="../../package/pip/acp-menu/" class="md-nav__link"> | |
1065 | acpMenu | |
1066 | </a> | |
1067 | </li> | |
1068 | ||
1069 | ||
1070 | ||
1071 | ||
1072 | ||
1073 | ||
1074 | ||
1075 | <li class="md-nav__item"> | |
1076 | <a href="../../package/pip/acp-search-provider/" class="md-nav__link"> | |
1077 | acpSearchProvider | |
1078 | </a> | |
1079 | </li> | |
1080 | ||
1081 | ||
1082 | ||
1083 | ||
1084 | ||
1085 | ||
1086 | ||
1087 | <li class="md-nav__item"> | |
1088 | <a href="../../package/pip/acp-template/" class="md-nav__link"> | |
1089 | acpTemplate | |
1090 | </a> | |
1091 | </li> | |
1092 | ||
1093 | ||
1094 | ||
1095 | ||
1096 | ||
1097 | ||
1098 | ||
1099 | <li class="md-nav__item"> | |
1100 | <a href="../../package/pip/bbcode/" class="md-nav__link"> | |
1101 | bbcode | |
1102 | </a> | |
1103 | </li> | |
1104 | ||
1105 | ||
1106 | ||
1107 | ||
1108 | ||
1109 | ||
1110 | ||
1111 | <li class="md-nav__item"> | |
1112 | <a href="../../package/pip/box/" class="md-nav__link"> | |
1113 | box | |
1114 | </a> | |
1115 | </li> | |
1116 | ||
1117 | ||
1118 | ||
1119 | ||
1120 | ||
1121 | ||
1122 | ||
1123 | <li class="md-nav__item"> | |
1124 | <a href="../../package/pip/clipboard-action/" class="md-nav__link"> | |
1125 | clipboardAction | |
1126 | </a> | |
1127 | </li> | |
1128 | ||
1129 | ||
1130 | ||
1131 | ||
1132 | ||
1133 | ||
1134 | ||
1135 | <li class="md-nav__item"> | |
1136 | <a href="../../package/pip/core-object/" class="md-nav__link"> | |
1137 | coreObject | |
1138 | </a> | |
1139 | </li> | |
1140 | ||
1141 | ||
1142 | ||
1143 | ||
1144 | ||
1145 | ||
1146 | ||
1147 | <li class="md-nav__item"> | |
1148 | <a href="../../package/pip/cronjob/" class="md-nav__link"> | |
1149 | cronjob | |
1150 | </a> | |
1151 | </li> | |
1152 | ||
1153 | ||
1154 | ||
1155 | ||
1156 | ||
1157 | ||
1158 | ||
6923e968 WG |
1159 | <li class="md-nav__item"> |
1160 | <a href="../../package/pip/database/" class="md-nav__link"> | |
1161 | database | |
1162 | </a> | |
1163 | </li> | |
1164 | ||
1165 | ||
1166 | ||
1167 | ||
1168 | ||
1169 | ||
1170 | ||
0c5338dd TD |
1171 | <li class="md-nav__item"> |
1172 | <a href="../../package/pip/event-listener/" class="md-nav__link"> | |
1173 | eventListener | |
1174 | </a> | |
1175 | </li> | |
1176 | ||
1177 | ||
1178 | ||
1179 | ||
1180 | ||
1181 | ||
1182 | ||
1183 | <li class="md-nav__item"> | |
1184 | <a href="../../package/pip/file/" class="md-nav__link"> | |
1185 | file | |
1186 | </a> | |
1187 | </li> | |
1188 | ||
1189 | ||
1190 | ||
1191 | ||
1192 | ||
1193 | ||
1194 | ||
1195 | <li class="md-nav__item"> | |
1196 | <a href="../../package/pip/language/" class="md-nav__link"> | |
1197 | language | |
1198 | </a> | |
1199 | </li> | |
1200 | ||
1201 | ||
1202 | ||
1203 | ||
1204 | ||
1205 | ||
1206 | ||
1207 | <li class="md-nav__item"> | |
1208 | <a href="../../package/pip/media-provider/" class="md-nav__link"> | |
1209 | mediaProvider | |
1210 | </a> | |
1211 | </li> | |
1212 | ||
1213 | ||
1214 | ||
1215 | ||
1216 | ||
1217 | ||
1218 | ||
1219 | <li class="md-nav__item"> | |
1220 | <a href="../../package/pip/menu/" class="md-nav__link"> | |
1221 | menu | |
1222 | </a> | |
1223 | </li> | |
1224 | ||
1225 | ||
1226 | ||
1227 | ||
1228 | ||
1229 | ||
1230 | ||
1231 | <li class="md-nav__item"> | |
1232 | <a href="../../package/pip/menu-item/" class="md-nav__link"> | |
1233 | menuItem | |
1234 | </a> | |
1235 | </li> | |
1236 | ||
1237 | ||
1238 | ||
1239 | ||
1240 | ||
1241 | ||
1242 | ||
1243 | <li class="md-nav__item"> | |
1244 | <a href="../../package/pip/object-type/" class="md-nav__link"> | |
1245 | objectType | |
1246 | </a> | |
1247 | </li> | |
1248 | ||
1249 | ||
1250 | ||
1251 | ||
1252 | ||
1253 | ||
1254 | ||
1255 | <li class="md-nav__item"> | |
1256 | <a href="../../package/pip/object-type-definition/" class="md-nav__link"> | |
1257 | objectTypeDefinition | |
1258 | </a> | |
1259 | </li> | |
1260 | ||
1261 | ||
1262 | ||
1263 | ||
1264 | ||
1265 | ||
1266 | ||
1267 | <li class="md-nav__item"> | |
1268 | <a href="../../package/pip/option/" class="md-nav__link"> | |
1269 | option | |
1270 | </a> | |
1271 | </li> | |
1272 | ||
1273 | ||
1274 | ||
1275 | ||
1276 | ||
1277 | ||
1278 | ||
1279 | <li class="md-nav__item"> | |
1280 | <a href="../../package/pip/page/" class="md-nav__link"> | |
1281 | page | |
1282 | </a> | |
1283 | </li> | |
1284 | ||
1285 | ||
1286 | ||
1287 | ||
1288 | ||
1289 | ||
1290 | ||
1291 | <li class="md-nav__item"> | |
1292 | <a href="../../package/pip/pip/" class="md-nav__link"> | |
1293 | pip | |
1294 | </a> | |
1295 | </li> | |
1296 | ||
1297 | ||
1298 | ||
1299 | ||
1300 | ||
1301 | ||
1302 | ||
1303 | <li class="md-nav__item"> | |
1304 | <a href="../../package/pip/script/" class="md-nav__link"> | |
1305 | script | |
1306 | </a> | |
1307 | </li> | |
1308 | ||
1309 | ||
1310 | ||
1311 | ||
1312 | ||
1313 | ||
1314 | ||
1315 | <li class="md-nav__item"> | |
1316 | <a href="../../package/pip/smiley/" class="md-nav__link"> | |
1317 | smiley | |
1318 | </a> | |
1319 | </li> | |
1320 | ||
1321 | ||
1322 | ||
1323 | ||
1324 | ||
1325 | ||
1326 | ||
1327 | <li class="md-nav__item"> | |
1328 | <a href="../../package/pip/sql/" class="md-nav__link"> | |
1329 | sql | |
1330 | </a> | |
1331 | </li> | |
1332 | ||
1333 | ||
1334 | ||
1335 | ||
1336 | ||
1337 | ||
1338 | ||
1339 | <li class="md-nav__item"> | |
1340 | <a href="../../package/pip/style/" class="md-nav__link"> | |
1341 | style | |
1342 | </a> | |
1343 | </li> | |
1344 | ||
1345 | ||
1346 | ||
1347 | ||
1348 | ||
1349 | ||
1350 | ||
1351 | <li class="md-nav__item"> | |
1352 | <a href="../../package/pip/template/" class="md-nav__link"> | |
1353 | template | |
1354 | </a> | |
1355 | </li> | |
1356 | ||
1357 | ||
1358 | ||
1359 | ||
1360 | ||
1361 | ||
1362 | ||
1363 | <li class="md-nav__item"> | |
1364 | <a href="../../package/pip/template-listener/" class="md-nav__link"> | |
1365 | templateListener | |
1366 | </a> | |
1367 | </li> | |
1368 | ||
1369 | ||
1370 | ||
1371 | ||
1372 | ||
1373 | ||
1374 | ||
1375 | <li class="md-nav__item"> | |
1376 | <a href="../../package/pip/user-group-option/" class="md-nav__link"> | |
1377 | userGroupOption | |
1378 | </a> | |
1379 | </li> | |
1380 | ||
1381 | ||
1382 | ||
1383 | ||
1384 | ||
1385 | ||
1386 | ||
1387 | <li class="md-nav__item"> | |
1388 | <a href="../../package/pip/user-menu/" class="md-nav__link"> | |
1389 | userMenu | |
1390 | </a> | |
1391 | </li> | |
1392 | ||
1393 | ||
1394 | ||
1395 | ||
1396 | ||
1397 | ||
1398 | ||
1399 | <li class="md-nav__item"> | |
1400 | <a href="../../package/pip/user-notification-event/" class="md-nav__link"> | |
1401 | userNotificationEvent | |
1402 | </a> | |
1403 | </li> | |
1404 | ||
1405 | ||
1406 | ||
1407 | ||
1408 | ||
1409 | ||
1410 | ||
1411 | <li class="md-nav__item"> | |
1412 | <a href="../../package/pip/user-option/" class="md-nav__link"> | |
1413 | userOption | |
1414 | </a> | |
1415 | </li> | |
1416 | ||
1417 | ||
1418 | ||
1419 | ||
1420 | ||
1421 | ||
1422 | ||
1423 | <li class="md-nav__item"> | |
1424 | <a href="../../package/pip/user-profile-menu/" class="md-nav__link"> | |
1425 | userProfileMenu | |
1426 | </a> | |
1427 | </li> | |
1428 | ||
1429 | ||
1430 | ||
1431 | </ul> | |
1432 | </nav> | |
1433 | </li> | |
1434 | ||
1435 | ||
1436 | ||
1437 | ||
1438 | ||
1439 | ||
1440 | ||
1441 | <li class="md-nav__item"> | |
1442 | <a href="../../package/database-php-api/" class="md-nav__link"> | |
1443 | Database PHP API | |
1444 | </a> | |
1445 | </li> | |
1446 | ||
1447 | ||
1448 | ||
1449 | </ul> | |
1450 | </nav> | |
1451 | </li> | |
1452 | ||
1453 | ||
1454 | ||
1455 | ||
1456 | ||
1457 | ||
1458 | ||
1459 | ||
1460 | ||
1461 | ||
1462 | ||
1463 | <li class="md-nav__item md-nav__item--nested"> | |
1464 | ||
1465 | ||
1466 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" > | |
1467 | ||
1468 | <label class="md-nav__link" for="__nav_6"> | |
1469 | Migration | |
1470 | <span class="md-nav__icon md-icon"></span> | |
1471 | </label> | |
1472 | <nav class="md-nav" aria-label="Migration" data-md-level="1"> | |
1473 | <label class="md-nav__title" for="__nav_6"> | |
1474 | <span class="md-nav__icon md-icon"></span> | |
1475 | Migration | |
1476 | </label> | |
1477 | <ul class="md-nav__list" data-md-scrollfix> | |
1478 | ||
1479 | ||
1480 | ||
1481 | ||
1482 | ||
1483 | ||
1484 | <li class="md-nav__item md-nav__item--nested"> | |
1485 | ||
1486 | ||
1487 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" > | |
1488 | ||
1489 | <label class="md-nav__link" for="__nav_6_1"> | |
1490 | Migrating from WSC 5.3 | |
1491 | <span class="md-nav__icon md-icon"></span> | |
1492 | </label> | |
1493 | <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2"> | |
1494 | <label class="md-nav__title" for="__nav_6_1"> | |
1495 | <span class="md-nav__icon md-icon"></span> | |
1496 | Migrating from WSC 5.3 | |
1497 | </label> | |
1498 | <ul class="md-nav__list" data-md-scrollfix> | |
1499 | ||
1500 | ||
1501 | ||
1502 | ||
1503 | ||
1504 | <li class="md-nav__item"> | |
1505 | <a href="../../migration/wsc53/php/" class="md-nav__link"> | |
1506 | PHP API | |
1507 | </a> | |
1508 | </li> | |
1509 | ||
1510 | ||
1511 | ||
1512 | ||
1513 | ||
1514 | ||
1515 | ||
1516 | <li class="md-nav__item"> | |
1517 | <a href="../../migration/wsc53/session/" class="md-nav__link"> | |
1518 | Session Handling and Authentication | |
1519 | </a> | |
1520 | </li> | |
1521 | ||
1522 | ||
1523 | ||
1524 | ||
1525 | ||
1526 | ||
1527 | ||
1528 | <li class="md-nav__item"> | |
1529 | <a href="../../migration/wsc53/javascript/" class="md-nav__link"> | |
77efcd46 | 1530 | TypeScript and JavaScript |
0c5338dd TD |
1531 | </a> |
1532 | </li> | |
1533 | ||
1534 | ||
1535 | ||
1536 | ||
1537 | ||
1538 | ||
1539 | ||
1540 | <li class="md-nav__item"> | |
1541 | <a href="../../migration/wsc53/templates/" class="md-nav__link"> | |
1542 | Templates | |
1543 | </a> | |
1544 | </li> | |
1545 | ||
1546 | ||
1547 | ||
1548 | ||
1549 | ||
1550 | ||
1551 | ||
1552 | <li class="md-nav__item"> | |
1553 | <a href="../../migration/wsc53/libraries/" class="md-nav__link"> | |
1554 | Third Party Libraries | |
1555 | </a> | |
1556 | </li> | |
1557 | ||
1558 | ||
1559 | ||
1560 | </ul> | |
1561 | </nav> | |
1562 | </li> | |
1563 | ||
1564 | ||
1565 | ||
1566 | ||
1567 | ||
1568 | ||
1569 | ||
1570 | ||
1571 | <li class="md-nav__item md-nav__item--nested"> | |
1572 | ||
1573 | ||
1574 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" > | |
1575 | ||
1576 | <label class="md-nav__link" for="__nav_6_2"> | |
1577 | Migrating from WSC 5.2 | |
1578 | <span class="md-nav__icon md-icon"></span> | |
1579 | </label> | |
1580 | <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2"> | |
1581 | <label class="md-nav__title" for="__nav_6_2"> | |
1582 | <span class="md-nav__icon md-icon"></span> | |
1583 | Migrating from WSC 5.2 | |
1584 | </label> | |
1585 | <ul class="md-nav__list" data-md-scrollfix> | |
1586 | ||
1587 | ||
1588 | ||
1589 | ||
1590 | ||
1591 | <li class="md-nav__item"> | |
1592 | <a href="../../migration/wsc52/php/" class="md-nav__link"> | |
1593 | PHP API | |
1594 | </a> | |
1595 | </li> | |
1596 | ||
1597 | ||
1598 | ||
1599 | ||
1600 | ||
1601 | ||
1602 | ||
1603 | <li class="md-nav__item"> | |
1604 | <a href="../../migration/wsc52/templates/" class="md-nav__link"> | |
1605 | Templates and Languages | |
1606 | </a> | |
1607 | </li> | |
1608 | ||
1609 | ||
1610 | ||
1611 | ||
1612 | ||
1613 | ||
1614 | ||
1615 | <li class="md-nav__item"> | |
1616 | <a href="../../migration/wsc52/libraries/" class="md-nav__link"> | |
1617 | Third Party Libraries | |
1618 | </a> | |
1619 | </li> | |
1620 | ||
1621 | ||
1622 | ||
1623 | </ul> | |
1624 | </nav> | |
1625 | </li> | |
1626 | ||
1627 | ||
1628 | ||
1629 | ||
1630 | ||
1631 | ||
1632 | ||
1633 | ||
1634 | <li class="md-nav__item md-nav__item--nested"> | |
1635 | ||
1636 | ||
1637 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" > | |
1638 | ||
1639 | <label class="md-nav__link" for="__nav_6_3"> | |
1640 | Migrating from WSC 3.1 | |
1641 | <span class="md-nav__icon md-icon"></span> | |
1642 | </label> | |
1643 | <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2"> | |
1644 | <label class="md-nav__title" for="__nav_6_3"> | |
1645 | <span class="md-nav__icon md-icon"></span> | |
1646 | Migrating from WSC 3.1 | |
1647 | </label> | |
1648 | <ul class="md-nav__list" data-md-scrollfix> | |
1649 | ||
1650 | ||
1651 | ||
1652 | ||
1653 | ||
1654 | <li class="md-nav__item"> | |
1655 | <a href="../../migration/wsc31/php/" class="md-nav__link"> | |
1656 | PHP API | |
1657 | </a> | |
1658 | </li> | |
1659 | ||
1660 | ||
1661 | ||
1662 | </ul> | |
1663 | </nav> | |
1664 | </li> | |
1665 | ||
1666 | ||
1667 | ||
1668 | ||
1669 | ||
1670 | ||
1671 | ||
1672 | ||
1673 | <li class="md-nav__item md-nav__item--nested"> | |
1674 | ||
1675 | ||
1676 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" > | |
1677 | ||
1678 | <label class="md-nav__link" for="__nav_6_4"> | |
1679 | Migrating from WSC 3.0 | |
1680 | <span class="md-nav__icon md-icon"></span> | |
1681 | </label> | |
1682 | <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2"> | |
1683 | <label class="md-nav__title" for="__nav_6_4"> | |
1684 | <span class="md-nav__icon md-icon"></span> | |
1685 | Migrating from WSC 3.0 | |
1686 | </label> | |
1687 | <ul class="md-nav__list" data-md-scrollfix> | |
1688 | ||
1689 | ||
1690 | ||
1691 | ||
1692 | ||
1693 | <li class="md-nav__item"> | |
1694 | <a href="../../migration/wsc30/php/" class="md-nav__link"> | |
1695 | PHP API | |
1696 | </a> | |
1697 | </li> | |
1698 | ||
1699 | ||
1700 | ||
1701 | ||
1702 | ||
1703 | ||
1704 | ||
1705 | <li class="md-nav__item"> | |
1706 | <a href="../../migration/wsc30/javascript/" class="md-nav__link"> | |
1707 | JavaScript API | |
1708 | </a> | |
1709 | </li> | |
1710 | ||
1711 | ||
1712 | ||
1713 | ||
1714 | ||
1715 | ||
1716 | ||
1717 | <li class="md-nav__item"> | |
1718 | <a href="../../migration/wsc30/templates/" class="md-nav__link"> | |
1719 | Templates | |
1720 | </a> | |
1721 | </li> | |
1722 | ||
1723 | ||
1724 | ||
1725 | ||
1726 | ||
1727 | ||
1728 | ||
1729 | <li class="md-nav__item"> | |
1730 | <a href="../../migration/wsc30/css/" class="md-nav__link"> | |
1731 | CSS | |
1732 | </a> | |
1733 | </li> | |
1734 | ||
1735 | ||
1736 | ||
1737 | ||
1738 | ||
1739 | ||
1740 | ||
1741 | <li class="md-nav__item"> | |
1742 | <a href="../../migration/wsc30/package/" class="md-nav__link"> | |
1743 | Package Components | |
1744 | </a> | |
1745 | </li> | |
1746 | ||
1747 | ||
1748 | ||
1749 | </ul> | |
1750 | </nav> | |
1751 | </li> | |
1752 | ||
1753 | ||
1754 | ||
1755 | ||
1756 | ||
1757 | ||
1758 | ||
1759 | ||
1760 | <li class="md-nav__item md-nav__item--nested"> | |
1761 | ||
1762 | ||
1763 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" > | |
1764 | ||
1765 | <label class="md-nav__link" for="__nav_6_5"> | |
1766 | Migrating from WCF 2.1 | |
1767 | <span class="md-nav__icon md-icon"></span> | |
1768 | </label> | |
1769 | <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2"> | |
1770 | <label class="md-nav__title" for="__nav_6_5"> | |
1771 | <span class="md-nav__icon md-icon"></span> | |
1772 | Migrating from WCF 2.1 | |
1773 | </label> | |
1774 | <ul class="md-nav__list" data-md-scrollfix> | |
1775 | ||
1776 | ||
1777 | ||
1778 | ||
1779 | ||
1780 | <li class="md-nav__item"> | |
1781 | <a href="../../migration/wcf21/php/" class="md-nav__link"> | |
1782 | PHP API | |
1783 | </a> | |
1784 | </li> | |
1785 | ||
1786 | ||
1787 | ||
1788 | ||
1789 | ||
1790 | ||
1791 | ||
1792 | <li class="md-nav__item"> | |
1793 | <a href="../../migration/wcf21/templates/" class="md-nav__link"> | |
1794 | Templates | |
1795 | </a> | |
1796 | </li> | |
1797 | ||
1798 | ||
1799 | ||
1800 | ||
1801 | ||
1802 | ||
1803 | ||
1804 | <li class="md-nav__item"> | |
1805 | <a href="../../migration/wcf21/css/" class="md-nav__link"> | |
1806 | CSS | |
1807 | </a> | |
1808 | </li> | |
1809 | ||
1810 | ||
1811 | ||
1812 | ||
1813 | ||
1814 | ||
1815 | ||
1816 | <li class="md-nav__item"> | |
1817 | <a href="../../migration/wcf21/package/" class="md-nav__link"> | |
1818 | Package Components | |
1819 | </a> | |
1820 | </li> | |
1821 | ||
1822 | ||
1823 | ||
1824 | </ul> | |
1825 | </nav> | |
1826 | </li> | |
1827 | ||
1828 | ||
1829 | ||
1830 | </ul> | |
1831 | </nav> | |
1832 | </li> | |
1833 | ||
1834 | ||
1835 | ||
1836 | ||
1837 | ||
1838 | ||
1839 | ||
1840 | ||
1841 | ||
1842 | ||
1843 | ||
1844 | <li class="md-nav__item md-nav__item--nested"> | |
1845 | ||
1846 | ||
1847 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" > | |
1848 | ||
1849 | <label class="md-nav__link" for="__nav_7"> | |
1850 | Tutorials | |
1851 | <span class="md-nav__icon md-icon"></span> | |
1852 | </label> | |
1853 | <nav class="md-nav" aria-label="Tutorials" data-md-level="1"> | |
1854 | <label class="md-nav__title" for="__nav_7"> | |
1855 | <span class="md-nav__icon md-icon"></span> | |
1856 | Tutorials | |
1857 | </label> | |
1858 | <ul class="md-nav__list" data-md-scrollfix> | |
1859 | ||
1860 | ||
1861 | ||
1862 | ||
1863 | ||
1864 | ||
1865 | <li class="md-nav__item md-nav__item--nested"> | |
1866 | ||
1867 | ||
1868 | <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" > | |
1869 | ||
1870 | <label class="md-nav__link" for="__nav_7_1"> | |
1871 | Tutorial Series | |
1872 | <span class="md-nav__icon md-icon"></span> | |
1873 | </label> | |
1874 | <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2"> | |
1875 | <label class="md-nav__title" for="__nav_7_1"> | |
1876 | <span class="md-nav__icon md-icon"></span> | |
1877 | Tutorial Series | |
1878 | </label> | |
1879 | <ul class="md-nav__list" data-md-scrollfix> | |
1880 | ||
1881 | ||
1882 | ||
1883 | ||
1884 | ||
1885 | <li class="md-nav__item"> | |
1886 | <a href="../../tutorial/series/overview/" class="md-nav__link"> | |
1887 | Overview | |
1888 | </a> | |
1889 | </li> | |
1890 | ||
1891 | ||
1892 | ||
1893 | ||
1894 | ||
1895 | ||
1896 | ||
1897 | <li class="md-nav__item"> | |
1898 | <a href="../../tutorial/series/part_1/" class="md-nav__link"> | |
1899 | Part 1 | |
1900 | </a> | |
1901 | </li> | |
1902 | ||
1903 | ||
1904 | ||
1905 | ||
1906 | ||
1907 | ||
1908 | ||
1909 | <li class="md-nav__item"> | |
1910 | <a href="../../tutorial/series/part_2/" class="md-nav__link"> | |
1911 | Part 2 | |
1912 | </a> | |
1913 | </li> | |
1914 | ||
1915 | ||
1916 | ||
1917 | ||
1918 | ||
1919 | ||
1920 | ||
1921 | <li class="md-nav__item"> | |
1922 | <a href="../../tutorial/series/part_3/" class="md-nav__link"> | |
1923 | Part 3 | |
1924 | </a> | |
1925 | </li> | |
1926 | ||
1927 | ||
1928 | ||
1929 | </ul> | |
1930 | </nav> | |
1931 | </li> | |
1932 | ||
1933 | ||
1934 | ||
1935 | </ul> | |
1936 | </nav> | |
1937 | </li> | |
1938 | ||
1939 | ||
1940 | ||
1941 | </ul> | |
1942 | </nav> | |
1943 | </div> | |
1944 | </div> | |
1945 | </div> | |
1946 | ||
1947 | ||
1948 | ||
1949 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
1950 | <div class="md-sidebar__scrollwrap"> | |
1951 | <div class="md-sidebar__inner"> | |
1952 | ||
1953 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
1954 | ||
1955 | ||
1956 | ||
1957 | ||
1958 | ||
1959 | <label class="md-nav__title" for="__toc"> | |
1960 | <span class="md-nav__icon md-icon"></span> | |
1961 | Table of contents | |
1962 | </label> | |
1963 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
1964 | ||
1965 | <li class="md-nav__item"> | |
1966 | <a href="#the-preparedstatement-object" class="md-nav__link"> | |
1967 | The PreparedStatement Object | |
1968 | </a> | |
1969 | ||
1970 | <nav class="md-nav" aria-label="The PreparedStatement Object"> | |
1971 | <ul class="md-nav__list"> | |
1972 | ||
1973 | <li class="md-nav__item"> | |
1974 | <a href="#query-parameters" class="md-nav__link"> | |
1975 | Query Parameters | |
1976 | </a> | |
1977 | ||
1978 | </li> | |
1979 | ||
1980 | <li class="md-nav__item"> | |
1981 | <a href="#fetching-a-single-result" class="md-nav__link"> | |
1982 | Fetching a Single Result | |
1983 | </a> | |
1984 | ||
1985 | </li> | |
1986 | ||
1987 | <li class="md-nav__item"> | |
1988 | <a href="#fetch-by-column" class="md-nav__link"> | |
1989 | Fetch by Column | |
1990 | </a> | |
1991 | ||
1992 | </li> | |
1993 | ||
1994 | <li class="md-nav__item"> | |
1995 | <a href="#fetching-all-results" class="md-nav__link"> | |
1996 | Fetching All Results | |
1997 | </a> | |
1998 | ||
1999 | </li> | |
2000 | ||
2001 | </ul> | |
2002 | </nav> | |
2003 | ||
2004 | </li> | |
2005 | ||
2006 | <li class="md-nav__item"> | |
2007 | <a href="#building-complex-conditions" class="md-nav__link"> | |
2008 | Building Complex Conditions | |
2009 | </a> | |
2010 | ||
2011 | </li> | |
2012 | ||
2013 | <li class="md-nav__item"> | |
2014 | <a href="#insert-or-update-in-bulk" class="md-nav__link"> | |
2015 | INSERT or UPDATE in Bulk | |
2016 | </a> | |
2017 | ||
2018 | </li> | |
2019 | ||
2020 | </ul> | |
2021 | ||
2022 | </nav> | |
2023 | </div> | |
2024 | </div> | |
2025 | </div> | |
2026 | ||
2027 | ||
2028 | <div class="md-content" data-md-component="content"> | |
2029 | <article class="md-content__inner md-typeset"> | |
2030 | ||
2031 | ||
9b8bddda | 2032 | <a href="https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/php/database-access.md" title="Edit this page" class="md-content__button md-icon"> |
7124f4cb WG |
2033 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg> |
2034 | </a> | |
2035 | ||
0c5338dd TD |
2036 | |
2037 | <h1 id="database-access">Database Access<a class="headerlink" href="#database-access" title="Permanent link">#</a></h1> | |
2038 | <p><a href="../database-objects/">Database Objects</a> provide a convenient and object-oriented approach to work with the database, but there can be use-cases that require raw access including writing methods for model classes. This section assumes that you have either used <a href="https://en.wikipedia.org/wiki/Prepared_statement">prepared statements</a> before or at least understand how it works.</p> | |
2039 | <h2 id="the-preparedstatement-object">The PreparedStatement Object<a class="headerlink" href="#the-preparedstatement-object" title="Permanent link">#</a></h2> | |
2040 | <p>The database access is designed around <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/database/statement/PreparedStatement.class.php">PreparedStatement</a>, built on top of PHP's <code>PDOStatement</code> so that you call all of <code>PDOStatement</code>'s methods, and each query requires you to obtain a statement object.</p> | |
2041 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2042 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="s2">"SELECT * FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example"</span><span class="p">);</span> | |
2043 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2044 | <span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchArray</span><span class="p">())</span> <span class="p">{</span> | |
2045 | <span class="c1">// handle result</span> | |
2046 | <span class="p">}</span> | |
2047 | </code></pre></div> | |
0c5338dd TD |
2048 | <h3 id="query-parameters">Query Parameters<a class="headerlink" href="#query-parameters" title="Permanent link">#</a></h3> |
2049 | <p>The example below illustrates the usage of parameters where each value is replaced with the generic <code>?</code>-placeholder. Values are provided by calling <code>$statement->execute()</code> with a continuous, one-dimensional array that exactly match the number of question marks.</p> | |
2050 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2051 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT *</span> | |
2052 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example</span> | |
2053 | <span class="s2"> WHERE exampleID = ?</span> | |
2054 | <span class="s2"> OR bar IN (?, ?, ?, ?, ?)"</span><span class="p">;</span> | |
2055 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2056 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span> | |
2057 | <span class="nv">$exampleID</span><span class="p">,</span> | |
2058 | <span class="nv">$list</span><span class="p">,</span> <span class="nv">$of</span><span class="p">,</span> <span class="nv">$values</span><span class="p">,</span> <span class="nv">$for</span><span class="p">,</span> <span class="nv">$bar</span> | |
2059 | <span class="p">]);</span> | |
2060 | <span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchArray</span><span class="p">())</span> <span class="p">{</span> | |
2061 | <span class="c1">// handle result</span> | |
2062 | <span class="p">}</span> | |
2063 | </code></pre></div> | |
0c5338dd TD |
2064 | <h3 id="fetching-a-single-result">Fetching a Single Result<a class="headerlink" href="#fetching-a-single-result" title="Permanent link">#</a></h3> |
2065 | <div class="admonition danger"> | |
2066 | <p class="admonition-title">Do not attempt to use <code>fetchSingleRow()</code> or <code>fetchSingleColumn()</code> if the result contains more than one row.</p> | |
2067 | </div> | |
2068 | <p>You can opt-in to retrieve only a single row from database and make use of shortcut methods to reduce the code that you have to write.</p> | |
2069 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2070 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT *</span> | |
2071 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example</span> | |
2072 | <span class="s2"> WHERE exampleID = ?"</span><span class="p">;</span> | |
2073 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> | |
2074 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span><span class="nv">$exampleID</span><span class="p">]);</span> | |
2075 | <span class="nv">$row</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchSingleRow</span><span class="p">();</span> | |
2076 | </code></pre></div> | |
0c5338dd TD |
2077 | <p>There are two distinct differences when comparing with the example on query parameters above:</p> |
2078 | <ol> | |
2079 | <li>The method <code>prepareStatement()</code> receives a secondary parameter that will be appended to the query as <code>LIMIT 1</code>.</li> | |
2080 | <li>Data is read using <code>fetchSingleRow()</code> instead of <code>fetchArray()</code> or similar methods, that will read one result and close the cursor.</li> | |
2081 | </ol> | |
2082 | <h3 id="fetch-by-column">Fetch by Column<a class="headerlink" href="#fetch-by-column" title="Permanent link">#</a></h3> | |
2083 | <div class="admonition warning"> | |
2084 | <p class="admonition-title">There is no way to return another column from the same row if you use <code>fetchColumn()</code> to retrieve data.</p> | |
2085 | </div> | |
2086 | <p>Fetching an array is only useful if there is going to be more than one column per result row, otherwise accessing the column directly is much more convenient and increases the code readability.</p> | |
2087 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2088 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT bar</span> | |
2089 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example"</span><span class="p">;</span> | |
2090 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2091 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2092 | <span class="k">while</span> <span class="p">(</span><span class="nv">$bar</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchColumn</span><span class="p">())</span> <span class="p">{</span> | |
2093 | <span class="c1">// handle result</span> | |
2094 | <span class="p">}</span> | |
2095 | <span class="nv">$bar</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchSingleColumn</span><span class="p">();</span> | |
2096 | </code></pre></div> | |
0c5338dd TD |
2097 | <p>Similar to fetching a single row, you can also issue a query that will select a single row, but reads only one column from the result row.</p> |
2098 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2099 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT bar</span> | |
2100 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example</span> | |
2101 | <span class="s2"> WHERE exampleID = ?"</span><span class="p">;</span> | |
2102 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> | |
2103 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span><span class="nv">$exampleID</span><span class="p">]);</span> | |
2104 | <span class="nv">$bar</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchSingleColumn</span><span class="p">();</span> | |
2105 | </code></pre></div> | |
0c5338dd TD |
2106 | <h3 id="fetching-all-results">Fetching All Results<a class="headerlink" href="#fetching-all-results" title="Permanent link">#</a></h3> |
2107 | <p>If you want to fetch all results of a query but only store them in an array without directly processing them, in most cases, you can rely on built-in methods.</p> | |
2108 | <p>To fetch all rows of query, you can use <code>PDOStatement::fetchAll()</code> with <code>\PDO::FETCH_ASSOC</code> as the first parameter:</p> | |
2109 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2110 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT *</span> | |
2111 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example"</span><span class="p">;</span> | |
2112 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2113 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2114 | <span class="nv">$rows</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchAll</span><span class="p">(</span><span class="nx">\PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">);</span> | |
2115 | </code></pre></div> | |
0c5338dd TD |
2116 | <p>As a result, you get an array containing associative arrays with the rows of the <code>wcf{WCF_N}_example</code> database table as content.</p> |
2117 | <p>If you only want to fetch a list of the values of a certain column, you can use <code>\PDO::FETCH_COLUMN</code> as the first parameter:</p> | |
2118 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2119 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT exampleID</span> | |
2120 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example"</span><span class="p">;</span> | |
2121 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2122 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2123 | <span class="nv">$exampleIDs</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchAll</span><span class="p">(</span><span class="nx">\PDO</span><span class="o">::</span><span class="na">FETCH_COLUMN</span><span class="p">);</span> | |
2124 | </code></pre></div> | |
0c5338dd TD |
2125 | <p>As a result, you get an array with all <code>exampleID</code> values.</p> |
2126 | <p>The <code>PreparedStatement</code> class adds an additional methods that covers another common use case in our code: | |
2127 | Fetching two columns and using the first column's value as the array key and the second column's value as the array value. | |
2128 | This case is covered by <code>PreparedStatement::fetchMap()</code>:</p> | |
2129 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2130 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT exampleID, userID</span> | |
2131 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example_mapping"</span><span class="p">;</span> | |
2132 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2133 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2134 | <span class="nv">$map</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchMap</span><span class="p">(</span><span class="s1">'exampleID'</span><span class="p">,</span> <span class="s1">'userID'</span><span class="p">);</span> | |
2135 | </code></pre></div> | |
0c5338dd TD |
2136 | <p><code>$map</code> is a one-dimensional array where each <code>exampleID</code> value maps to the corresponding <code>userID</code> value.</p> |
2137 | <div class="admonition warning"> | |
2138 | <p class="admonition-title">If there are multiple entries for a certain <code>exampleID</code> value with different <code>userID</code> values, the existing entry in the array will be overwritten and contain the last read value from the database table. Therefore, this method should generally only be used for unique combinations.</p> | |
2139 | </div> | |
2140 | <p>If you do not have a combination of columns with unique pairs of values, but you want to get a list of <code>userID</code> values with the same <code>exampleID</code>, you can set the third parameter of <code>fetchMap()</code> to <code>false</code> and get a list:</p> | |
2141 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2142 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT exampleID, userID</span> | |
2143 | <span class="s2"> FROM wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example_mapping"</span><span class="p">;</span> | |
2144 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2145 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">();</span> | |
2146 | <span class="nv">$map</span> <span class="o">=</span> <span class="nv">$statement</span><span class="o">-></span><span class="na">fetchMap</span><span class="p">(</span><span class="s1">'exampleID'</span><span class="p">,</span> <span class="s1">'userID'</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span> | |
2147 | </code></pre></div> | |
0c5338dd TD |
2148 | <p>Now, as a result, you get a two-dimensional array with the array keys being the <code>exampleID</code> values and the array values being arrays with all <code>userID</code> values from rows with the respective <code>exampleID</code> value.</p> |
2149 | <h2 id="building-complex-conditions">Building Complex Conditions<a class="headerlink" href="#building-complex-conditions" title="Permanent link">#</a></h2> | |
2150 | <p>Building conditional conditions can turn out to be a real mess and it gets even worse with SQL's <code>IN (…)</code> which requires as many placeholders as there will be values. The solutions is <code>PreparedStatementConditionBuilder</code>, a simple but useful helper class with a bulky name, it is also the class used when accessing <code>DatabaseObjecList::getConditionBuilder()</code>.</p> | |
2151 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2152 | <span class="nv">$conditions</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\system\database\util\PreparedStatementConditionBuilder</span><span class="p">();</span> | |
2153 | <span class="nv">$conditions</span><span class="o">-></span><span class="na">add</span><span class="p">(</span><span class="s2">"exampleID = ?"</span><span class="p">,</span> <span class="p">[</span><span class="nv">$exampleID</span><span class="p">]);</span> | |
2154 | <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$valuesForBar</span><span class="p">))</span> <span class="p">{</span> | |
2155 | <span class="nv">$conditions</span><span class="o">-></span><span class="na">add</span><span class="p">(</span><span class="s2">"(bar IN (?) OR baz = ?)"</span><span class="p">,</span> <span class="p">[</span><span class="nv">$valuesForBar</span><span class="p">,</span> <span class="nv">$baz</span><span class="p">]);</span> | |
2156 | <span class="p">}</span> | |
2157 | </code></pre></div> | |
0c5338dd TD |
2158 | <p>The <code>IN (?)</code> in the example above is automatically expanded to match the number of items contained in <code>$valuesForBar</code>. Be aware that the method will generate an invalid query if <code>$valuesForBar</code> is empty!</p> |
2159 | <h2 id="insert-or-update-in-bulk">INSERT or UPDATE in Bulk<a class="headerlink" href="#insert-or-update-in-bulk" title="Permanent link">#</a></h2> | |
2160 | <p>Prepared statements not only protect against SQL injection by separating the logical query and the actual data, but also provides the ability to reuse the same query with different values. This leads to a performance improvement as the code does not have to transmit the query with for every data set and only has to parse and analyze the query once.</p> | |
2161 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2162 | <span class="nv">$data</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'abc'</span><span class="p">,</span> <span class="s1">'def'</span><span class="p">,</span> <span class="s1">'ghi'</span><span class="p">];</span> | |
2163 | ||
2164 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"INSERT INTO wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example</span> | |
2165 | <span class="s2"> (bar)</span> | |
2166 | <span class="s2"> VALUES (?)"</span><span class="p">;</span> | |
2167 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2168 | ||
2169 | <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">beginTransaction</span><span class="p">();</span> | |
2170 | <span class="k">foreach</span> <span class="p">(</span><span class="nv">$data</span> <span class="k">as</span> <span class="nv">$bar</span><span class="p">)</span> <span class="p">{</span> | |
2171 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span><span class="nv">$bar</span><span class="p">]);</span> | |
2172 | <span class="p">}</span> | |
2173 | <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">commitTransaction</span><span class="p">();</span> | |
2174 | </code></pre></div> | |
0c5338dd TD |
2175 | <p>It is generally advised to wrap bulk operations in a transaction as it allows the database to optimize the process, including fewer I/O operations.</p> |
2176 | <div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span> | |
2177 | <span class="nv">$data</span> <span class="o">=</span> <span class="p">[</span> | |
2178 | <span class="mi">1</span> <span class="o">=></span> <span class="s1">'abc'</span><span class="p">,</span> | |
2179 | <span class="mi">3</span> <span class="o">=></span> <span class="s1">'def'</span><span class="p">,</span> | |
2180 | <span class="mi">4</span> <span class="o">=></span> <span class="s1">'ghi'</span> | |
2181 | <span class="p">];</span> | |
2182 | ||
2183 | <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"UPDATE wcf"</span><span class="o">.</span><span class="nx">WCF_N</span><span class="o">.</span><span class="s2">"_example</span> | |
2184 | <span class="s2"> SET bar = ?</span> | |
2185 | <span class="s2"> WHERE exampleID = ?"</span><span class="p">;</span> | |
2186 | <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> | |
2187 | ||
2188 | <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">beginTransaction</span><span class="p">();</span> | |
2189 | <span class="k">foreach</span> <span class="p">(</span><span class="nv">$data</span> <span class="k">as</span> <span class="nv">$exampleID</span> <span class="o">=></span> <span class="nv">$bar</span><span class="p">)</span> <span class="p">{</span> | |
2190 | <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span> | |
2191 | <span class="nv">$bar</span><span class="p">,</span> | |
2192 | <span class="nv">$exampleID</span> | |
2193 | <span class="p">]);</span> | |
2194 | <span class="p">}</span> | |
2195 | <span class="nx">\wcf\system\WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">commitTransaction</span><span class="p">();</span> | |
2196 | </code></pre></div> | |
2197 | ||
4a5c32e1 WG |
2198 | |
2199 | ||
2200 | ||
2201 | <hr> | |
2202 | <div class="md-source-date"> | |
2203 | <small> | |
2204 | ||
2205 | Last update: 2021-01-08 | |
2206 | ||
2207 | </small> | |
2208 | </div> | |
2209 | ||
2210 | ||
0c5338dd TD |
2211 | |
2212 | ||
2213 | ||
2214 | ||
2215 | ||
2216 | ||
2217 | </article> | |
2218 | </div> | |
2219 | </div> | |
fb962f09 | 2220 | |
0c5338dd TD |
2221 | </main> |
2222 | ||
2223 | ||
2224 | <footer class="md-footer"> | |
2225 | ||
2226 | <nav class="md-footer__inner md-grid" aria-label="Footer"> | |
2227 | ||
2228 | <a href="../database-objects/" class="md-footer__link md-footer__link--prev" rel="prev"> | |
2229 | <div class="md-footer__button md-icon"> | |
2230 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> | |
2231 | </div> | |
2232 | <div class="md-footer__title"> | |
2233 | <div class="md-ellipsis"> | |
2234 | <span class="md-footer__direction"> | |
2235 | Previous | |
2236 | </span> | |
2237 | Database Objects | |
2238 | </div> | |
2239 | </div> | |
2240 | </a> | |
2241 | ||
2242 | ||
2243 | <a href="../exceptions/" class="md-footer__link md-footer__link--next" rel="next"> | |
2244 | <div class="md-footer__title"> | |
2245 | <div class="md-ellipsis"> | |
2246 | <span class="md-footer__direction"> | |
2247 | Next | |
2248 | </span> | |
2249 | Exceptions | |
2250 | </div> | |
2251 | </div> | |
2252 | <div class="md-footer__button md-icon"> | |
2253 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg> | |
2254 | </div> | |
2255 | </a> | |
2256 | ||
2257 | </nav> | |
2258 | ||
2259 | <div class="md-footer-meta md-typeset"> | |
2260 | <div class="md-footer-meta__inner md-grid"> | |
2261 | <div class="md-footer-copyright"> | |
2262 | ||
2263 | <div class="md-footer-copyright__highlight"> | |
2264 | Copyright © 2020 WoltLab GmbH | |
2265 | </div> | |
2266 | ||
2267 | Made with | |
2268 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
2269 | Material for MkDocs | |
2270 | </a> | |
fb88dc6e | 2271 | |
0c5338dd TD |
2272 | </div> |
2273 | <div class="md-footer-copyright"> | |
2274 | <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a> | |
2275 | <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a> | |
2276 | </div> | |
2277 | </div> | |
2278 | </div> | |
2279 | </footer> | |
2280 | ||
2281 | </div> | |
2282 | <div class="md-dialog" data-md-component="dialog"> | |
2283 | <div class="md-dialog__inner md-typeset"></div> | |
2284 | </div> | |
fb962f09 | 2285 | <script id="__config" type="application/json">{"base": "../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../assets/javascripts/workers/search.fe42c31b.min.js", "version": {"provider": "mike"}}</script> |
0c5338dd TD |
2286 | |
2287 | ||
fb962f09 | 2288 | <script src="../../assets/javascripts/bundle.d892486b.min.js"></script> |
0c5338dd TD |
2289 | |
2290 | ||
2291 | </body> | |
2292 | </html> |