Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
functions_database_helper.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 /**
015 * @ignore
016 */
017 if (!defined('IN_PHPBB'))
018 {
019 exit;
020 }
021
022 /**
023 * Updates rows in given table from a set of values to a new value.
024 * If this results in rows violating uniqueness constraints, the duplicate
025 * rows are eliminated.
026 *
027 * The only supported table is bookmarks.
028 *
029 * @param \phpbb\db\driver\driver_interface $db Database object
030 * @param string $table Table on which to perform the update
031 * @param string $column Column whose values to change
032 * @param array $from_values An array of values that should be changed
033 * @param int $to_value The new value
034 * @return null
035 */
036 function phpbb_update_rows_avoiding_duplicates(\phpbb\db\driver\driver_interface $db, $table, $column, $from_values, $to_value)
037 {
038 $sql = "SELECT $column, user_id
039 FROM $table
040 WHERE " . $db->sql_in_set($column, $from_values);
041 $result = $db->sql_query($sql);
042
043 $old_user_ids = array();
044 while ($row = $db->sql_fetchrow($result))
045 {
046 $old_user_ids[$row[$column]][] = (int) $row['user_id'];
047 }
048 $db->sql_freeresult($result);
049
050 $sql = "SELECT $column, user_id
051 FROM $table
052 WHERE $column = " . (int) $to_value;
053 $result = $db->sql_query($sql);
054
055 $new_user_ids = array();
056 while ($row = $db->sql_fetchrow($result))
057 {
058 $new_user_ids[$row[$column]][] = (int) $row['user_id'];
059 }
060 $db->sql_freeresult($result);
061
062 $queries = array();
063 foreach ($from_values as $from_value)
064 {
065 if (!isset($old_user_ids[$from_value]))
066 {
067 continue;
068 }
069 if (empty($new_user_ids))
070 {
071 $sql = "UPDATE $table
072 SET $column = " . (int) $to_value . "
073 WHERE $column = '" . $db->sql_escape($from_value) . "'";
074 $queries[] = $sql;
075 }
076 else
077 {
078 $different_user_ids = array_diff($old_user_ids[$from_value], $new_user_ids[$to_value]);
079 if (!empty($different_user_ids))
080 {
081 $sql = "UPDATE $table
082 SET $column = " . (int) $to_value . "
083 WHERE $column = '" . $db->sql_escape($from_value) . "'
084 AND " . $db->sql_in_set('user_id', $different_user_ids);
085 $queries[] = $sql;
086 }
087 }
088 }
089
090 if (!empty($queries))
091 {
092 $db->sql_transaction('begin');
093
094 foreach ($queries as $sql)
095 {
096 $db->sql_query($sql);
097 }
098
099 $sql = "DELETE FROM $table
100 WHERE " . $db->sql_in_set($column, $from_values);
101 $db->sql_query($sql);
102
103 $db->sql_transaction('commit');
104 }
105 }
106
107 /**
108 * Updates rows in given table from a set of values to a new value.
109 * If this results in rows violating uniqueness constraints, the duplicate
110 * rows are merged respecting notify_status (0 takes precedence over 1).
111 *
112 * The only supported table is topics_watch.
113 *
114 * @param \phpbb\db\driver\driver_interface $db Database object
115 * @param string $table Table on which to perform the update
116 * @param string $column Column whose values to change
117 * @param array $from_values An array of values that should be changed
118 * @param int $to_value The new value
119 * @return null
120 */
121 function phpbb_update_rows_avoiding_duplicates_notify_status(\phpbb\db\driver\driver_interface $db, $table, $column, $from_values, $to_value)
122 {
123 $sql = "SELECT $column, user_id, notify_status
124 FROM $table
125 WHERE " . $db->sql_in_set($column, $from_values);
126 $result = $db->sql_query($sql);
127
128 $old_user_ids = array();
129 while ($row = $db->sql_fetchrow($result))
130 {
131 $old_user_ids[(int) $row['notify_status']][$row[$column]][] = (int) $row['user_id'];
132 }
133 $db->sql_freeresult($result);
134
135 $sql = "SELECT $column, user_id
136 FROM $table
137 WHERE $column = " . (int) $to_value;
138 $result = $db->sql_query($sql);
139
140 $new_user_ids = array();
141 while ($row = $db->sql_fetchrow($result))
142 {
143 $new_user_ids[$row[$column]][] = (int) $row['user_id'];
144 }
145 $db->sql_freeresult($result);
146
147 $queries = array();
148 $extra_updates = array(
149 0 => 'notify_status = 0',
150 1 => '',
151 );
152 foreach ($from_values as $from_value)
153 {
154 foreach ($extra_updates as $notify_status => $extra_update)
155 {
156 if (!isset($old_user_ids[$notify_status][$from_value]))
157 {
158 continue;
159 }
160 if (empty($new_user_ids))
161 {
162 $sql = "UPDATE $table
163 SET $column = " . (int) $to_value . "
164 WHERE $column = '" . $db->sql_escape($from_value) . "'";
165 $queries[] = $sql;
166 }
167 else
168 {
169 $different_user_ids = array_diff($old_user_ids[$notify_status][$from_value], $new_user_ids[$to_value]);
170 if (!empty($different_user_ids))
171 {
172 $sql = "UPDATE $table
173 SET $column = " . (int) $to_value . "
174 WHERE $column = '" . $db->sql_escape($from_value) . "'
175 AND " . $db->sql_in_set('user_id', $different_user_ids);
176 $queries[] = $sql;
177 }
178
179 if ($extra_update)
180 {
181 $same_user_ids = array_diff($old_user_ids[$notify_status][$from_value], $different_user_ids);
182 if (!empty($same_user_ids))
183 {
184 $sql = "UPDATE $table
185 SET $extra_update
186 WHERE $column = '" . (int) $to_value . "'
187 AND " . $db->sql_in_set('user_id', $same_user_ids);
188 $queries[] = $sql;
189 }
190 }
191 }
192 }
193 }
194
195 if (!empty($queries))
196 {
197 $db->sql_transaction('begin');
198
199 foreach ($queries as $sql)
200 {
201 $db->sql_query($sql);
202 }
203
204 $sql = "DELETE FROM $table
205 WHERE " . $db->sql_in_set($column, $from_values);
206 $db->sql_query($sql);
207
208 $db->sql_transaction('commit');
209 }
210 }
211