It seems that when passing an XML string through as a parameter to a column defined as "XML" an "illegal XML character" error is returned by PDO.
SQL Version: Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
PHP: 7.0.8-0ubuntu0.16.04.2
Using pdo_sqlsrv-4.0.6 from PECL libraries.
DB Structure:
CREATE TABLE TestTable
(
ID INT PRIMARY KEY NOT NULL IDENTITY,
XMLMessage XML
);
PHP:
$xml = "<ParentXMLTag>
<ChildTag01>TestValue01</ChildTag01>
<ChildTag02>TestValue01</ChildTag02>
<ChildTag03>TestValue01</ChildTag03>
<ChildTag04>TestValue01</ChildTag04>
<ChildTag05>TestValue01</ChildTag05>
<ChildTag06>TestValue01</ChildTag06>
<ChildTag07>TestValue01</ChildTag07>
<ChildTag08>TestValue01</ChildTag08>
<ChildTag09>TestValue01</ChildTag09>
<ChildTag10>TestValue01</ChildTag10>
<ChildTag11>TestValue01</ChildTag11>
<ChildTag12>TestValue01</ChildTag12>
<ChildTag13>TestValue01</ChildTag13>
<ChildTag14>TestValue01</ChildTag14>
<ChildTag15>TestValue01</ChildTag15>
<ChildTag16>TestValue01</ChildTag16>
<ChildTag17>TestValue01</ChildTag17>
<ChildTag18>TestValue01</ChildTag18>
<ChildTag19>TestValue01</ChildTag19>
<ChildTag20>TestValue01</ChildTag20>
<ChildTag21>TestValue01</ChildTag21>
<ChildTag22>TestValue01</ChildTag22>
<ChildTag23>TestValue01</ChildTag23>
<ChildTag24>TestValue01</ChildTag24>
<ChildTag25>TestValue01</ChildTag25>
<ChildTag26>TestValue01</ChildTag26>
<ChildTag27>TestValue01</ChildTag27>
<ChildTag28>TestValue01</ChildTag28>
<ChildTag29>TestValue01</ChildTag29>
<ChildTag30>TestValue01</ChildTag30>
</ParentXMLTag>";
try {
$conn = new PDO("sqlsrv:server=tcp:servername.corp,1433;Database=SchemaNameHere", "username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO TestTable (XMLMessage) VALUES (:msg)");
$stmt->bindValue(':msg', $xml);
$stmt->execute();
echo "Success";
}
catch (PDOException $ex) {
echo "Error: " . $ex->getMessage();
}
Results of above code:
Error: SQLSTATE[42000]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]XML parsing: line 32, character 16, illegal xml character
Forgot to mention, when the XML set is smaller (only up to and including <ChildTag09>), the insert is works.
@parite We are working on this issue, stay tuned for the next release
@parite we have fixed this issue. Downlaod the latest PECL packages to get the fix
sudo pecl install sqlsrv-4.0.7
sudo pecl install pdo_sqlsrv-4.0.7