如何使用PHP的PDO库和准备好的查询插入MSSQL uniqueindex?

时间:2018-04-11 20:57:12

标签: php sql-server pdo

标题几乎说明了一切。请考虑下表:

CREATE TABLE foobar (
    [guid] UNIQUEIDENTIFIER NULL
);

以及以下代码段:

$stmt = $dbh->prepare("
    INSERT INTO foobar (
        [guid]
    ) VALUES (
        :guid
    )
");
$stmt->bindValue(':guid', '0x5E73EFFFFBE83864DD8A23D32A9AB226', PDO::PARAM_INT);
$stmt->execute();

它是一个字符串而不仅仅是一个纯整数的原因是因为它的生成方式;像这样:

/**
 * Generates a windows-style guid
 * Code here is adapted from http://guid.us/GUID/PHP
 */
function GUID() {
    if (function_exists('com_create_guid')) {
        return com_create_guid();
    } else{
        mt_srand((double)microtime()*10000); //optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $uuid = substr($charid, 0, 8)
               .substr($charid, 8, 4)
               .substr($charid,12, 4)
               .substr($charid,16, 4)
               .substr($charid,20,12);
        return "0x".$uuid;
    }
}

对SQL服务器进行概要分析表明该查询如下所示:

INSERT INTO foobar (
    [guid]
) VALUES (
    '0x5E73EFFFFBE83864DD8A23D32A9AB226'
)

此查询无法正常运行。

我正在努力弄清楚如何插入此值。我试图通过base_convert()将值转换为十进制,但是当我这样做时会出现精度损失。当然有一种更直接的方法可以插入这个值吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好的,所以当然写出问题可以提供解决方案。简而言之,我应该永远不会改变生成GUID的方法。应该做的是以下几点:

function GUID() {
    if (function_exists('com_create_guid')) {
        return com_create_guid();
    } else{
        mt_srand((double)microtime()*10000); //optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        return $uuid;
    }
}

然后,按如下方式更改插入查询:

INSERT INTO foobar (
    [guid]
) VALUES (
    CAST('{5E73EFFF-FBE8-3864-DD8A-23D32A9AB226}' AS UNIQUEIDENTIFIER)
)

我错误地认为这不适合投射。