<?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(); } }