2222use PhpMyAdmin \Utils \ForeignKey ;
2323
2424use function __ ;
25- use function array_column ;
2625use function array_key_exists ;
2726use function array_keys ;
2827use function mb_strtoupper ;
@@ -168,10 +167,8 @@ public function __invoke(ServerRequest $request): void
168167 $ columns = $ this ->dbi ->getColumns (Current::$ database , Current::$ table );
169168
170169 $ columnArray = [];
171- $ columnHashArray = [];
172170 $ columnArray ['' ] = '' ;
173171 foreach ($ columns as $ column ) {
174- $ columnHashArray [$ column ->field ] = md5 ($ column ->field );
175172 if (strtoupper ($ storageEngine ) !== 'INNODB ' && $ column ->key === '' ) {
176173 continue ;
177174 }
@@ -191,17 +188,19 @@ public function __invoke(ServerRequest $request): void
191188 $ i = 0 ;
192189
193190 foreach ($ existrelForeign as $ oneKey ) {
191+ /** @var string $foreignDb */
194192 $ foreignDb = $ oneKey ['ref_db_name ' ] ?? Current::$ database ;
195193 $ foreignTable = false ;
196- if ($ foreignDb ) {
194+ if ($ foreignDb !== '' ) {
195+ /** @var string|false $foreignTable */
197196 $ foreignTable = $ oneKey ['ref_table_name ' ] ?? false ;
198197 $ tables = $ this ->relation ->getTables ($ foreignDb , $ storageEngine );
199198 } else {
200199 $ tables = $ this ->relation ->getTables (Current::$ database , $ storageEngine );
201200 }
202201
203202 $ uniqueColumns = [];
204- if ($ foreignDb && $ foreignTable ) {
203+ if ($ foreignDb !== '' && $ foreignTable !== false && $ foreignTable !== '' ) {
205204 $ tableObject = new Table ($ foreignTable , $ foreignDb , $ this ->dbi );
206205 $ uniqueColumns = $ tableObject ->getUniqueColumns (false , false );
207206 }
@@ -241,6 +240,57 @@ public function __invoke(ServerRequest $request): void
241240 'tables ' => $ tables ,
242241 ]);
243242
243+ $ internalRelationColumns = [];
244+ foreach ($ columns as $ column ) {
245+ // Use a md5 as array index to avoid having special characters in the name attribute
246+ // (see bug https://github.com/phpmyadmin/phpmyadmin/issues/8827)
247+ $ fieldHash = md5 ($ column ->field );
248+
249+ $ foreignTable = false ;
250+ $ foreignColumn = false ;
251+
252+ // Database dropdown
253+ if (isset ($ relations [$ column ->field ])) {
254+ /** @var string $foreignDb */
255+ $ foreignDb = $ relations [$ column ->field ]['foreign_db ' ];
256+ } else {
257+ $ foreignDb = Current::$ database ;
258+ }
259+
260+ // Table dropdown
261+ $ foreignTables = [];
262+ if ($ foreignDb !== '' ) {
263+ if (isset ($ relations [$ column ->field ])) {
264+ /** @var string $foreignTable */
265+ $ foreignTable = $ relations [$ column ->field ]['foreign_table ' ];
266+ }
267+
268+ $ foreignTables = $ this ->dbi ->getTables ($ foreignDb );
269+ }
270+
271+ // Column dropdown
272+ $ uniqueColumns = [];
273+ if ($ foreignDb !== '' && $ foreignTable !== false && $ foreignTable !== '' ) {
274+ if (isset ($ relations [$ column ->field ])) {
275+ /** @var string $foreignColumn */
276+ $ foreignColumn = $ relations [$ column ->field ]['foreign_field ' ];
277+ }
278+
279+ $ tableObject = new Table ($ foreignTable , $ foreignDb , $ this ->dbi );
280+ $ uniqueColumns = $ tableObject ->getUniqueColumns (false , false );
281+ }
282+
283+ $ internalRelationColumns [] = [
284+ 'field ' => $ column ->field ,
285+ 'field_hash ' => $ fieldHash ,
286+ 'foreign_db ' => $ foreignDb ,
287+ 'foreign_table ' => $ foreignTable ,
288+ 'foreign_column ' => $ foreignColumn ,
289+ 'tables ' => $ foreignTables ,
290+ 'unique_columns ' => $ uniqueColumns ,
291+ ];
292+ }
293+
244294 // common form
245295 $ this ->render ('table/relation/common_form ' , [
246296 'is_foreign_key_supported ' => ForeignKey::isSupported ($ storageEngine ),
@@ -251,12 +301,9 @@ public function __invoke(ServerRequest $request): void
251301 'existrel ' => $ relations ,
252302 'existrel_foreign ' => $ existrelForeign ,
253303 'options_array ' => $ options ,
254- 'column_array ' => $ columnArray ,
255- 'column_hash_array ' => $ columnHashArray ,
256- 'save_row ' => array_column ($ columns , 'field ' ),
304+ 'internal_relation_columns ' => $ internalRelationColumns ,
257305 'url_params ' => $ GLOBALS ['urlParams ' ],
258306 'databases ' => $ this ->dbi ->getDatabaseList (),
259- 'dbi ' => $ this ->dbi ,
260307 'default_sliders_state ' => $ config ->settings ['InitialSlidersState ' ],
261308 'route ' => $ request ->getRoute (),
262309 'display_field ' => $ this ->relation ->getDisplayField (Current::$ database , Current::$ table ),
0 commit comments