ODBC绑定参数未发送完整参数

时间:2018-09-16 16:29:11

标签: php sql-server odbc

我工作的公司将PHP和SQL Server用于我们主要的,面向客户的网站。为了在站点和数据库之间进行通信,我们使用PHP的本机ODBC函数。使用此功能,每当使用从网络发送的变量时,我总是使用绑定参数,并且它们一直为我工作。我遇到的问题是,当使用绑定参数存储信用卡数据时,只有第一位数字被传递到数据库。由于数字是加密的,因此没有立即发现问题。我知道问题出在哪里,但无法弄清楚原因。

背景:上周,我为一年中最大的活动之一建立了一个网页,并且对数据库的调用与存储信用卡号时通常使用的调用略有不同。我对其进行了测试,看到信息已被存储,然后将其推出生产。快进到星期五,当时我去检查一些数字,这是该活动的付款处理页面的结果,我知道我们没有任何数字在存档中。我们只有第一位数字。在注册页面上,我一直跟踪输入直到数据库调用,甚至在调用之后,都发现它是整个过程的整个过程。

这是我正在使用的相关功能

<?php 
// ...
$registerID = placeRegistration($eventInfo["ID"], $attendeeFirst, $attendeeLast, $attendeePhone, $attendeeEmail, $attendeeClub);
if($registerID === NULL){
    $errStr .= "Unable to place registration. Please try again later.<br>";
}else{
    if(placePayment($registerID, _POST("bigInt"), _POST("bigIntMon"), _POST("bigIntYear"), _POST("totalCost")) === false){
    $errStr .= "Unable to place payment for this registration. Please try again.<br>";
}
// ...
?>
<!-- ... -->
<?php
/**
* Places a registration into EventsRegister.
* Returns the ID of the added entry if successful, else returns false.
*/
function placeRegistration($eventID, $firstName, $lastName, $phone, $email, $clubCard){
    $placeRegister = odbc_prepare($GLOBALS["dbh_WEB"], "
        INSERT INTO EventRegisters(EventID, FirstName, LastName, Phone, Email, ClubCard)
        OUTPUT INSERTED.ID
        VALUES (?, ?, ?, ?, ?, ?)
    ");

    if(!odbc_execute($placeRegister, array($eventID, $firstName, $lastName, $phone, $email, $clubCard))){
        $registerID = false;
        print_error(9, array($eventID, $firstName, $lastName, $phone, $email, $clubCard), __FILE__, __LINE__);
    }else{
        $temp = odbc_fetch_array($placeRegister);
        $registerID = $temp["ID"];
    }

    return $registerID;
}

/**
* Adds the payment for the corresponding registration ID.
* Returns true if successful, else false
*/
function placePayment($registerID, $pink, $expMo, $expYr, $total){
    $placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
        INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
        VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
    ");

    if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
        return false;
    }else{
        return true;
    }
}

其中提到的$GLOBALS是:$pinkySwear加密密码,$dbh_WEB数据库句柄

$dbh_WEB = odbc_connect("Driver={SQl Server Native Client 11.0};Server=$server;Database=website", $server_user, $server_password)
             or die('Something went wrong while connecting to MSSQL');

问题陈述是这样的,

$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
    INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
    VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
    return false;
}else{
    return true;
}

由于某种原因,该语句仅输入$pink的第一位。如果我使用下面的语句(在印象函数下使用相同的方式),则可以很好地工作。

$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
    INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
    VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', '$pink'), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $expMo, $expYr, $total))){
    return false;
}else{
    return true;
}

绑定参数将12-19位数字截断为仅第一位的原因是什么?

我们的系统使用的是PHP 7.1.19,ODBC驱动程序“ SQL Server本机客户端11.0”,SQL Server 12.0.5579.0

1 个答案:

答案 0 :(得分:1)

一个错误。

我的猜测是,它与变量扩展有关。如果没有调试器,很难知道更多信息,例如查看实际发送的内容(wireshark)。

我尝试在php odbc source code中进行搜索,但找不到 任何可疑的东西。

编辑基于评论

在函数ENCRYPTBYPASSPHRASE中与odbc_prepare / odbc_execute结合使用时,扩展受到某种程度的阻碍(目前尚不清楚如何实现)。

如果直接添加$pink,您将获得该变量表示的值,则不会通过odbc_prepare / odbc_execute进行处理。