- PDO::query
- Syntax
- Parameters
- Return Value
- Exceptions
- Remarks
- Query example
- Sql_variant example
- Шаг 3. Подтверждение концепции: подключение к SQL с помощью PHP
- Шаг 2. Выполнение запроса
- Шаг 3. Вставка строки
- Шаг 4. Откат транзакции
- sqlsrv_query
- Возвращаемое значение
- Remarks
- Пример 1
- Пример 2
- Пример 3
- Пример 4
- Шаг 3. Подтверждение концепции: подключение к SQL с помощью PHP
- Шаг 2. Выполнение запроса
- Шаг 3. Вставка строки
- Шаг 4. Откат транзакции
PDO::query
Executes an SQL query and returns a result set as a PDOStatement object.
Syntax
PDOStatement PDO::query ($statement[, $fetch_style);
Parameters
$statement: The SQL statement you want to execute.
$fetch_style: The optional instructions on how to perform the query. See the Remarks section for more details. $fetch_style in PDO::query can be overridden with $fetch_style in PDO::fetch.
Return Value
If the call succeeds, PDO::query returns a PDOStatement object. If the call fails, PDO::query throws a PDOException object or returns false, depending on the setting of PDO::ATTR_ERRMODE.
Exceptions
Remarks
A query executed with PDO::query can execute either a prepared statement or directly, depending on the setting of PDO::SQLSRV_ATTR_DIRECT_QUERY. For more information, see Direct Statement Execution and Prepared Statement Execution in the PDO_SQLSRV Driver.
PDO::SQLSRV_ATTR_QUERY_TIMEOUT also affects the behavior of PDO::exec; for more information, see PDO::setAttribute.
You can specify the following options for $fetch_style.
Style | Description |
---|---|
PDO::FETCH_COLUMN, num | Queries for data in the specified column. The first column in the table is column 0. |
PDO::FETCH_CLASS, ‘classname‘, array( arglist ) | Creates an instance of a class and assigns column names to properties in the class. If the class constructor takes one or more parameters, you can also pass an arglist. |
PDO::FETCH_CLASS, ‘classname‘ | Assigns column names to properties in an existing class. |
Call PDOStatement::closeCursor to release database resources associated with the PDOStatement object before calling PDO::query again.
You can close a PDOStatement object by setting it to null.
If all the data in a result set is not fetched, the next PDO::query call will not fail.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.
Query example
This example shows several queries.
setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $conn->setAttribute( PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 1 ); $query = 'select * from Person.ContactType'; // simple query $stmt = $conn->query( $query ); while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ) < print_r( $row['Name'] ."\n" ); >echo "\n. query for a column . \n"; // query for one column $stmt = $conn->query( $query, PDO::FETCH_COLUMN, 1 ); while ( $row = $stmt->fetch() ) < echo "$row\n"; >echo "\n. query with a new class . \n"; $query = 'select * from HumanResources.Department order by GroupName'; // query with a class class cc < function __construct( $arg ) < echo "$arg"; >function __toString() < return $this->DepartmentID . "; " . $this->Name . "; " . $this->GroupName; > > $stmt = $conn->query( $query, PDO::FETCH_CLASS, 'cc', array( "arg1 " )); while ( $row = $stmt->fetch() ) < echo "$row\n"; >echo "\n. query into an existing class . \n"; $c_obj = new cc( '' ); $stmt = $conn->query( $query, PDO::FETCH_INTO, $c_obj ); while ( $stmt->fetch() ) < echo "$c_obj\n"; >$stmt = null; ?>
Sql_variant example
This code sample shows how to create a table of sql_variant types and fetch the inserted data.
setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); try < $tableName = 'testTable'; $query = "CREATE TABLE $tableName ([c1_int] sql_variant, [c2_varchar] sql_variant)"; $stmt = $conn->query($query); unset($stmt); $query = "INSERT INTO [$tableName] (c1_int, c2_varchar) VALUES (1, 'test_data')"; $stmt = $conn->query($query); unset($stmt); $query = "SELECT * FROM $tableName"; $stmt = $conn->query($query); $result = $stmt->fetch(PDO::FETCH_ASSOC); print_r($result); unset($stmt); unset($conn); > catch (Exception $e) < echo $e->getMessage(); > ?>
The expected output would be:
Array ( [c1_int] => 1 [c2_varchar] => test_data )
Шаг 3. Подтверждение концепции: подключение к SQL с помощью PHP
Эта функция OpenConnection вызывается перед выполнением всех последующих функций.
function OpenConnection() < $serverName = "tcp:myserver.database.windows.net,1433"; $connectionOptions = array("Database"=>"AdventureWorks", "Uid"=>"MyUser", "PWD"=>"MyPassword"); $conn = sqlsrv_connect($serverName, $connectionOptions); if($conn == false) die(FormatErrors(sqlsrv_errors())); return $conn; >
Шаг 2. Выполнение запроса
Функция sqlsrv_query может использоваться для извлечения результирующего набора из запроса к базе данных SQL. Эта функция фактически принимает любой запрос и объект подключения, а затем возвращает результирующий набор для итеративного перебора с помощью sqlsrv_fetch_array().
function ReadData() < try < $conn = OpenConnection(); $tsql = "SELECT [CompanyName] FROM SalesLT.Customer"; $getProducts = sqlsrv_query($conn, $tsql); if ($getProducts == FALSE) die(FormatErrors(sqlsrv_errors())); $productCount = 0; while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) < echo($row['CompanyName']); echo("
"); $productCount++; > sqlsrv_free_stmt($getProducts); sqlsrv_close($conn); > catch(Exception $e) < echo("Error!"); >>
Шаг 3. Вставка строки
В этом примере показано, как безопасно выполнить инструкцию INSERT и передать параметры. Значения параметров защищают приложение от внедрения кода SQL.
function InsertData() < try < $conn = OpenConnection(); $tsql = "INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT" . " INSERTED.ProductID VALUES ('SQL Server 1', 'SQL Server 2', 0, 0, getdate())"; //Insert query $insertReview = sqlsrv_query($conn, $tsql); if($insertReview == FALSE) die(FormatErrors( sqlsrv_errors())); echo "Product Key inserted is :"; while($row = sqlsrv_fetch_array($insertReview, SQLSRV_FETCH_ASSOC)) < echo($row['ProductID']); >sqlsrv_free_stmt($insertReview); sqlsrv_close($conn); > catch(Exception $e) < echo("Error!"); >>
Шаг 4. Откат транзакции
Этот пример кода демонстрирует использование транзакций, в которых можно:
- начать транзакцию;
- вставить строку данных, обновить другую строку данных;
- зафиксировать транзакцию, если запросы на вставку и обновление выполнены успешно, или откатить транзакцию, если один из запросов вызвал ошибку.
function Transactions() < try < $conn = OpenConnection(); if (sqlsrv_begin_transaction($conn) == FALSE) die(FormatErrors(sqlsrv_errors())); $tsql1 = "INSERT INTO SalesLT.SalesOrderDetail (SalesOrderID,OrderQty,ProductID,UnitPrice) VALUES (71774, 22, 709, 33)"; $stmt1 = sqlsrv_query($conn, $tsql1); /* Set up and execute the second query. */ $tsql2 = "UPDATE SalesLT.SalesOrderDetail SET OrderQty = (OrderQty + 1) WHERE ProductID = 709"; $stmt2 = sqlsrv_query( $conn, $tsql2); /* If both queries were successful, commit the transaction. */ /* Otherwise, rollback the transaction. */ if($stmt1 && $stmt2) < sqlsrv_commit($conn); echo("Transaction was commited"); >else < sqlsrv_rollback($conn); echo "Transaction was rolled back.\n"; >/* Free statement and connection resources. */ sqlsrv_free_stmt( $stmt1); sqlsrv_free_stmt( $stmt2); > catch(Exception $e) < echo("Error!"); >>
sqlsrv_query
$conn: ресурс подключения, связанный с подготовленной инструкцией.
$tsql: выражение Transact-SQL, соответствующее подготовленной инструкции.
$params [необязательный параметр]: массив значений, которые соответствуют параметрам в параметризованном запросе. Каждый элемент массива может быть одним из следующих значений:
- Буквенное значение.
- Переменная PHP.
- Массив со следующей структурой:
array($value [, $direction [, $phpType [, $sqlType]]])
Описание для каждого элемента массива приводится в следующей таблице:
Элемент | Описание |
---|---|
$value | Буквенное значение, переменная PHP или ссылочная переменная PHP. |
$direction(необязательно) | Одна из следующих констант SQLSRV_PARAM_*, используемая для указания направления параметра: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. Значение по умолчанию — SQLSRV_PARAM_IN. |
$options [необязательный параметр]: ассоциативный массив, позволяющий задать свойства запроса. Это тот же список ключей, который поддерживается sqlsrv_prepare.
Возвращаемое значение
Ресурс инструкции. Если не удается создать или выполнить инструкцию, возвращается значение false.
Remarks
Функция sqlsrv_query хорошо подходит для одноразовых запросов и должна использоваться по умолчанию для выполнения запросов, если только не действуют особые обстоятельства. Эта функция предоставляет оптимальный метод для выполнения запроса с использованием минимального количества кода. Функция sqlsrv_query подготавливает и выполняет инструкцию, а также может применяться для выполнения параметризованных запросов.
Пример 1
В следующем примере отдельная строка вставляется в таблицу Sales.SalesOrderDetail базы данных AdventureWorks. В примере предполагается, что SQL Server и базы данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.
Хотя в следующем примере используется инструкция INSERT, чтобы продемонстрировать использование sqlsrv_query для однократного выполнения инструкции, эта концепция распространяется на любую инструкцию Transact-SQL.
"AdventureWorks"); $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn === false) < echo "Could not connect.\n"; die(print_r(sqlsrv_errors(), true)); >/* Set up the parameterized query. */ $tsql = "INSERT INTO Sales.SalesOrderDetail (SalesOrderID, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount) VALUES (?, ?, ?, ?, ?, ?)"; /* Set parameter values. */ $params = array(75123, 5, 741, 1, 818.70, 0.00); /* Prepare and execute the query. */ $stmt = sqlsrv_query($conn, $tsql, $params); if ($stmt) < echo "Row successfully inserted.\n"; >else < echo "Row insertion failed.\n"; die(print_r(sqlsrv_errors(), true)); >/* Free statement and connection resources. */ sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?>
Пример 2
В приведенном ниже примере обновляется поле в таблице Sales.SalesOrderDetail базы данных AdventureWorks. В примере предполагается, что SQL Server и базы данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.
"AdventureWorks"); $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn === false) < echo "Could not connect.\n"; die(print_r(sqlsrv_errors(), true)); >/* Set up the parameterized query. */ $tsql = "UPDATE Sales.SalesOrderDetail SET OrderQty = (?) WHERE SalesOrderDetailID = (?)"; /* Assign literal parameter values. */ $params = array(5, 10); /* Execute the query. */ if (sqlsrv_query($conn, $tsql, $params)) < echo "Statement executed.\n"; >else < echo "Error in statement execution.\n"; die(print_r(sqlsrv_errors(), true)); >/* Free connection resources. */ sqlsrv_close($conn); ?>
Рекомендуется использовать строки в качестве входных данных при привязке значений к десятичным или числовым столбцам, чтобы обеспечить точность и правильность, поскольку PHP имеет ограниченную точность для чисел с плавающей запятой. То же касается и столбцов bigint, особенно в том случае, если значения выходят за пределы диапазона целых чисел.
Пример 3
В этом примере кода показано, как привязать десятичное значение в качестве входного параметра.
"YourTestDB"); $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn === false) < echo "Could not connect.\n"; die(print_r(sqlsrv_errors(), true)); >// Assume TestTable exists with a decimal field $input = "9223372036854.80000"; $params = array($input); $stmt = sqlsrv_query($conn, "INSERT INTO TestTable (DecimalCol) VALUES (?)", $params); sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?>
Пример 4
В этом примере кода показано, как создать таблицу типов sql_variant и получить внесенные данные.
$dbName, "UID"=>$uid, "PWD"=>$pwd); $conn = sqlsrv_connect($server, $options); if($conn === false) < die(print_r(sqlsrv_errors(), true)); >$tableName = 'testTable'; $query = "CREATE TABLE $tableName ([c1_int] sql_variant, [c2_varchar] sql_variant)"; $stmt = sqlsrv_query($conn, $query); if($stmt === false) < die(print_r(sqlsrv_errors(), true)); >sqlsrv_free_stmt($stmt); $query = "INSERT INTO [$tableName] (c1_int, c2_varchar) VALUES (1, 'test_data')"; $stmt = sqlsrv_query($conn, $query); if($stmt === false) < die(print_r(sqlsrv_errors(), true)); >sqlsrv_free_stmt($stmt); $query = "SELECT * FROM $tableName"; $stmt = sqlsrv_query($conn, $query); if(sqlsrv_fetch($stmt) === false) < die(print_r(sqlsrv_errors(), true)); >$col1 = sqlsrv_get_field($stmt, 0); echo "First field: $col1 \n"; $col2 = sqlsrv_get_field($stmt, 1); echo "Second field: $col2 \n"; sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?>
Ожидаемый результат будет следующим.
First field: 1 Second field: test_data
Шаг 3. Подтверждение концепции: подключение к SQL с помощью PHP
Эта функция OpenConnection вызывается перед выполнением всех последующих функций.
function OpenConnection() < $serverName = "tcp:myserver.database.windows.net,1433"; $connectionOptions = array("Database"=>"AdventureWorks", "Uid"=>"MyUser", "PWD"=>"MyPassword"); $conn = sqlsrv_connect($serverName, $connectionOptions); if($conn == false) die(FormatErrors(sqlsrv_errors())); return $conn; >
Шаг 2. Выполнение запроса
Функция sqlsrv_query может использоваться для извлечения результирующего набора из запроса к базе данных SQL. Эта функция фактически принимает любой запрос и объект подключения, а затем возвращает результирующий набор для итеративного перебора с помощью sqlsrv_fetch_array().
function ReadData() < try < $conn = OpenConnection(); $tsql = "SELECT [CompanyName] FROM SalesLT.Customer"; $getProducts = sqlsrv_query($conn, $tsql); if ($getProducts == FALSE) die(FormatErrors(sqlsrv_errors())); $productCount = 0; while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) < echo($row['CompanyName']); echo("
"); $productCount++; > sqlsrv_free_stmt($getProducts); sqlsrv_close($conn); > catch(Exception $e) < echo("Error!"); >>
Шаг 3. Вставка строки
В этом примере показано, как безопасно выполнить инструкцию INSERT и передать параметры. Значения параметров защищают приложение от внедрения кода SQL.
function InsertData() < try < $conn = OpenConnection(); $tsql = "INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT" . " INSERTED.ProductID VALUES ('SQL Server 1', 'SQL Server 2', 0, 0, getdate())"; //Insert query $insertReview = sqlsrv_query($conn, $tsql); if($insertReview == FALSE) die(FormatErrors( sqlsrv_errors())); echo "Product Key inserted is :"; while($row = sqlsrv_fetch_array($insertReview, SQLSRV_FETCH_ASSOC)) < echo($row['ProductID']); >sqlsrv_free_stmt($insertReview); sqlsrv_close($conn); > catch(Exception $e) < echo("Error!"); >>
Шаг 4. Откат транзакции
Этот пример кода демонстрирует использование транзакций, в которых можно:
- начать транзакцию;
- вставить строку данных, обновить другую строку данных;
- зафиксировать транзакцию, если запросы на вставку и обновление выполнены успешно, или откатить транзакцию, если один из запросов вызвал ошибку.
function Transactions() < try < $conn = OpenConnection(); if (sqlsrv_begin_transaction($conn) == FALSE) die(FormatErrors(sqlsrv_errors())); $tsql1 = "INSERT INTO SalesLT.SalesOrderDetail (SalesOrderID,OrderQty,ProductID,UnitPrice) VALUES (71774, 22, 709, 33)"; $stmt1 = sqlsrv_query($conn, $tsql1); /* Set up and execute the second query. */ $tsql2 = "UPDATE SalesLT.SalesOrderDetail SET OrderQty = (OrderQty + 1) WHERE ProductID = 709"; $stmt2 = sqlsrv_query( $conn, $tsql2); /* If both queries were successful, commit the transaction. */ /* Otherwise, rollback the transaction. */ if($stmt1 && $stmt2) < sqlsrv_commit($conn); echo("Transaction was commited"); >else < sqlsrv_rollback($conn); echo "Transaction was rolled back.\n"; >/* Free statement and connection resources. */ sqlsrv_free_stmt( $stmt1); sqlsrv_free_stmt( $stmt2); > catch(Exception $e) < echo("Error!"); >>