Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数据插入SQL Server Db时指定的方向无效_Php_Sql Server_Sqlsrv_Varbinary_Varbinarymax - Fatal编程技术网

Php 将数据插入SQL Server Db时指定的方向无效

Php 将数据插入SQL Server Db时指定的方向无效,php,sql-server,sqlsrv,varbinary,varbinarymax,Php,Sql Server,Sqlsrv,Varbinary,Varbinarymax,我正在使用SQLServerDB(mssql),并试图通过PHP执行Insert查询 public function registerCustomer($custId, $custData) { $sqlString = "INSERT INTO CUSTMASTER ( CustId, CustData ) values ( ?, CONVERT(varbinary(max),? )) ; SELECT SCOPE_IDENTITY()"; $params = array($

我正在使用SQLServerDB(mssql),并试图通过PHP执行Insert查询

public function registerCustomer($custId, $custData)
{

    $sqlString = "INSERT INTO CUSTMASTER ( CustId, CustData ) values ( ?, CONVERT(varbinary(max),? )) ; SELECT SCOPE_IDENTITY()";
    $params = array($custId, $custData);
    $stmt = sqlsrv_query($this->conn, $sqlString, $params);
    if ($stmt === false) {
        die(print_r(sqlsrv_errors(), true));
    }

    $rows = sqlsrv_has_rows($stmt);
    sqlsrv_next_result($stmt);
    sqlsrv_fetch($stmt);
    $lastId = sqlsrv_get_field($stmt, 0);

    if ($rows === true) {
       echo "Data Inserted."
    } else {
        return "Data Insert Failed.";
    }

}
我得到以下错误

Array
(
    [0] => Array
        (
            [0] => IMSSP
            [SQLSTATE] => IMSSP
            [1] => -15
            [code] => -15
            [2] => An invalid direction for parameter 2 was specified. SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, and SQLSRV_PARAM_INOUT are valid values.
            [message] => An invalid direction for parameter 2 was specified. SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, and SQLSRV_PARAM_INOUT are valid values.
        )
)
注意:数据库中的CustData列是varbinary(max)类型。

我正在从Android应用程序发送Base64字符串,然后使用以下代码将该字符串转换为字节[]

 $a = base64_decode($FingerData);
 $custData = array();
 foreach (str_split($a) as $c) {
    $custData[] = sprintf("%08b", ord($c));
 }

如何解决此问题?

如果我理解正确,您有一个base64加密图像。所以试试这个:

<?php 

# Only decode $FingerData.
...
$a = base64_decode($FingerData);
...

# Insert data
public function registerCustomer($custId, $custData)
{
    ...
    $sqlString = "INSERT INTO CUSTMASTER (CustId, CustData) VALUES (?, CONVERT(varbinary(max), ?)); SELECT SCOPE_IDENTITY();";
    $params = array(
        array($custId, SQLSRV_PARAM_IN),
        array($custData, SQLSRV_PARAM_IN)
    );
    $stmt = sqlsrv_query($this->conn, $sqlString, $params);
    ...
}
?>

我根据您的示例制作了一个小脚本:

<?php
#------------------------------
# Connection info
#------------------------------
$server = 'server\instance,port';
$database = 'database';
$uid = 'user';
$pwd = 'password';

#------------------------------
# Connection
#------------------------------
$cinfo = array(
    "Database" => $database,
    "UID" => $uid,
    "PWD" => $pwd
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}

#------------------------------
# Function
#------------------------------
function registerCustomer($connection, $custId, $custData) {

    $sqlString = "INSERT INTO CUSTMASTER (CustId, CustData) VALUES (?, CONVERT(varbinary(max), ?)); SELECT SCOPE_IDENTITY();";
    $params = array(
        array($custId, SQLSRV_PARAM_IN),
        array($custData, SQLSRV_PARAM_IN)
    );
    $stmt = sqlsrv_query($connection, $sqlString, $params);
    if ($stmt === false) {
        die(print_r(sqlsrv_errors(), true));
    }

    $rows = sqlsrv_has_rows($stmt);
    while (sqlsrv_fetch($stmt)) {
        $lastId = sqlsrv_get_field($stmt, 0);
    }

    if ($rows === true) {
       echo "Data Inserted.";
    } else {
        return "Data Insert Failed.";
    }

    echo $lastId;
}

#------------------------------
# Load image file into database
#------------------------------
# With next two lines I load and encode an image. 
# If I understand you correctly, this is already done and you have a base64 encrypted image.
$image = file_get_contents('image.jpg');
$encoded_image = base64_encode($image);

# Insert image
$decoded_image = base64_decode($encoded_image);
registerCustomer($conn, 1, $decoded_image);
?>


也发布您的
$params
数组代码,以便我们可以看到问题所在is@IgorIlic:嗨。你的意思是发布实际值吗?实际上,在这里发布问题时遗漏了行。它最初在代码中。@javabee我已经更新了答案。尝试使用完整语法。Hi在更改此错误后。数组([0]=>Array([0]=>IMSSP[SQLSTATE]=>IMSSP[1]=>-16[code]=>-16[2]=>为参数1指定了无效的PHP类型。[消息]=>为参数1指定了无效的PHP类型。)@javabee$custID和$custData的类型是什么?custID是int,custData是byte[]。而且custID不是自动生成的或主键。这就是我在插入查询中传递它的原因。