for type :
SQLCHAR DBCHAR
SQLVARCHAR DBCHAR
SQLTEXT DBCHAR
SQLBINARY DBBINARY
SQLVARBINARY DBBINARY
SQLIMAGE DBBINARY
SQLINT1 DBTINYINT
SQLINT2 DBSMALLINT
SQLINT4 DBINT
SQLFLT4 DBFLT4
SQLFLT8 DBFLT8
SQLBIT DBBIT
SQLMONEY4 DBMONEY4
SQLMONEY DBMONEY
SQLDATETIM4 DBDATETIM4
SQLDATETIME DBDATETIME
SQLDECIMAL DBDECIMAL
SQLNUMERIC DBNUMERIC
source : http://msdn.microsoft.com/en-us/library/aa937008(SQL.80).aspx
mssql_bind
(PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
mssql_bind — Añade un parámetro a un stored procedure (procedimiento almacenado) MSSQL (local o remoto)
Descripción
$stmt
, string $param_name
, mixed &$var
, int $type
[, bool $is_output = false
[, bool $is_null = false
[, int $maxlen = -1
]]] )Vincula un parámetro a un stored procedure MSSQL (local o remoto).
Parámetros
-
stmt -
Recurso de solicitud, obtenido con la función mssql_init().
-
param_name -
El nombre del parámetro, como un string.
Nota:
Se ha de incluir el carácter @, como en la sintaxis T-SQL. Ver la explicación incluída en mssql_execute().
-
var -
La variable PHP que se vinculará al parámetro MSSQL. Se pasa por referencia, para obtener los valores OUTPUT y RETVAL una vez el procedimiento ha sido ejecutado.
-
type -
Uno constante de entre:
SQLTEXT,SQLVARCHAR,SQLCHAR,SQLINT1,SQLINT2,SQLINT4,SQLBIT,SQLFLT4,SQLFLT8,SQLFLTN. -
is_output -
Si el valor es un parámetro OUTPUT o no. Si no es un parámetro OUTPUT y no se menciona, éste será tratado como un parámetro de entrada normal y no se generará un error.
-
is_null -
Si el valor es
NULLo no. Pasar el valorNULLal parámetrovarno hará nada. -
maxlen -
Utilizado con valores char/varchar. Se ha de indicar la longitud de los datos, por lo que si el parámetro es un varchar(50), el tipo debe ser
SQLVARCHARy su valor 50.
Valores devueltos
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplos
Ejemplo #1 Ejemplo con mssql_bind()
<?php
// Conectar a MSSQL y seleccionar la base de datos
mssql_connect('KALLESPC\SQLEXPRESS', 'sa', 'phpfi');
mssql_select_db('php');
// Crear un nuevo stored procedure
$stmt = mssql_init('NewUserRecord');
// Vincular los nombres de campos
mssql_bind($stmt, '@username', 'Kalle', SQLVARCHAR, false, false, 60);
mssql_bind($stmt, '@name', 'Kalle', SQLVARCHAR, false, false, 60);
mssql_bind($stmt, '@age', 19, SQLINT1, false, false, 3);
// Ejecutar
mssql_execute($stmt);
// Liberar los recursos
mssql_free_statement($stmt);
?>
Ver también
- mssql_execute() - Ejecuta un stored procedure (procedimiento almacenado) en una base de datos del servidor MS SQL
- mssql_free_statement() - Liberar la memoria ocupada por la sentencia MS SQL
- mssql_init() - Inicializa un stored procedure (procedimiento almacenado) local o remoto
In order to bind DATETIME, i suggest to convert the date to double, then use SQLFLT8 instead of SQLVARCHAR.
In SQL Server Datetime is a standard double. The integer part represent the number of days since 1-1-1900 and the fractional part represent the fraction of the day (e.g: 0.5 means noon, 0.75 means 6 PM).
Using SQLVARCHAR may lead to errors depending on the local server config.
<?php
function PhpTimeToOLEDateTime($timestamp)
{
$a_date = getdate ($timestamp);
$year= $a_date['year']; //this year
$partial_days = ($year-1900)*365;//days elapsed since 1-1-1900
//let's calculate how many 29 february from 1900 to first day on this year
$partial_days +=(int)(($year-1) / 4); //each 4 years a leap year since year 0
$partial_days -= (int)(($year-1) / 100); //each 100 years skip a leap
$partial_days += (int)(($year-1) / 400); //each 400 years add a leap
$partial_days -= 460; //459 leap years before 1900 + 1 for math (year 0 does not exist)
$partial_days += $a_date['yday'];
$seconds = $a_date['hours'] * 3600;
$seconds += $a_date['minutes'] * 60;
$seconds += $a_date['seconds'];
$d = (double) $partial_days;
$d += ((double)$seconds)/86400.0;
return $d;
}
?>
Sample binding
<?php
$now = PhpTimeToOLEDateTime(time());
mssql_bind($proc, "@dateparam", $now, SQLFLT8, false);
?>
if you are experiencing difficulties binding an empty string because it is being converted to NULL by your driver try the following:
<?php
if($var === ''){
//stupid hack to prevent mssql driver from converting empty strings to null. now they arent empty strings but they will get trimmed down to legth 0 ;-)
$var = ' ';
$type = SQLVARCHAR;
$isNull = false;
$maxLen = 0;
}
mssql_bind($stmt, $param_name, $var, $type, $is_output,$isNull, $maxLen);
?>
There isn't a bind function for regular SQL queries; not even a escape function. I found this nice piece of code:
<?php
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
?>
http://stackoverflow.com/questions/574805/
I found SQLVARCHAR better for datetime.
It was performing some other non-strtotime() convertions when it was set to SQLINT4
Use:
SQLVARCHAR for binary
SQLINT4 for datetime
SQLFLT8 for decimal
SQLVARCHAR for image
SQLFLT8 for money
SQLCHAR for nchar
SQLTEXT for ntext
SQLFLT8 for numeric
SQLVARCHAR for nvarchar
SQLFLT8 for real
SQLINT4 for smalldatetime
SQLFLT8 for smallmoney
SQLVARCHAR for sql_variant
SQLINT4 for timestamp
SQLVARCHAR for varbinary
<?php
//IP Address, if instance then IP\Instance
$server = 'a.b.c.d';
$link = mssql_connect($server, 'sql_user', 'sql_user_pass');
//Select DB
$dbn = 'dbName';
mssql_select_db($dbn);
//Define Procedure
$lala = 'tstProc';
$proc = mssql_init($lala, $link);
//Define Parameters
$parm1 = 'one';
$parm2 = 'two';
$parm3 = 'three';
//Load Parameters
mssql_bind($proc, '@num', $parm1, SQLCHAR, false, false, 10);
mssql_bind($proc, '@naamen', $parm2, SQLCHAR, false, false, 10);
mssql_bind($proc, '@desci', $parm3, SQLCHAR, false, false, 10);
//Execute Procedure
mssql_execute($proc);
//Free Memory
mssql_free_statement($proc);
//...and whenever the wolf did howl, all the sheep had to do was bleat!
?>
I had the same problem but the posted solution above just produced null results. Here's a modification that ended up working:
#THIS SUCCEEDS, USES A REFERENCE
mssql_bind($proc, '@'.$key, $sp_parms[$key], SQLVARCHAR)
or die("Unable to bind $sp_name:$key<br>".mssql_get_last_message());
mssql_bind binds by reference, not by value, even on input parameters. Improper binding can cause strange errors; in my case "Error converting data type varchar to int"
--SAMPLE STORED PROCEDURE
CREATE Procedure [dbo].[myproc]
(
@one VARCHAR(10) = 'n1',
@two VARCHAR(10) = 'n2',
@three VARCHAR(10) = 'n3',
@four VARCHAR(10) = 'n4',
@five VARCHAR(10) = 'n5'
)
AS
BEGIN
SET NOCOUNT ON;
SELECT
@one AS 'one',
@two AS 'two',
@three AS 'three',
@four AS 'four',
@five AS 'five'
END
//SAMPLE PHP CALL
$sp_name = 'mydb.dbo.myproc';
$proc = mssql_init($sp_name);
$sp_parms->one = 'one';
$sp_parms->two = 'two';
$sp_parms->three = 'three';
foreach ($sp_parms as $key=>$parm) {
#THIS FAILS, because it's binding values!
#mssql_bind($proc, '@'.$key, $parm, SQLVARCHAR)
# or die("Unable to bind $sp_name:$key<br>".mssql_get_last_message());
#THIS SUCCEEDS, USES A REFERENCE
mssql_bind($proc, '@'.$key, $sp_parms->$key, SQLVARCHAR)
or die("Unable to bind $sp_name:$key<br>".mssql_get_last_message());
}
