You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
427 lines
14 KiB
PHTML
427 lines
14 KiB
PHTML
4 years ago
|
<?php
|
||
|
|
||
|
namespace Safe;
|
||
|
|
||
|
use Safe\Exceptions\MssqlException;
|
||
|
|
||
|
/**
|
||
|
* Binds a parameter to a stored procedure or a remote stored procedure.
|
||
|
*
|
||
|
* @param resource $stmt Statement resource, obtained with mssql_init.
|
||
|
* @param string $param_name The parameter name, as a string.
|
||
|
*
|
||
|
* You have to include the @ character, like in the
|
||
|
* T-SQL syntax. See the explanation included in
|
||
|
* mssql_execute.
|
||
|
* @param mixed $var The PHP variable you'll bind the MSSQL parameter to. It is passed by
|
||
|
* reference, to retrieve OUTPUT and RETVAL values after
|
||
|
* the procedure execution.
|
||
|
* @param int $type One of: SQLTEXT,
|
||
|
* SQLVARCHAR, SQLCHAR,
|
||
|
* SQLINT1, SQLINT2,
|
||
|
* SQLINT4, SQLBIT,
|
||
|
* SQLFLT4, SQLFLT8,
|
||
|
* SQLFLTN.
|
||
|
* @param bool $is_output Whether the value is an OUTPUT parameter or not. If it's an OUTPUT
|
||
|
* parameter and you don't mention it, it will be treated as a normal
|
||
|
* input parameter and no error will be thrown.
|
||
|
* @param bool $is_null Whether the parameter is NULL or not. Passing the NULL value as
|
||
|
* var will not do the job.
|
||
|
* @param int $maxlen Used with char/varchar values. You have to indicate the length of the
|
||
|
* data so if the parameter is a varchar(50), the type must be
|
||
|
* SQLVARCHAR and this value 50.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_bind($stmt, string $param_name, &$var, int $type, bool $is_output = false, bool $is_null = false, int $maxlen = -1): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_bind($stmt, $param_name, $var, $type, $is_output, $is_null, $maxlen);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Closes the link to a MS SQL Server database that's associated with the
|
||
|
* specified link identifier. If the link identifier isn't specified, the
|
||
|
* last opened link is assumed.
|
||
|
*
|
||
|
* Note that this isn't usually necessary, as non-persistent open
|
||
|
* links are automatically closed at the end of the script's
|
||
|
* execution.
|
||
|
*
|
||
|
* @param resource $link_identifier A MS SQL link identifier, returned by
|
||
|
* mssql_connect.
|
||
|
*
|
||
|
* This function will not close persistent links generated by
|
||
|
* mssql_pconnect.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_close($link_identifier = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($link_identifier !== null) {
|
||
|
$result = \mssql_close($link_identifier);
|
||
|
} else {
|
||
|
$result = \mssql_close();
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_connect establishes a connection to a
|
||
|
* MS SQL server.
|
||
|
*
|
||
|
* The link to the server will be closed as soon as the execution of
|
||
|
* the script ends, unless it's closed earlier by explicitly calling
|
||
|
* mssql_close.
|
||
|
*
|
||
|
* @param string $servername The MS SQL server. It can also include a port number, e.g.
|
||
|
* hostname:port (Linux), or
|
||
|
* hostname,port (Windows).
|
||
|
* @param string $username The username.
|
||
|
* @param string $password The password.
|
||
|
* @param bool $new_link If a second call is made to mssql_connect with the
|
||
|
* same arguments, no new link will be established, but instead, the link
|
||
|
* identifier of the already opened link will be returned. This parameter
|
||
|
* modifies this behavior and makes mssql_connect
|
||
|
* always open a new link, even if mssql_connect was
|
||
|
* called before with the same parameters.
|
||
|
* @return resource Returns a MS SQL link identifier on success.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_connect(string $servername = null, string $username = null, string $password = null, bool $new_link = false)
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($new_link !== false) {
|
||
|
$result = \mssql_connect($servername, $username, $password, $new_link);
|
||
|
} elseif ($password !== null) {
|
||
|
$result = \mssql_connect($servername, $username, $password);
|
||
|
} elseif ($username !== null) {
|
||
|
$result = \mssql_connect($servername, $username);
|
||
|
} elseif ($servername !== null) {
|
||
|
$result = \mssql_connect($servername);
|
||
|
} else {
|
||
|
$result = \mssql_connect();
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_data_seek moves the internal row
|
||
|
* pointer of the MS SQL result associated with the specified result
|
||
|
* identifier to point to the specified row number, first row being
|
||
|
* number 0. The next call to mssql_fetch_row
|
||
|
* would return that row.
|
||
|
*
|
||
|
* @param resource $result_identifier The result resource that is being evaluated.
|
||
|
* @param int $row_number The desired row number of the new result pointer.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_data_seek($result_identifier, int $row_number): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_data_seek($result_identifier, $row_number);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns the length of field no. offset in
|
||
|
* result.
|
||
|
*
|
||
|
* @param resource $result The result resource that is being evaluated. This result comes from a
|
||
|
* call to mssql_query.
|
||
|
* @param int $offset The field offset, starts at 0. If omitted, the current field is used.
|
||
|
* @return int The length of the specified field index on success.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_field_length($result, int $offset = -1): int
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_field_length($result, $offset);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns the name of field no. offset in
|
||
|
* result.
|
||
|
*
|
||
|
* @param resource $result The result resource that is being evaluated. This result comes from a
|
||
|
* call to mssql_query.
|
||
|
* @param int $offset The field offset, starts at 0. If omitted, the current field is used.
|
||
|
* @return string The name of the specified field index on success.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_field_name($result, int $offset = -1): string
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_field_name($result, $offset);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Seeks to the specified field offset. If the next call to
|
||
|
* mssql_fetch_field won't include a field
|
||
|
* offset, this field would be returned.
|
||
|
*
|
||
|
* @param resource $result The result resource that is being evaluated. This result comes from a
|
||
|
* call to mssql_query.
|
||
|
* @param int $field_offset The field offset, starts at 0.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_field_seek($result, int $field_offset): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_field_seek($result, $field_offset);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns the type of field no. offset in
|
||
|
* result.
|
||
|
*
|
||
|
* @param resource $result The result resource that is being evaluated. This result comes from a
|
||
|
* call to mssql_query.
|
||
|
* @param int $offset The field offset, starts at 0. If omitted, the current field is used.
|
||
|
* @return string The type of the specified field index on success.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_field_type($result, int $offset = -1): string
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_field_type($result, $offset);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_free_result only needs to be called
|
||
|
* if you are worried about using too much memory while your script
|
||
|
* is running. All result memory will automatically be freed when
|
||
|
* the script ends. You may call mssql_free_result
|
||
|
* with the result identifier as an argument and the associated
|
||
|
* result memory will be freed.
|
||
|
*
|
||
|
* @param resource $result The result resource that is being freed. This result comes from a
|
||
|
* call to mssql_query.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_free_result($result): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_free_result($result);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_free_statement only needs to be called
|
||
|
* if you are worried about using too much memory while your script
|
||
|
* is running. All statement memory will automatically be freed when
|
||
|
* the script ends. You may call mssql_free_statement
|
||
|
* with the statement identifier as an argument and the associated
|
||
|
* statement memory will be freed.
|
||
|
*
|
||
|
* @param resource $stmt Statement resource, obtained with mssql_init.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_free_statement($stmt): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \mssql_free_statement($stmt);
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Initializes a stored procedure or a remote stored procedure.
|
||
|
*
|
||
|
* @param string $sp_name Stored procedure name, like ownew.sp_name or
|
||
|
* otherdb.owner.sp_name.
|
||
|
* @param resource $link_identifier A MS SQL link identifier, returned by
|
||
|
* mssql_connect.
|
||
|
* @return resource Returns a resource identifier "statement", used in subsequent calls to
|
||
|
* mssql_bind and mssql_executes.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_init(string $sp_name, $link_identifier = null)
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($link_identifier !== null) {
|
||
|
$result = \mssql_init($sp_name, $link_identifier);
|
||
|
} else {
|
||
|
$result = \mssql_init($sp_name);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_pconnect acts very much like
|
||
|
* mssql_connect with two major differences.
|
||
|
*
|
||
|
* First, when connecting, the function would first try to find a
|
||
|
* (persistent) link that's already open with the same host,
|
||
|
* username and password. If one is found, an identifier for it
|
||
|
* will be returned instead of opening a new connection.
|
||
|
*
|
||
|
* Second, the connection to the SQL server will not be closed when
|
||
|
* the execution of the script ends. Instead, the link will remain
|
||
|
* open for future use (mssql_close will not
|
||
|
* close links established by mssql_pconnect).
|
||
|
*
|
||
|
* This type of links is therefore called 'persistent'.
|
||
|
*
|
||
|
* @param string $servername The MS SQL server. It can also include a port number. e.g.
|
||
|
* hostname:port.
|
||
|
* @param string $username The username.
|
||
|
* @param string $password The password.
|
||
|
* @param bool $new_link If a second call is made to mssql_pconnect with
|
||
|
* the same arguments, no new link will be established, but instead, the
|
||
|
* link identifier of the already opened link will be returned. This
|
||
|
* parameter modifies this behavior and makes
|
||
|
* mssql_pconnect always open a new link, even if
|
||
|
* mssql_pconnect was called before with the same
|
||
|
* parameters.
|
||
|
* @return resource Returns a positive MS SQL persistent link identifier on success.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_pconnect(string $servername = null, string $username = null, string $password = null, bool $new_link = false)
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($new_link !== false) {
|
||
|
$result = \mssql_pconnect($servername, $username, $password, $new_link);
|
||
|
} elseif ($password !== null) {
|
||
|
$result = \mssql_pconnect($servername, $username, $password);
|
||
|
} elseif ($username !== null) {
|
||
|
$result = \mssql_pconnect($servername, $username);
|
||
|
} elseif ($servername !== null) {
|
||
|
$result = \mssql_pconnect($servername);
|
||
|
} else {
|
||
|
$result = \mssql_pconnect();
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_query sends a query to the currently active
|
||
|
* database on the server that's associated with the specified link
|
||
|
* identifier.
|
||
|
*
|
||
|
* @param string $query An SQL query.
|
||
|
* @param resource $link_identifier A MS SQL link identifier, returned by
|
||
|
* mssql_connect or
|
||
|
* mssql_pconnect.
|
||
|
*
|
||
|
* If the link identifier isn't specified, the last opened link is
|
||
|
* assumed. If no link is open, the function tries to establish a link
|
||
|
* as if mssql_connect was called, and use it.
|
||
|
* @param int $batch_size The number of records to batch in the buffer.
|
||
|
* @return mixed Returns a MS SQL result resource on success, TRUE if no rows were
|
||
|
* returned.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_query(string $query, $link_identifier = null, int $batch_size = 0)
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($batch_size !== 0) {
|
||
|
$result = \mssql_query($query, $link_identifier, $batch_size);
|
||
|
} elseif ($link_identifier !== null) {
|
||
|
$result = \mssql_query($query, $link_identifier);
|
||
|
} else {
|
||
|
$result = \mssql_query($query);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* mssql_select_db sets the current active
|
||
|
* database on the server that's associated with the specified link
|
||
|
* identifier.
|
||
|
*
|
||
|
* Every subsequent call to mssql_query will be
|
||
|
* made on the active database.
|
||
|
*
|
||
|
* @param string $database_name The database name.
|
||
|
*
|
||
|
* To escape the name of a database that contains spaces, hyphens ("-"),
|
||
|
* or any other exceptional characters, the database name must be
|
||
|
* enclosed in brackets, as is shown in the example, below. This
|
||
|
* technique must also be applied when selecting a database name that is
|
||
|
* also a reserved word (such as primary).
|
||
|
* @param resource $link_identifier A MS SQL link identifier, returned by
|
||
|
* mssql_connect or
|
||
|
* mssql_pconnect.
|
||
|
*
|
||
|
* If no link identifier is specified, the last opened link is assumed.
|
||
|
* If no link is open, the function will try to establish a link as if
|
||
|
* mssql_connect was called, and use it.
|
||
|
* @throws MssqlException
|
||
|
*
|
||
|
*/
|
||
|
function mssql_select_db(string $database_name, $link_identifier = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($link_identifier !== null) {
|
||
|
$result = \mssql_select_db($database_name, $link_identifier);
|
||
|
} else {
|
||
|
$result = \mssql_select_db($database_name);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw MssqlException::createFromPhpError();
|
||
|
}
|
||
|
}
|