【发布时间】:2020-08-04 14:38:22
【问题描述】:
这里我用的是sqlsrv:
$conn = sqlsrv_connect("192.168.1.102,1433", array("Database"=>"RF_User", "UID"=>"rfo-gcp", "PWD" => ""));
$tsql = "SELECT birthdate FROM tbl_rfaccount WHERE id = ?";
$stmt = sqlsrv_query($conn, $tsql, array("test"));
$result = sqlsrv_fetch_array($stmt);
var_dump($result);
结果:array(2) { [0]=> object(DateTime)#1 (3) { ["date"]=> string(26) "2020-04-19 20:40:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["birthdate"]=> object(DateTime)#1 (3) { ["date"]=> string(26) "2020-04-19 20:40:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } }
这里我用的是PDO:
$conn = new PDO("sqlsrv:Server=192.168.1.102,1433; Database=RF_User;", "rfo-gcp", "");
$tsql = "SELECT birthdate FROM tbl_rfaccount WHERE id = cast(? as varchar(13))";
$stmt = $conn->prepare($tsql);
$stmt->execute(array("test"));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($result);
结果:array(1) { ["birthdate"]=> string(19) "2020-04-19 20:40:00" }
如果您注意到,我必须在 PDO 代码上使用 cast(? as varchar(13))。没有它不会返回任何行。在sqlsrv 上,我不必使用CAST() 函数。为什么是这样?另外,数据库上的id 列是BINARY(13),那么为什么我必须将id 转换为varchar 而不是binary(也可以使用二进制转换没有找到该行)?
【问题讨论】:
-
您应该将其转换为绑定数组,而不是转换占位符。
-
@JayBlanchard 怎么样?这是我的理解,但可能不是你的意思:
$stmt->execute(array("cast('test' as varchar(13))")); -
?是一个占位符,而不是一个值,因此您将强制转换占位符是没有意义的。但是将值转换为列类型 (VARCHAR) 根本没有意义,因为该值是数字、字符串或布尔值。在这种情况下,值text只是一个字符串。如果您不执行此转换,您会得到什么错误?id的列类型是什么,test是否适合该列和类型? -
@JayBlanchard 列类型为
BINARY(13)(旧数据库,无法更改)。如果我不执行转换没有错误,它只是没有找到应该的记录。 -
如果列类型是二进制,那么为什么要尝试从该列中选择文本值?我认为这就是断开连接的地方。
标签: php sql-server pdo binary sqlsrv