-
Notifications
You must be signed in to change notification settings - Fork 375
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #262 from v-kigos/PHP-7.0-Linux
Test: Streaming with char encoding
- Loading branch information
Showing
5 changed files
with
267 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
--TEST-- | ||
Unicode XML message using bindValue() | ||
--SKIPIF-- | ||
--FILE-- | ||
<?php | ||
require_once("autonomous_setup.php"); | ||
|
||
// Connect | ||
$conn = new PDO("sqlsrv:server=$serverName;", $username, $password); | ||
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
|
||
// Create database | ||
$conn->query("CREATE DATABASE ". $dbName) ?: die(); | ||
|
||
// Create table | ||
$sql = "CREATE TABLE $tableName (ID INT PRIMARY KEY NOT NULL IDENTITY, XMLMessage XML)"; | ||
$stmt = $conn->query($sql); | ||
|
||
// XML samples | ||
$xml1 = '<?xml version="1.0" encoding="UTF-16"?> | ||
<PTag> | ||
<CTag01>APP_PoP_银河</CTag01> | ||
<CTag02>Το Παρίσι (γαλλικά: Paris, ΔΦΑ [paˈʁi]), γνωστό και ως η Πόλη του φωτός (Ville lumière), από τότε που εφοδιάστηκαν οι κύριες λεωφόροι του με φανούς γκαζιού το 1828, είναι η πρωτεύουσα της Γαλλίας και της περιφέρειας Ιλ ντε Φρανς (Île-de-France) και μία από τις ιστορικότερες πόλεις της Ευρώπης.</CTag02> | ||
</PTag>'; | ||
|
||
$xml2 = '<?xml version="1.0" encoding="utf-16"?> | ||
<PTag> | ||
<CTag01>NULL</CTag01> | ||
<CTag02></CTag02> | ||
</PTag>'; | ||
|
||
// Insert data | ||
try | ||
{ | ||
$stmt = $conn->prepare("INSERT INTO $tableName (XMLMessage) VALUES (:msg)"); | ||
$stmt->bindValue(':msg', $xml1); | ||
$stmt->execute(); | ||
|
||
$stmt = $conn->prepare("INSERT INTO $tableName (XMLMessage) VALUES (?)"); | ||
$stmt->bindValue(1, $xml2); | ||
$stmt->execute(); | ||
} | ||
catch (PDOException $ex) { | ||
echo "Error: " . $ex->getMessage(); | ||
} | ||
|
||
// Get data | ||
$stmt = $conn->query("select * from $tableName"); | ||
$row = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
var_dump($row); | ||
|
||
// Drop database | ||
$conn->query("DROP DATABASE ". $dbName) ?: die(); | ||
|
||
// Close connection | ||
$stmt=null; | ||
$conn=null; | ||
|
||
print "Done" | ||
?> | ||
|
||
--EXPECT-- | ||
array(2) { | ||
[0]=> | ||
array(2) { | ||
["ID"]=> | ||
string(1) "1" | ||
["XMLMessage"]=> | ||
string(553) "<PTag><CTag01>APP_PoP_银河</CTag01><CTag02>Το Παρίσι (γαλλικά: Paris, ΔΦΑ [paˈʁi]), γνωστό και ως η Πόλη του φωτός (Ville lumière), από τότε που εφοδιάστηκαν οι κύριες λεωφόροι του με φανούς γκαζιού το 1828, είναι η πρωτεύουσα της Γαλλίας και της περιφέρειας Ιλ ντε Φρανς (Île-de-France) και μία από τις ιστορικότερες πόλεις της Ευρώπης.</CTag02></PTag>" | ||
} | ||
[1]=> | ||
array(2) { | ||
["ID"]=> | ||
string(1) "2" | ||
["XMLMessage"]=> | ||
string(43) "<PTag><CTag01>NULL</CTag01><CTag02/></PTag>" | ||
} | ||
} | ||
Done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
--TEST-- | ||
sqlsrv_get_field() using SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR) | ||
--SKIPIF-- | ||
--FILE-- | ||
<?php | ||
|
||
require_once("autonomous_setup.php"); | ||
|
||
// Connect | ||
$conn = sqlsrv_connect( $serverName, $connectionInfo); | ||
if( !$conn ) { die( print_r( sqlsrv_errors(), true)); } | ||
|
||
// Create table | ||
$query = "CREATE TABLE #TA1 (ID NVARCHAR(10))"; | ||
$stmt = sqlsrv_query($conn, $query); | ||
|
||
// Insert data | ||
$query = "INSERT INTO #TA1 VALUES ('1998.1'),('-2004.2436'),('4.2 EUR')"; | ||
$stmt = sqlsrv_query($conn, $query) ?: die( print_r( sqlsrv_errors(), true) ); | ||
|
||
// Fetch data | ||
$query = "SELECT * FROM #TA1"; | ||
$stmt = sqlsrv_query( $conn, $query ) ?: die( print_r( sqlsrv_errors(), true) ); | ||
|
||
while(sqlsrv_fetch($stmt)) { | ||
$field = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR)); | ||
var_dump($field); | ||
|
||
while(!feof($field)) | ||
{ | ||
echo fread($field, 100)."\n"; | ||
} | ||
} | ||
|
||
// Close connection | ||
sqlsrv_free_stmt($stmt); | ||
sqlsrv_close($conn); | ||
print "Done" | ||
?> | ||
|
||
--EXPECT-- | ||
resource(9) of type (stream) | ||
1998.1 | ||
resource(10) of type (stream) | ||
-2004.2436 | ||
resource(11) of type (stream) | ||
4.2 EUR | ||
Done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
--TEST-- | ||
Streaming nvarchar(max) unicode (Russian) with CharacterSet=utf-8 | ||
--SKIPIF-- | ||
--FILE-- | ||
<?php | ||
|
||
require_once("autonomous_setup.php"); | ||
|
||
// Connect | ||
$connectionInfo = array("UID"=>$username, "PWD"=>$password, "CharacterSet"=>"utf-8"); | ||
$conn = sqlsrv_connect($serverName, $connectionInfo); | ||
if( !$conn ) { die( print_r( sqlsrv_errors(), true)); } | ||
|
||
// Create table | ||
$sql = "CREATE TABLE #Table (c1 NVARCHAR(max))"; | ||
$stmt = sqlsrv_query($conn, $sql); | ||
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); } | ||
|
||
// Insert data, 4538 characters | ||
$data = "Первые публикации об объектно-ориентированных базах данных появились в середине 80-х годов. Поддержка сложных объектов. В системе должна быть предусмотрена возможность создания составных объектов за счет применения конструкторов составных объектов. Необходимо, чтобы конструкторы объектов были ортогональны, то есть любой конструктор можно было применять к любому объекту. Поддержка индивидуальности объектов. Все объекты должны иметь уникальный идентификатор, который не зависит от значений их атрибутов. Поддержка инкапсуляции. Корректная инкапсуляция достигается за счет того, что программисты обладают правом доступа только к спецификации интерфейса методов, а данные и реализация методов скрыты внутри объектов. Поддержка типов и классов. Требуется, чтобы в ООБД поддерживалась хотя бы одна концепция различия между типами и классами. (Термин «тип» более соответствует понятию абстрактного типа данных. В языках программирования переменная объявляется с указанием её типа. Компилятор может использовать эту информацию для проверки выполняемых с переменной операций на совместимость с её типом, что позволяет гарантировать корректность программного обеспечения. С другой стороны класс является неким шаблоном для создания объектов и предоставляет методы, которые могут применяться к этим объектам. Таким образом, понятие «класс» в большей степени относится ко времени исполнения, чем ко времени компиляции.) Поддержка наследования типов и классов от их предков. Подтип, или подкласс, должен наследовать атрибуты и методы от его супертипа, или суперкласса, соответственно. Перегрузка в сочетании с полным связыванием. Методы должны применяться к объектам разных типов. Реализация метода должна зависеть от типа объектов, к которым данный метод применяется. Для обеспечения этой функциональности связывание имен методов в системе не должно выполняться до времени выполнения программы. Вычислительная полнота. Язык манипулирования данными должен быть языком программирования общего назначения. Набор типов данных должен быть расширяемым. Пользователь должен иметь средства создания новых типов данных на основе набора предопределенных системных типов. Более того, между способами использования системных и пользовательских типов данных не должно быть никаких различий.Первые публикации об объектно-ориентированных базах данных появились в середине 80-х годов. Поддержка сложных объектов. В системе должна быть предусмотрена возможность создания составных объектов за счет применения конструкторов составных объектов. Необходимо, чтобы конструкторы объектов были ортогональны, то есть любой конструктор можно было применять к любому объекту. Поддержка индивидуальности объектов. Все объекты должны иметь уникальный идентификатор, который не зависит от значений их атрибутов. Поддержка инкапсуляции. Корректная инкапсуляция достигается за счет того, что программисты обладают правом доступа только к спецификации интерфейса методов, а данные и реализация методов скрыты внутри объектов. Поддержка типов и классов. Требуется, чтобы в ООБД поддерживалась хотя бы одна концепция различия между типами и классами. (Термин «тип» более соответствует понятию абстрактного типа данных. В языках программирования переменная объявляется с указанием её типа. Компилятор может использовать эту информацию для проверки выполняемых с переменной операций на совместимость с её типом, что позволяет гарантировать корректность программного обеспечения. С другой стороны класс является неким шаблоном для создания объектов и предоставляет методы, которые могут применяться к этим объектам. Таким образом, понятие «класс» в большей степени относится ко времени исполнения, чем ко времени компиляции.) Поддержка наследования типов и классов от их предков. Подтип, или подкласс, должен наследовать атрибуты и методы от его супертипа, или суперкласса, соответственно. Перегрузка в сочетании с полным связыванием. Методы должны применяться к объектам разных типов. Реализация метода должна зависеть от типа объектов, к которым данный метод применяется. Для обеспечения этой функциональности связывание имен методов в системе не должно выполняться до времени выполнения программы. Вычислительная полнота. Язык манипулирования данными должен быть языком программирования общего назначения. Набор типов данных должен быть расширяемым. Пользователь должен иметь средства создания новых типов данных на основе набора предопределенных системных типов. Более того, между способами использования системных и пользовательских типов данных не должно быть никаких различий."; | ||
$sql = "INSERT INTO #Table VALUES (N'$data')"; | ||
$stmt = sqlsrv_query($conn, $sql); | ||
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); } | ||
|
||
// Query and fetch | ||
$sql = "SELECT * FROM #Table"; | ||
$stmt = sqlsrv_query($conn, $sql); | ||
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); } | ||
sqlsrv_fetch($stmt); | ||
|
||
// Get the data | ||
$field = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM('utf-8')); | ||
$out = ""; | ||
while(!feof($field)) | ||
{ | ||
$out .= fread($field, 512); | ||
} | ||
|
||
// Output string length | ||
var_dump(strlen($out)); | ||
|
||
// Compare output | ||
echo ($out === $data) ? "True\n" : "False\n"; | ||
|
||
// Close connection | ||
sqlsrv_free_stmt($stmt); | ||
sqlsrv_close($conn); | ||
|
||
print "Done"; | ||
?> | ||
|
||
--EXPECT-- | ||
int(8408) | ||
True | ||
Done |
Oops, something went wrong.