3 <html lang=
"en" class=
"no-js">
7 <meta name=
"viewport" content=
"width=device-width,initial-scale=1">
12 <link rel=
"shortcut icon" href=
"../../assets/default.favicon.ico">
13 <meta name=
"generator" content=
"mkdocs-1.1.2, mkdocs-material-7.0.5">
17 <title>Database Access - WoltLab Suite Documentation
</title>
21 <link rel=
"stylesheet" href=
"../../assets/stylesheets/main.77f3fd56.min.css">
24 <link rel=
"stylesheet" href=
"../../assets/stylesheets/palette.7fa14f5b.min.css">
28 <meta name=
"theme-color" content=
"#009485">
38 <link rel=
"stylesheet" href=
"../../stylesheets/extra.css">
52 <body dir=
"ltr" data-md-color-scheme=
"" data-md-color-primary=
"teal" data-md-color-accent=
"">
56 <input class=
"md-toggle" data-md-toggle=
"drawer" type=
"checkbox" id=
"__drawer" autocomplete=
"off">
57 <input class=
"md-toggle" data-md-toggle=
"search" type=
"checkbox" id=
"__search" autocomplete=
"off">
58 <label class=
"md-overlay" for=
"__drawer"></label>
59 <div data-md-component=
"skip">
62 <a href=
"#database-access" class=
"md-skip">
67 <div data-md-component=
"announce">
69 <aside class=
"md-announce">
70 <div class=
"md-announce__inner md-grid md-typeset">
72 <a href=
"https://www.woltlab.com">Back to
<strong>woltlab.com
</strong></a>
81 <header class=
"md-header" data-md-component=
"header">
82 <nav class=
"md-header__inner md-grid" aria-label=
"Header">
83 <a href=
"../.." title=
"WoltLab Suite Documentation" class=
"md-header__button md-logo" aria-label=
"WoltLab Suite Documentation">
85 <img src=
"../../assets/logo.png" alt=
"logo">
88 <label class=
"md-header__button md-icon" for=
"__drawer">
89 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
91 <div class=
"md-header__title" data-md-component=
"header-title">
92 <div class=
"md-header__ellipsis">
93 <div class=
"md-header__topic">
94 <span class=
"md-ellipsis">
95 WoltLab Suite Documentation
98 <div class=
"md-header__topic" data-md-component=
"header-topic">
99 <span class=
"md-ellipsis">
107 <div class=
"md-header__options">
111 <label class=
"md-header__button md-icon" for=
"__search">
112 <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>
115 <div class=
"md-search" data-md-component=
"search" role=
"dialog">
116 <label class=
"md-search__overlay" for=
"__search"></label>
117 <div class=
"md-search__inner" role=
"search">
118 <form class=
"md-search__form" name=
"search">
119 <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
>
120 <label class=
"md-search__icon md-icon" for=
"__search">
121 <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>
122 <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>
124 <button type=
"reset" class=
"md-search__icon md-icon" aria-label=
"Clear" tabindex=
"-1">
125 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M19 6.41L17.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>
128 <div class=
"md-search__output">
129 <div class=
"md-search__scrollwrap" data-md-scrollfix
>
130 <div class=
"md-search-result" data-md-component=
"search-result">
131 <div class=
"md-search-result__meta">
134 <ol class=
"md-search-result__list"></ol>
142 <div class=
"md-header__source">
144 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
145 <div class=
"md-source__icon md-icon">
147 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05L244 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>
149 <div class=
"md-source__repository">
158 <div class=
"md-container" data-md-component=
"container">
163 <main class=
"md-main" data-md-component=
"main">
164 <div class=
"md-main__inner md-grid">
168 <div class=
"md-sidebar md-sidebar--primary" data-md-component=
"sidebar" data-md-type=
"navigation" >
169 <div class=
"md-sidebar__scrollwrap">
170 <div class=
"md-sidebar__inner">
176 <nav class=
"md-nav md-nav--primary" aria-label=
"Navigation" data-md-level=
"0">
177 <label class=
"md-nav__title" for=
"__drawer">
178 <a href=
"../.." title=
"WoltLab Suite Documentation" class=
"md-nav__button md-logo" aria-label=
"WoltLab Suite Documentation">
180 <img src=
"../../assets/logo.png" alt=
"logo">
183 WoltLab Suite Documentation
186 <div class=
"md-nav__source">
188 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
189 <div class=
"md-source__icon md-icon">
191 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05L244 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>
193 <div class=
"md-source__repository">
199 <ul class=
"md-nav__list" data-md-scrollfix
>
208 <li class=
"md-nav__item">
209 <a href=
"../../getting-started/" class=
"md-nav__link">
226 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
229 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2" type=
"checkbox" id=
"__nav_2" checked
>
231 <label class=
"md-nav__link" for=
"__nav_2">
233 <span class=
"md-nav__icon md-icon"></span>
235 <nav class=
"md-nav" aria-label=
"PHP API" data-md-level=
"1">
236 <label class=
"md-nav__title" for=
"__nav_2">
237 <span class=
"md-nav__icon md-icon"></span>
240 <ul class=
"md-nav__list" data-md-scrollfix
>
246 <li class=
"md-nav__item">
247 <a href=
"../pages/" class=
"md-nav__link">
258 <li class=
"md-nav__item">
259 <a href=
"../database-objects/" class=
"md-nav__link">
272 <li class=
"md-nav__item md-nav__item--active">
274 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"toc" type=
"checkbox" id=
"__toc">
279 <label class=
"md-nav__link md-nav__link--active" for=
"__toc">
281 <span class=
"md-nav__icon md-icon"></span>
284 <a href=
"./" class=
"md-nav__link md-nav__link--active">
289 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
295 <label class=
"md-nav__title" for=
"__toc">
296 <span class=
"md-nav__icon md-icon"></span>
299 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
301 <li class=
"md-nav__item">
302 <a href=
"#the-preparedstatement-object" class=
"md-nav__link">
303 The PreparedStatement Object
306 <nav class=
"md-nav" aria-label=
"The PreparedStatement Object">
307 <ul class=
"md-nav__list">
309 <li class=
"md-nav__item">
310 <a href=
"#query-parameters" class=
"md-nav__link">
316 <li class=
"md-nav__item">
317 <a href=
"#fetching-a-single-result" class=
"md-nav__link">
318 Fetching a Single Result
323 <li class=
"md-nav__item">
324 <a href=
"#fetch-by-column" class=
"md-nav__link">
330 <li class=
"md-nav__item">
331 <a href=
"#fetching-all-results" class=
"md-nav__link">
342 <li class=
"md-nav__item">
343 <a href=
"#building-complex-conditions" class=
"md-nav__link">
344 Building Complex Conditions
349 <li class=
"md-nav__item">
350 <a href=
"#insert-or-update-in-bulk" class=
"md-nav__link">
351 INSERT or UPDATE in Bulk
368 <li class=
"md-nav__item">
369 <a href=
"../exceptions/" class=
"md-nav__link">
381 <li class=
"md-nav__item md-nav__item--nested">
384 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5" type=
"checkbox" id=
"__nav_2_5" >
386 <label class=
"md-nav__link" for=
"__nav_2_5">
388 <span class=
"md-nav__icon md-icon"></span>
390 <nav class=
"md-nav" aria-label=
"API" data-md-level=
"2">
391 <label class=
"md-nav__title" for=
"__nav_2_5">
392 <span class=
"md-nav__icon md-icon"></span>
395 <ul class=
"md-nav__list" data-md-scrollfix
>
401 <li class=
"md-nav__item">
402 <a href=
"../api/caches/" class=
"md-nav__link">
413 <li class=
"md-nav__item">
414 <a href=
"../api/comments/" class=
"md-nav__link">
425 <li class=
"md-nav__item">
426 <a href=
"../api/cronjobs/" class=
"md-nav__link">
437 <li class=
"md-nav__item">
438 <a href=
"../api/events/" class=
"md-nav__link">
450 <li class=
"md-nav__item md-nav__item--nested">
453 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5_5" type=
"checkbox" id=
"__nav_2_5_5" >
455 <label class=
"md-nav__link" for=
"__nav_2_5_5">
457 <span class=
"md-nav__icon md-icon"></span>
459 <nav class=
"md-nav" aria-label=
"Form Builder" data-md-level=
"3">
460 <label class=
"md-nav__title" for=
"__nav_2_5_5">
461 <span class=
"md-nav__icon md-icon"></span>
464 <ul class=
"md-nav__list" data-md-scrollfix
>
470 <li class=
"md-nav__item">
471 <a href=
"../api/form_builder/overview/" class=
"md-nav__link">
482 <li class=
"md-nav__item">
483 <a href=
"../api/form_builder/structure/" class=
"md-nav__link">
494 <li class=
"md-nav__item">
495 <a href=
"../api/form_builder/form_fields/" class=
"md-nav__link">
506 <li class=
"md-nav__item">
507 <a href=
"../api/form_builder/validation_data/" class=
"md-nav__link">
518 <li class=
"md-nav__item">
519 <a href=
"../api/form_builder/dependencies/" class=
"md-nav__link">
536 <li class=
"md-nav__item">
537 <a href=
"../api/package_installation_plugins/" class=
"md-nav__link">
538 Package Installation Plugins
548 <li class=
"md-nav__item">
549 <a href=
"../api/user_activity_points/" class=
"md-nav__link">
560 <li class=
"md-nav__item">
561 <a href=
"../api/user_notifications/" class=
"md-nav__link">
572 <li class=
"md-nav__item">
573 <a href=
"../api/sitemaps/" class=
"md-nav__link">
590 <li class=
"md-nav__item">
591 <a href=
"../code-style/" class=
"md-nav__link">
602 <li class=
"md-nav__item">
603 <a href=
"../apps/" class=
"md-nav__link">
614 <li class=
"md-nav__item">
615 <a href=
"../gdpr/" class=
"md-nav__link">
636 <li class=
"md-nav__item md-nav__item--nested">
639 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_3" type=
"checkbox" id=
"__nav_3" >
641 <label class=
"md-nav__link" for=
"__nav_3">
642 Languages, Templates & CSS
643 <span class=
"md-nav__icon md-icon"></span>
645 <nav class=
"md-nav" aria-label=
"Languages, Templates & CSS" data-md-level=
"1">
646 <label class=
"md-nav__title" for=
"__nav_3">
647 <span class=
"md-nav__icon md-icon"></span>
648 Languages, Templates & CSS
650 <ul class=
"md-nav__list" data-md-scrollfix
>
656 <li class=
"md-nav__item">
657 <a href=
"../../view/languages/" class=
"md-nav__link">
668 <li class=
"md-nav__item">
669 <a href=
"../../view/templates/" class=
"md-nav__link">
680 <li class=
"md-nav__item">
681 <a href=
"../../view/css/" class=
"md-nav__link">
702 <li class=
"md-nav__item md-nav__item--nested">
705 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4" type=
"checkbox" id=
"__nav_4" >
707 <label class=
"md-nav__link" for=
"__nav_4">
709 <span class=
"md-nav__icon md-icon"></span>
711 <nav class=
"md-nav" aria-label=
"JavaScript API" data-md-level=
"1">
712 <label class=
"md-nav__title" for=
"__nav_4">
713 <span class=
"md-nav__icon md-icon"></span>
716 <ul class=
"md-nav__list" data-md-scrollfix
>
722 <li class=
"md-nav__item">
723 <a href=
"../../javascript/general-usage/" class=
"md-nav__link">
735 <li class=
"md-nav__item md-nav__item--nested">
738 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4_2" type=
"checkbox" id=
"__nav_4_2" >
740 <label class=
"md-nav__link" for=
"__nav_4_2">
742 <span class=
"md-nav__icon md-icon"></span>
744 <nav class=
"md-nav" aria-label=
"New API" data-md-level=
"2">
745 <label class=
"md-nav__title" for=
"__nav_4_2">
746 <span class=
"md-nav__icon md-icon"></span>
749 <ul class=
"md-nav__list" data-md-scrollfix
>
755 <li class=
"md-nav__item">
756 <a href=
"../../javascript/new-api_writing-a-module/" class=
"md-nav__link">
767 <li class=
"md-nav__item">
768 <a href=
"../../javascript/new-api_data-structures/" class=
"md-nav__link">
779 <li class=
"md-nav__item">
780 <a href=
"../../javascript/new-api_core/" class=
"md-nav__link">
791 <li class=
"md-nav__item">
792 <a href=
"../../javascript/new-api_dom/" class=
"md-nav__link">
803 <li class=
"md-nav__item">
804 <a href=
"../../javascript/new-api_events/" class=
"md-nav__link">
815 <li class=
"md-nav__item">
816 <a href=
"../../javascript/new-api_ajax/" class=
"md-nav__link">
827 <li class=
"md-nav__item">
828 <a href=
"../../javascript/new-api_dialogs/" class=
"md-nav__link">
839 <li class=
"md-nav__item">
840 <a href=
"../../javascript/new-api_browser/" class=
"md-nav__link">
841 Browser and Screen Sizes
851 <li class=
"md-nav__item">
852 <a href=
"../../javascript/new-api_ui/" class=
"md-nav__link">
869 <li class=
"md-nav__item">
870 <a href=
"../../javascript/legacy-api/" class=
"md-nav__link">
881 <li class=
"md-nav__item">
882 <a href=
"../../javascript/helper-functions/" class=
"md-nav__link">
893 <li class=
"md-nav__item">
894 <a href=
"../../javascript/code-snippets/" class=
"md-nav__link">
915 <li class=
"md-nav__item md-nav__item--nested">
918 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5" type=
"checkbox" id=
"__nav_5" >
920 <label class=
"md-nav__link" for=
"__nav_5">
922 <span class=
"md-nav__icon md-icon"></span>
924 <nav class=
"md-nav" aria-label=
"Package Components" data-md-level=
"1">
925 <label class=
"md-nav__title" for=
"__nav_5">
926 <span class=
"md-nav__icon md-icon"></span>
929 <ul class=
"md-nav__list" data-md-scrollfix
>
935 <li class=
"md-nav__item">
936 <a href=
"../../package/package-xml/" class=
"md-nav__link">
948 <li class=
"md-nav__item md-nav__item--nested">
951 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5_2" type=
"checkbox" id=
"__nav_5_2" >
953 <label class=
"md-nav__link" for=
"__nav_5_2">
955 <span class=
"md-nav__icon md-icon"></span>
957 <nav class=
"md-nav" aria-label=
"PIPs" data-md-level=
"2">
958 <label class=
"md-nav__title" for=
"__nav_5_2">
959 <span class=
"md-nav__icon md-icon"></span>
962 <ul class=
"md-nav__list" data-md-scrollfix
>
968 <li class=
"md-nav__item">
969 <a href=
"../../package/pip/" class=
"md-nav__link">
980 <li class=
"md-nav__item">
981 <a href=
"../../package/pip/acl-option/" class=
"md-nav__link">
992 <li class=
"md-nav__item">
993 <a href=
"../../package/pip/acp-menu/" class=
"md-nav__link">
1004 <li class=
"md-nav__item">
1005 <a href=
"../../package/pip/acp-search-provider/" class=
"md-nav__link">
1016 <li class=
"md-nav__item">
1017 <a href=
"../../package/pip/acp-template/" class=
"md-nav__link">
1028 <li class=
"md-nav__item">
1029 <a href=
"../../package/pip/bbcode/" class=
"md-nav__link">
1040 <li class=
"md-nav__item">
1041 <a href=
"../../package/pip/box/" class=
"md-nav__link">
1052 <li class=
"md-nav__item">
1053 <a href=
"../../package/pip/clipboard-action/" class=
"md-nav__link">
1064 <li class=
"md-nav__item">
1065 <a href=
"../../package/pip/core-object/" class=
"md-nav__link">
1076 <li class=
"md-nav__item">
1077 <a href=
"../../package/pip/cronjob/" class=
"md-nav__link">
1088 <li class=
"md-nav__item">
1089 <a href=
"../../package/pip/event-listener/" class=
"md-nav__link">
1100 <li class=
"md-nav__item">
1101 <a href=
"../../package/pip/file/" class=
"md-nav__link">
1112 <li class=
"md-nav__item">
1113 <a href=
"../../package/pip/language/" class=
"md-nav__link">
1124 <li class=
"md-nav__item">
1125 <a href=
"../../package/pip/media-provider/" class=
"md-nav__link">
1136 <li class=
"md-nav__item">
1137 <a href=
"../../package/pip/menu/" class=
"md-nav__link">
1148 <li class=
"md-nav__item">
1149 <a href=
"../../package/pip/menu-item/" class=
"md-nav__link">
1160 <li class=
"md-nav__item">
1161 <a href=
"../../package/pip/object-type/" class=
"md-nav__link">
1172 <li class=
"md-nav__item">
1173 <a href=
"../../package/pip/object-type-definition/" class=
"md-nav__link">
1174 objectTypeDefinition
1184 <li class=
"md-nav__item">
1185 <a href=
"../../package/pip/option/" class=
"md-nav__link">
1196 <li class=
"md-nav__item">
1197 <a href=
"../../package/pip/page/" class=
"md-nav__link">
1208 <li class=
"md-nav__item">
1209 <a href=
"../../package/pip/pip/" class=
"md-nav__link">
1220 <li class=
"md-nav__item">
1221 <a href=
"../../package/pip/script/" class=
"md-nav__link">
1232 <li class=
"md-nav__item">
1233 <a href=
"../../package/pip/smiley/" class=
"md-nav__link">
1244 <li class=
"md-nav__item">
1245 <a href=
"../../package/pip/sql/" class=
"md-nav__link">
1256 <li class=
"md-nav__item">
1257 <a href=
"../../package/pip/style/" class=
"md-nav__link">
1268 <li class=
"md-nav__item">
1269 <a href=
"../../package/pip/template/" class=
"md-nav__link">
1280 <li class=
"md-nav__item">
1281 <a href=
"../../package/pip/template-listener/" class=
"md-nav__link">
1292 <li class=
"md-nav__item">
1293 <a href=
"../../package/pip/user-group-option/" class=
"md-nav__link">
1304 <li class=
"md-nav__item">
1305 <a href=
"../../package/pip/user-menu/" class=
"md-nav__link">
1316 <li class=
"md-nav__item">
1317 <a href=
"../../package/pip/user-notification-event/" class=
"md-nav__link">
1318 userNotificationEvent
1328 <li class=
"md-nav__item">
1329 <a href=
"../../package/pip/user-option/" class=
"md-nav__link">
1340 <li class=
"md-nav__item">
1341 <a href=
"../../package/pip/user-profile-menu/" class=
"md-nav__link">
1358 <li class=
"md-nav__item">
1359 <a href=
"../../package/database-php-api/" class=
"md-nav__link">
1380 <li class=
"md-nav__item md-nav__item--nested">
1383 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6" type=
"checkbox" id=
"__nav_6" >
1385 <label class=
"md-nav__link" for=
"__nav_6">
1387 <span class=
"md-nav__icon md-icon"></span>
1389 <nav class=
"md-nav" aria-label=
"Migration" data-md-level=
"1">
1390 <label class=
"md-nav__title" for=
"__nav_6">
1391 <span class=
"md-nav__icon md-icon"></span>
1394 <ul class=
"md-nav__list" data-md-scrollfix
>
1401 <li class=
"md-nav__item md-nav__item--nested">
1404 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_1" type=
"checkbox" id=
"__nav_6_1" >
1406 <label class=
"md-nav__link" for=
"__nav_6_1">
1407 Migrating from WSC
5.3
1408 <span class=
"md-nav__icon md-icon"></span>
1410 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.3" data-md-level=
"2">
1411 <label class=
"md-nav__title" for=
"__nav_6_1">
1412 <span class=
"md-nav__icon md-icon"></span>
1413 Migrating from WSC
5.3
1415 <ul class=
"md-nav__list" data-md-scrollfix
>
1421 <li class=
"md-nav__item">
1422 <a href=
"../../migration/wsc53/php/" class=
"md-nav__link">
1433 <li class=
"md-nav__item">
1434 <a href=
"../../migration/wsc53/session/" class=
"md-nav__link">
1435 Session Handling and Authentication
1445 <li class=
"md-nav__item">
1446 <a href=
"../../migration/wsc53/javascript/" class=
"md-nav__link">
1457 <li class=
"md-nav__item">
1458 <a href=
"../../migration/wsc53/templates/" class=
"md-nav__link">
1469 <li class=
"md-nav__item">
1470 <a href=
"../../migration/wsc53/libraries/" class=
"md-nav__link">
1471 Third Party Libraries
1488 <li class=
"md-nav__item md-nav__item--nested">
1491 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_2" type=
"checkbox" id=
"__nav_6_2" >
1493 <label class=
"md-nav__link" for=
"__nav_6_2">
1494 Migrating from WSC
5.2
1495 <span class=
"md-nav__icon md-icon"></span>
1497 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.2" data-md-level=
"2">
1498 <label class=
"md-nav__title" for=
"__nav_6_2">
1499 <span class=
"md-nav__icon md-icon"></span>
1500 Migrating from WSC
5.2
1502 <ul class=
"md-nav__list" data-md-scrollfix
>
1508 <li class=
"md-nav__item">
1509 <a href=
"../../migration/wsc52/php/" class=
"md-nav__link">
1520 <li class=
"md-nav__item">
1521 <a href=
"../../migration/wsc52/templates/" class=
"md-nav__link">
1522 Templates and Languages
1532 <li class=
"md-nav__item">
1533 <a href=
"../../migration/wsc52/libraries/" class=
"md-nav__link">
1534 Third Party Libraries
1551 <li class=
"md-nav__item md-nav__item--nested">
1554 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_3" type=
"checkbox" id=
"__nav_6_3" >
1556 <label class=
"md-nav__link" for=
"__nav_6_3">
1557 Migrating from WSC
3.1
1558 <span class=
"md-nav__icon md-icon"></span>
1560 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.1" data-md-level=
"2">
1561 <label class=
"md-nav__title" for=
"__nav_6_3">
1562 <span class=
"md-nav__icon md-icon"></span>
1563 Migrating from WSC
3.1
1565 <ul class=
"md-nav__list" data-md-scrollfix
>
1571 <li class=
"md-nav__item">
1572 <a href=
"../../migration/wsc31/php/" class=
"md-nav__link">
1590 <li class=
"md-nav__item md-nav__item--nested">
1593 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_4" type=
"checkbox" id=
"__nav_6_4" >
1595 <label class=
"md-nav__link" for=
"__nav_6_4">
1596 Migrating from WSC
3.0
1597 <span class=
"md-nav__icon md-icon"></span>
1599 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.0" data-md-level=
"2">
1600 <label class=
"md-nav__title" for=
"__nav_6_4">
1601 <span class=
"md-nav__icon md-icon"></span>
1602 Migrating from WSC
3.0
1604 <ul class=
"md-nav__list" data-md-scrollfix
>
1610 <li class=
"md-nav__item">
1611 <a href=
"../../migration/wsc30/php/" class=
"md-nav__link">
1622 <li class=
"md-nav__item">
1623 <a href=
"../../migration/wsc30/javascript/" class=
"md-nav__link">
1634 <li class=
"md-nav__item">
1635 <a href=
"../../migration/wsc30/templates/" class=
"md-nav__link">
1646 <li class=
"md-nav__item">
1647 <a href=
"../../migration/wsc30/css/" class=
"md-nav__link">
1658 <li class=
"md-nav__item">
1659 <a href=
"../../migration/wsc30/package/" class=
"md-nav__link">
1677 <li class=
"md-nav__item md-nav__item--nested">
1680 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_5" type=
"checkbox" id=
"__nav_6_5" >
1682 <label class=
"md-nav__link" for=
"__nav_6_5">
1683 Migrating from WCF
2.1
1684 <span class=
"md-nav__icon md-icon"></span>
1686 <nav class=
"md-nav" aria-label=
"Migrating from WCF 2.1" data-md-level=
"2">
1687 <label class=
"md-nav__title" for=
"__nav_6_5">
1688 <span class=
"md-nav__icon md-icon"></span>
1689 Migrating from WCF
2.1
1691 <ul class=
"md-nav__list" data-md-scrollfix
>
1697 <li class=
"md-nav__item">
1698 <a href=
"../../migration/wcf21/php/" class=
"md-nav__link">
1709 <li class=
"md-nav__item">
1710 <a href=
"../../migration/wcf21/templates/" class=
"md-nav__link">
1721 <li class=
"md-nav__item">
1722 <a href=
"../../migration/wcf21/css/" class=
"md-nav__link">
1733 <li class=
"md-nav__item">
1734 <a href=
"../../migration/wcf21/package/" class=
"md-nav__link">
1761 <li class=
"md-nav__item md-nav__item--nested">
1764 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7" type=
"checkbox" id=
"__nav_7" >
1766 <label class=
"md-nav__link" for=
"__nav_7">
1768 <span class=
"md-nav__icon md-icon"></span>
1770 <nav class=
"md-nav" aria-label=
"Tutorials" data-md-level=
"1">
1771 <label class=
"md-nav__title" for=
"__nav_7">
1772 <span class=
"md-nav__icon md-icon"></span>
1775 <ul class=
"md-nav__list" data-md-scrollfix
>
1782 <li class=
"md-nav__item md-nav__item--nested">
1785 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7_1" type=
"checkbox" id=
"__nav_7_1" >
1787 <label class=
"md-nav__link" for=
"__nav_7_1">
1789 <span class=
"md-nav__icon md-icon"></span>
1791 <nav class=
"md-nav" aria-label=
"Tutorial Series" data-md-level=
"2">
1792 <label class=
"md-nav__title" for=
"__nav_7_1">
1793 <span class=
"md-nav__icon md-icon"></span>
1796 <ul class=
"md-nav__list" data-md-scrollfix
>
1802 <li class=
"md-nav__item">
1803 <a href=
"../../tutorial/series/overview/" class=
"md-nav__link">
1814 <li class=
"md-nav__item">
1815 <a href=
"../../tutorial/series/part_1/" class=
"md-nav__link">
1826 <li class=
"md-nav__item">
1827 <a href=
"../../tutorial/series/part_2/" class=
"md-nav__link">
1838 <li class=
"md-nav__item">
1839 <a href=
"../../tutorial/series/part_3/" class=
"md-nav__link">
1866 <div class=
"md-sidebar md-sidebar--secondary" data-md-component=
"sidebar" data-md-type=
"toc" >
1867 <div class=
"md-sidebar__scrollwrap">
1868 <div class=
"md-sidebar__inner">
1870 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
1876 <label class=
"md-nav__title" for=
"__toc">
1877 <span class=
"md-nav__icon md-icon"></span>
1880 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
1882 <li class=
"md-nav__item">
1883 <a href=
"#the-preparedstatement-object" class=
"md-nav__link">
1884 The PreparedStatement Object
1887 <nav class=
"md-nav" aria-label=
"The PreparedStatement Object">
1888 <ul class=
"md-nav__list">
1890 <li class=
"md-nav__item">
1891 <a href=
"#query-parameters" class=
"md-nav__link">
1897 <li class=
"md-nav__item">
1898 <a href=
"#fetching-a-single-result" class=
"md-nav__link">
1899 Fetching a Single Result
1904 <li class=
"md-nav__item">
1905 <a href=
"#fetch-by-column" class=
"md-nav__link">
1911 <li class=
"md-nav__item">
1912 <a href=
"#fetching-all-results" class=
"md-nav__link">
1913 Fetching All Results
1923 <li class=
"md-nav__item">
1924 <a href=
"#building-complex-conditions" class=
"md-nav__link">
1925 Building Complex Conditions
1930 <li class=
"md-nav__item">
1931 <a href=
"#insert-or-update-in-bulk" class=
"md-nav__link">
1932 INSERT or UPDATE in Bulk
1945 <div class=
"md-content" data-md-component=
"content">
1946 <article class=
"md-content__inner md-typeset">
1949 <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">
1950 <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>
1954 <h1 id=
"database-access">Database Access
<a class=
"headerlink" href=
"#database-access" title=
"Permanent link">#
</a></h1>
1955 <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>
1956 <h2 id=
"the-preparedstatement-object">The PreparedStatement Object
<a class=
"headerlink" href=
"#the-preparedstatement-object" title=
"Permanent link">#
</a></h2>
1957 <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>
1958 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
1959 <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>
1960 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
1961 <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>
1962 <span class=
"c1">// handle result
</span>
1963 <span class=
"p">}
</span>
1965 <h3 id=
"query-parameters">Query Parameters
<a class=
"headerlink" href=
"#query-parameters" title=
"Permanent link">#
</a></h3>
1966 <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>
1967 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
1968 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT *
</span>
1969 <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>
1970 <span class=
"s2"> WHERE exampleID = ?
</span>
1971 <span class=
"s2"> OR bar IN (?, ?, ?, ?, ?)
"</span><span class=
"p">;
</span>
1972 <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>
1973 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">([
</span>
1974 <span class=
"nv">$exampleID
</span><span class=
"p">,
</span>
1975 <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>
1976 <span class=
"p">]);
</span>
1977 <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>
1978 <span class=
"c1">// handle result
</span>
1979 <span class=
"p">}
</span>
1981 <h3 id=
"fetching-a-single-result">Fetching a Single Result
<a class=
"headerlink" href=
"#fetching-a-single-result" title=
"Permanent link">#
</a></h3>
1982 <div class=
"admonition danger">
1983 <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>
1985 <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>
1986 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
1987 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT *
</span>
1988 <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>
1989 <span class=
"s2"> WHERE exampleID = ?
"</span><span class=
"p">;
</span>
1990 <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>
1991 <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>
1992 <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>
1994 <p>There are two distinct differences when comparing with the example on query parameters above:
</p>
1996 <li>The method
<code>prepareStatement()
</code> receives a secondary parameter that will be appended to the query as
<code>LIMIT
1</code>.
</li>
1997 <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>
1999 <h3 id=
"fetch-by-column">Fetch by Column
<a class=
"headerlink" href=
"#fetch-by-column" title=
"Permanent link">#
</a></h3>
2000 <div class=
"admonition warning">
2001 <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>
2003 <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>
2004 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2005 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT bar
</span>
2006 <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>
2007 <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>
2008 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
2009 <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>
2010 <span class=
"c1">// handle result
</span>
2011 <span class=
"p">}
</span>
2012 <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>
2014 <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>
2015 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2016 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT bar
</span>
2017 <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>
2018 <span class=
"s2"> WHERE exampleID = ?
"</span><span class=
"p">;
</span>
2019 <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>
2020 <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>
2021 <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>
2023 <h3 id=
"fetching-all-results">Fetching All Results
<a class=
"headerlink" href=
"#fetching-all-results" title=
"Permanent link">#
</a></h3>
2024 <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>
2025 <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>
2026 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2027 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT *
</span>
2028 <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>
2029 <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>
2030 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
2031 <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>
2033 <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>
2034 <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>
2035 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2036 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT exampleID
</span>
2037 <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>
2038 <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>
2039 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
2040 <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>
2042 <p>As a result, you get an array with all
<code>exampleID
</code> values.
</p>
2043 <p>The
<code>PreparedStatement
</code> class adds an additional methods that covers another common use case in our code:
2044 Fetching two columns and using the first column's value as the array key and the second column's value as the array value.
2045 This case is covered by
<code>PreparedStatement::fetchMap()
</code>:
</p>
2046 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2047 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT exampleID, userID
</span>
2048 <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>
2049 <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>
2050 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
2051 <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>
2053 <p><code>$map
</code> is a one-dimensional array where each
<code>exampleID
</code> value maps to the corresponding
<code>userID
</code> value.
</p>
2054 <div class=
"admonition warning">
2055 <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>
2057 <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>
2058 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2059 <span class=
"nv">$sql
</span> <span class=
"o">=
</span> <span class=
"s2">"SELECT exampleID, userID
</span>
2060 <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>
2061 <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>
2062 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">();
</span>
2063 <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>
2065 <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>
2066 <h2 id=
"building-complex-conditions">Building Complex Conditions
<a class=
"headerlink" href=
"#building-complex-conditions" title=
"Permanent link">#
</a></h2>
2067 <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>
2068 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2069 <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>
2070 <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>
2071 <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>
2072 <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>
2073 <span class=
"p">}
</span>
2075 <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>
2076 <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>
2077 <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>
2078 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2079 <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>
2081 <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>
2082 <span class=
"s2"> (bar)
</span>
2083 <span class=
"s2"> VALUES (?)
"</span><span class=
"p">;
</span>
2084 <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>
2086 <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>
2087 <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>
2088 <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>
2089 <span class=
"p">}
</span>
2090 <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>
2092 <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>
2093 <div class=
"highlight"><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
2094 <span class=
"nv">$data
</span> <span class=
"o">=
</span> <span class=
"p">[
</span>
2095 <span class=
"mi">1</span> <span class=
"o">=
></span> <span class=
"s1">'abc
'</span><span class=
"p">,
</span>
2096 <span class=
"mi">3</span> <span class=
"o">=
></span> <span class=
"s1">'def
'</span><span class=
"p">,
</span>
2097 <span class=
"mi">4</span> <span class=
"o">=
></span> <span class=
"s1">'ghi
'</span>
2098 <span class=
"p">];
</span>
2100 <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>
2101 <span class=
"s2"> SET bar = ?
</span>
2102 <span class=
"s2"> WHERE exampleID = ?
"</span><span class=
"p">;
</span>
2103 <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>
2105 <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>
2106 <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>
2107 <span class=
"nv">$statement
</span><span class=
"o">-
></span><span class=
"na">execute
</span><span class=
"p">([
</span>
2108 <span class=
"nv">$bar
</span><span class=
"p">,
</span>
2109 <span class=
"nv">$exampleID
</span>
2110 <span class=
"p">]);
</span>
2111 <span class=
"p">}
</span>
2112 <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>
2119 <div class=
"md-source-date">
2122 Last update:
2021-
01-
08
2140 <footer class=
"md-footer">
2142 <nav class=
"md-footer__inner md-grid" aria-label=
"Footer">
2144 <a href=
"../database-objects/" class=
"md-footer__link md-footer__link--prev" rel=
"prev">
2145 <div class=
"md-footer__button md-icon">
2146 <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>
2148 <div class=
"md-footer__title">
2149 <div class=
"md-ellipsis">
2150 <span class=
"md-footer__direction">
2159 <a href=
"../exceptions/" class=
"md-footer__link md-footer__link--next" rel=
"next">
2160 <div class=
"md-footer__title">
2161 <div class=
"md-ellipsis">
2162 <span class=
"md-footer__direction">
2168 <div class=
"md-footer__button md-icon">
2169 <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>
2175 <div class=
"md-footer-meta md-typeset">
2176 <div class=
"md-footer-meta__inner md-grid">
2177 <div class=
"md-footer-copyright">
2179 <div class=
"md-footer-copyright__highlight">
2180 Copyright ©
2020 WoltLab GmbH
2184 <a href=
"https://squidfunk.github.io/mkdocs-material/" target=
"_blank" rel=
"noopener">
2189 <div class=
"md-footer-copyright">
2190 <a href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a>
2191 <a href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>
2198 <div class=
"md-dialog" data-md-component=
"dialog">
2199 <div class=
"md-dialog__inner md-typeset"></div>
2201 <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.fb4a9340.min.js",
"version": {
"provider":
"mike"}}
</script>
2204 <script src=
"../../assets/javascripts/bundle.5cf3e710.min.js"></script>