Merge #20131 - Fix #18579 - Export geometry and binary fields in all export types

Pull-request: #20131
Fixes: #18579
Signed-off-by: William Desportes <williamdes@wdes.fr>
This commit is contained in:
William Desportes 2026-02-21 15:13:18 +01:00
commit 757c804ea0
No known key found for this signature in database
GPG Key ID: 70684F4717D49A31
10 changed files with 208 additions and 11 deletions

View File

@ -17,6 +17,7 @@ use PhpMyAdmin\Properties\Options\Items\TextPropertyItem;
use PhpMyAdmin\Properties\Plugins\ExportPluginProperties;
use function __;
use function bin2hex;
use function mb_strtolower;
use function mb_substr;
use function preg_replace;
@ -220,6 +221,7 @@ class ExportCsv extends ExportPlugin
// Gets the data from the database
$result = $dbi->query($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$fields_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
// If required, get fields name at the first line
if (isset($GLOBALS['csv_columns']) && $GLOBALS['csv_columns']) {
@ -254,6 +256,10 @@ class ExportCsv extends ExportPlugin
if (! isset($row[$j])) {
$schema_insert .= $GLOBALS[$what . '_null'];
} elseif ($row[$j] == '0' || $row[$j] != '') {
if ($fieldsMeta[$j]->isMappedTypeGeometry || $fieldsMeta[$j]->isBinary) {
$row[$j] = '0x' . bin2hex($row[$j]);
}
// always enclose fields
if ($what === 'excel') {
$row[$j] = preg_replace("/\015(\012)?/", "\012", $row[$j]);

View File

@ -19,6 +19,7 @@ use PhpMyAdmin\Util;
use PhpMyAdmin\Version;
use function __;
use function bin2hex;
use function count;
use function in_array;
use function mb_strpos;
@ -298,6 +299,7 @@ class ExportLatex extends ExportPlugin
$result = $dbi->tryQuery($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$columns_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
$columns = [];
$columns_alias = [];
foreach ($result->getFieldNames() as $i => $col_as) {
@ -398,9 +400,15 @@ class ExportLatex extends ExportPlugin
// print each row
for ($i = 0; $i < $columns_cnt; $i++) {
if ($record[$columns[$i]] !== null && isset($record[$columns[$i]])) {
$column_value = self::texEscape(
stripslashes($record[$columns[$i]])
);
if ($fieldsMeta[$i]->isMappedTypeGeometry || $fieldsMeta[$i]->isBinary) {
$column_value = self::texEscape(
'0x' . bin2hex($record[$columns[$i]])
);
} else {
$column_value = self::texEscape(
stripslashes($record[$columns[$i]])
);
}
} else {
$column_value = $GLOBALS['latex_null'];
}

View File

@ -19,6 +19,7 @@ use PhpMyAdmin\Util;
use function __;
use function array_values;
use function bin2hex;
use function count;
use function htmlspecialchars;
use function str_repeat;
@ -317,12 +318,19 @@ class ExportMediawiki extends ExportPlugin
// Get the table data from the database
$result = $dbi->query($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$fields_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
while ($row = $result->fetchRow()) {
$output .= '|-' . $this->exportCRLF();
// Use '|' for separating table columns
for ($i = 0; $i < $fields_cnt; ++$i) {
if (! isset($row[$i])) {
$row[$i] = 'NULL';
} elseif ($fieldsMeta[$i]->isMappedTypeGeometry || $fieldsMeta[$i]->isBinary) {
$row[$i] = '0x' . bin2hex($row[$i]);
}
$output .= ' | ' . $row[$i] . '' . $this->exportCRLF();
}
}

View File

@ -17,6 +17,7 @@ use PhpMyAdmin\Util;
use PhpMyAdmin\Version;
use function __;
use function bin2hex;
use function preg_match;
use function preg_replace;
use function stripslashes;
@ -169,6 +170,7 @@ class ExportPhparray extends ExportPlugin
$result = $dbi->query($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$columns_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
$columns = [];
foreach ($result->getFieldNames() as $i => $col_as) {
if (! empty($aliases[$db]['tables'][$table]['columns'][$col_as])) {
@ -216,6 +218,10 @@ class ExportPhparray extends ExportPlugin
}
for ($i = 0; $i < $columns_cnt; $i++) {
if ($record[$i] !== null && ($fieldsMeta[$i]->isMappedTypeGeometry || $fieldsMeta[$i]->isBinary)) {
$record[$i] = '0x' . bin2hex($record[$i]);
}
$buffer .= var_export($columns[$i], true)
. ' => ' . var_export($record[$i], true)
. ($i + 1 >= $columns_cnt ? '' : ',');

View File

@ -18,6 +18,7 @@ use PhpMyAdmin\Properties\Plugins\ExportPluginProperties;
use PhpMyAdmin\Util;
use function __;
use function bin2hex;
use function htmlspecialchars;
use function in_array;
use function str_replace;
@ -185,6 +186,7 @@ class ExportTexytext extends ExportPlugin
// Gets the data from the database
$result = $dbi->query($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$fields_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
// If required, get fields name at the first line
if (isset($GLOBALS[$what . '_columns'])) {
@ -212,6 +214,10 @@ class ExportTexytext extends ExportPlugin
$value = $GLOBALS[$what . '_null'];
} elseif ($row[$j] == '0' || $row[$j] != '') {
$value = $row[$j];
if ($fieldsMeta[$j]->isMappedTypeGeometry || $fieldsMeta[$j]->isBinary) {
$value = '0x' . bin2hex($value);
}
} else {
$value = ' ';
}

View File

@ -15,6 +15,7 @@ use PhpMyAdmin\Util;
use PhpMyAdmin\Version;
use function __;
use function bin2hex;
use function count;
use function htmlspecialchars;
use function is_array;
@ -463,6 +464,7 @@ class ExportXml extends ExportPlugin
$result = $dbi->query($sqlQuery, DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED);
$columns_cnt = $result->numFields();
$fieldsMeta = $dbi->getFieldsMeta($result);
$columns = [];
foreach ($result->getFieldNames() as $column) {
$columns[] = stripslashes($column);
@ -487,6 +489,8 @@ class ExportXml extends ExportPlugin
// the XML structure
if (! isset($record[$i])) {
$record[$i] = 'NULL';
} elseif ($fieldsMeta[$i]->isMappedTypeGeometry || $fieldsMeta[$i]->isBinary) {
$record[$i] = '0x' . bin2hex($record[$i]);
}
$buffer .= ' <column name="'

View File

@ -17,6 +17,7 @@ use PhpMyAdmin\Properties\Plugins\ExportPluginProperties;
use function __;
use function array_key_exists;
use function bin2hex;
use function is_numeric;
use function str_replace;
use function stripslashes;
@ -181,6 +182,10 @@ class ExportYaml extends ExportPlugin
continue;
}
if ($fieldsMeta[$i]->isMappedTypeGeometry || $fieldsMeta[$i]->isBinary) {
$record[$i] = '0x' . bin2hex($record[$i]);
}
$record[$i] = str_replace(
[
'\\',

View File

@ -267,6 +267,16 @@ class Pdf extends PdfLib
$this->page = $currpage;
$this->setXY($l, $h);
if ($this->tablewidths[$col] > 0) {
if ($txt !== null) {
if ($this->fields[$col]->isType(FieldMetadata::TYPE_GEOMETRY)) {
$txt = '[GEOMETRY]';
}
if ($this->fields[$col]->isType(FieldMetadata::TYPE_BLOB) || $this->fields[$col]->isBinary()) {
$txt = '[BLOB]';
}
}
$this->MultiCell($this->tablewidths[$col], $lineheight, $txt ?? 'NULL', 0, $this->colAlign[$col]);
$l += $this->tablewidths[$col];
}
@ -770,7 +780,7 @@ class Pdf extends PdfLib
}
/**
* @todo do not deactivate completely the display
* do not deactivate completely the display
* but show the field's name and [BLOB]
*/
if ($this->fields[$i]->isBinary()) {

View File

@ -25577,7 +25577,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 1
count: 3
path: libraries/classes/Plugins/Export/ExportCsv.php
-
@ -25590,6 +25590,16 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Cannot call method fetchRow\\(\\) on mixed\\.$#"
count: 1
@ -25600,6 +25610,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Cannot call method numFields\\(\\) on mixed\\.$#"
count: 1
@ -25625,6 +25640,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportCsv.php
-
message: "#^Parameter \\#1 \\$search of function str_replace expects array\\|string, mixed given\\.$#"
count: 4
@ -25960,6 +25980,11 @@ parameters:
count: 2
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 2
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot access offset mixed on mixed\\.$#"
count: 3
@ -25970,6 +25995,16 @@ parameters:
count: 2
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot call method fetchAssoc\\(\\) on mixed\\.$#"
count: 1
@ -25985,6 +26020,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Cannot call method getTableIndexes\\(\\) on mixed\\.$#"
count: 1
@ -26030,6 +26070,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportLatex.php
-
message: "#^Parameter \\#1 \\$str of function stripslashes expects string, mixed given\\.$#"
count: 2
@ -26092,7 +26137,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 1
count: 4
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
@ -26105,6 +26150,16 @@ parameters:
count: 2
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Cannot call method fetchRow\\(\\) on mixed\\.$#"
count: 1
@ -26120,6 +26175,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Cannot call method numFields\\(\\) on mixed\\.$#"
count: 1
@ -26150,6 +26210,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportMediawiki.php
-
message: "#^Parameter \\#1 \\$identifier of static method PhpMyAdmin\\\\Util\\:\\:backquote\\(\\) expects string\\|Stringable\\|null, mixed given\\.$#"
count: 2
@ -26492,7 +26557,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 1
count: 4
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
@ -26505,6 +26570,16 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Cannot call method fetchRow\\(\\) on mixed\\.$#"
count: 1
@ -26515,6 +26590,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Cannot call method numFields\\(\\) on mixed\\.$#"
count: 1
@ -26545,6 +26625,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportPhparray.php
-
message: "#^Parameter \\#1 \\$identifier of static method PhpMyAdmin\\\\Util\\:\\:backquote\\(\\) expects string\\|Stringable\\|null, mixed given\\.$#"
count: 2
@ -27287,7 +27372,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 1
count: 3
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
@ -27300,6 +27385,16 @@ parameters:
count: 3
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Cannot call method fetchRow\\(\\) on mixed\\.$#"
count: 1
@ -27315,6 +27410,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Cannot call method getTableIndexes\\(\\) on mixed\\.$#"
count: 2
@ -27385,6 +27485,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportTexytext.php
-
message: "#^Parameter \\#1 \\$str of function stripslashes expects string, mixed given\\.$#"
count: 1
@ -27477,7 +27582,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 2
count: 4
path: libraries/classes/Plugins/Export/ExportXml.php
-
@ -27490,6 +27595,16 @@ parameters:
count: 2
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Cannot call method escapeString\\(\\) on mixed\\.$#"
count: 2
@ -27515,6 +27630,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Cannot call method getFieldsMeta\\(\\) on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Cannot call method getProceduresOrFunctions\\(\\) on mixed\\.$#"
count: 1
@ -27595,6 +27715,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportXml.php
-
message: "#^Parameter \\#1 \\$db of method PhpMyAdmin\\\\Plugins\\\\Export\\\\ExportXml\\:\\:exportDefinitions\\(\\) expects string, mixed given\\.$#"
count: 1
@ -27662,7 +27787,7 @@ parameters:
-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
count: 1
count: 3
path: libraries/classes/Plugins/Export/ExportYaml.php
-
@ -27675,6 +27800,16 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportYaml.php
-
message: "#^Cannot access property \\$isBinary on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportYaml.php
-
message: "#^Cannot access property \\$isMappedTypeGeometry on mixed\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportYaml.php
-
message: "#^Cannot access property \\$name on mixed\\.$#"
count: 1
@ -27720,6 +27855,11 @@ parameters:
count: 1
path: libraries/classes/Plugins/Export/ExportYaml.php
-
message: "#^Parameter \\#1 \\$data of function bin2hex expects string, mixed given\\.$#"
count: 1
path: libraries/classes/Plugins/Export/ExportYaml.php
-
message: "#^Parameter \\#1 \\$str of function stripslashes expects string, mixed given\\.$#"
count: 1

View File

@ -9626,7 +9626,8 @@
<PossiblyFalseReference occurrences="1">
<code>numFields</code>
</PossiblyFalseReference>
<PossiblyNullArgument occurrences="1">
<PossiblyNullArgument occurrences="2">
<code>$record[$columns[$i]]</code>
<code>$record[$columns[$i]]</code>
</PossiblyNullArgument>
</file>
@ -10120,6 +10121,9 @@
<MixedAssignment occurrences="1">
<code>$col_as</code>
</MixedAssignment>
<PossiblyNullArgument occurrences="1">
<code>$record[$i]</code>
</PossiblyNullArgument>
</file>
<file src="libraries/classes/Plugins/Export/Helpers/Pdf.php">
<MixedArgument occurrences="79">