无法使用PDO& amp; MSSQL

时间:2014-02-19 14:29:25

标签: php sql-server pdo

我有这个php函数,它将表单提供的密码加密到: 0xb539dbae17ef3d7c49d0f6f63ba18787

function encrypt($str) {
$key = array();
$dst = array();
$i = 0;

$nBytes = strlen($str);
        while ($i < $nBytes){
             $i++;
                $key[$i] = ord(substr($str, $i - 1, 1));
                $dst[$i] = $key[$i];
}  

$rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
$one = $rslt * 213119 + 2529077;
$one = $one - intval($one/ 4294967296) * 4294967296;

$rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
$two = $rslt * 213247 + 2529089;
$two = $two - intval($two/ 4294967296) * 4294967296;

$rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
$three = $rslt * 213203 + 2529589;
$three = $three - intval($three/ 4294967296) * 4294967296;

$rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
$four = $rslt * 213821 + 2529997;
$four = $four - intval($four/ 4294967296) * 4294967296;

$key[4] = intval($one/16777216);        
$key[3] = intval(($one - $key[4] * 16777216) / 65535);
$key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
$key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));

$key[8] = intval($two/16777216);     
$key[7] = intval(($two - $key[8] * 16777216) / 65535);
$key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
$key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));

$key[12] = intval($three/16777216);     
$key[11] = intval(($three - $key[12] * 16777216) / 65535);
$key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
$key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));

$key[16] = intval($four/16777216);     
$key[15] = intval(($four - $key[16] * 16777216) / 65535);
$key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
$key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));

$dst[1] = $dst[1] ^ $key[1];

$i=1;
while ($i<16){
    $i++;
    $dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
}

$i=0;
while ($i<16){
    $i++;
    if ($dst[$i] == 0) {
        $dst[$i] = 102;
    }
}

$encrypt = "0x";
$i=0;
while ($i<16){
    $i++;
    if ($dst[$i] < 16) {
        $encrypt = $encrypt . "0" . dechex($dst[$i]);
    } else {
        $encrypt = $encrypt . dechex($dst[$i]);
    }
}

return $encrypt;
}

数据库中的列是[password] [binary] (16) NOT NULL

查询是这样的:

$query = $this->db->prepare("INSERT INTO user_auth (account,password) VALUES (?, ?) ");
$query->bindValue(1, $accname);
$query->bindValue(2, $password);
try{
$query->execute(); 
.................

但它返回:不允许从数据类型varchar到二进制的隐式转换。当我使用mssql_query时,插入执行没有问题。已经尝试了CONVERT(binary),但数据无法从使用它们的程序中读取。还尝试将列更改为varchar,但ssame发生了。也许我对PDO声明做错了?

提前致谢。

0 个答案:

没有答案