If you are performing a stored procedure inside a loop, it is a good idea to unset the variable that mssql_init returns so that you do NOT bind multiple values to the same stored procedure:
foreach($input as $sid=>$value) {
$stmt = mssql_init("sp_doSomething");
mssql_bind($stmt, "@sid", $sid, SQLINT4, false);
mssql_bind($stmt, "@value", $value, SQLINT4, false);
$result = mssql_execute($stmt);
unset($stmt); // <---VERY important
}
Even doing the mssql_init outside the loop does not help because of the multiple binds happening inside the loop.
Failing to do the above generates "Access Violations...memory cannot be 'written'" errors on the server. My hypothesis is that the error is generated when you try to bind to a stored procedure after it has already been executed. You have been warned.
mssql_init
(PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
mssql_init — Initialise une procédure stockée MS SQL Server locale ou distante
Description
resource mssql_init
( string $sp_name
[, resource $link_identifier
] )
Initialise une procédure stockée MS SQL Server locale ou distante.
Liste de paramètres
- sp_name
-
Le nom d'une procédure stocké, comme ownew.sp_name ou otherdb.owner.sp_name.
- link_identifier
-
Un identifiant de lien MS SQL, retourné par la fonction mssql_connect().
Valeurs de retour
Retourne un identifiant de ressource de requête, à utiliser lors des appels aux fonctions mssql_bind() et mssql_execute(), ou FALSE si une erreur survient.
Exemples
Exemple #1 Exemple avec mssql_init()
<?php
// Connexion à MSSQL et sélection de la base de données
$link = mssql_connect('KALLESPC\SQLEXPRESS', 'sa', 'phpfi');
mssql_select_db('php', $link);
// Création d'une nouvelle commande
$stmt = mssql_init('StatementTest', $link);
// Liaisons des valeurs ici
// Une fois que les valerus sont liées, nous pouvons exécuter
// notre commande avec mssql_execute:
mssql_execute($stmt);
// Et nous pouvons tout libérer ainsi :
mssql_free_statement($stmt);
?>
Voir aussi
- mssql_bind() - Ajoute un paramètre à une procédure stockée MSSQL (locale ou distante)
- mssql_execute() - Exécute une procédure stockée sur un serveur MS SQL
- mssql_free_statement() - Libère une commande MS SQL Server de la mémoire
shrockc at NOinhs dot orgSPAM
08-Jul-2002 11:19
fjortizATcomunetDOTes
26-Dec-2001 05:58
this function was created to support
OUTPUT parameters and return values with
MSSQL stored procedures. Before this,
you could use T-SQL statement EXECUTE
and mssql_query to execute a stored
procedure, and it was fine as long as
you don't need to retrieve OUTPUT or
RETVAL values.
Now you can use this set of functions to execute and retrieve these values:
mssql_init
mssql_bind
mssql_execute
Parameters:
- sp_name : stored procedure name. It passes this string to a native DB-lib call, so I guess it supports all kinds of schemas (like "ownew.sp_name" or "otherdb.owner.sp_name")
- connection id: a connection resource
obtained with mssql_connect or similar.
If not provided, it will proceed just
like other similar mssql_* functions:
uses a default open connection or
creates a new one.
Return value: a resource id, called
"statement", used in subsequent calls to
mssql_bind and mssql_execute.
Note that many of the native MSSQL data types are directly supported, but I
think that some others must be converted
by other means (from varchar values for
example). These unsupported types are:
SQLMONEY4,SQLMONEY,SQLBIT,SQLDATETIM4,
SQLDATETIME, SQLDECIMAL, SQLNUMERIC,
SQLVARBINARY, SQLBINARY,SQLIMAGE
More info on supported types and new constants in mssql_bind
