似乎PDO與ISO 8601格式化的時間戳有問題。如何使用PDO綁定ISO8601 TSQL DATETIME參數?
我是從64位Ubuntu的連接使用16.04的Microsoft® ODBC Driver 13 (Preview) for SQL Server®
這裏是我的簡單的表運行PHP 7.0.8:
CREATE TABLE dtest (
"stamp" DATETIME
);
作品:
$pdoDB = new PDO('odbc:Driver=ODBC Driver 13 for SQL Server;
Server='.DATABASE_SERVER.';
Database='.DATABASE_NAME,
DATABASE_USERNAME,
DATABASE_PASSWORD
);
$pdoDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO dtest (stamp) VALUES ('2011-03-15T10:23:01')";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
不工作:
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:01'];
$stmt->execute($params);
Fatal error: Uncaught PDOException: SQLSTATE[22018]: Invalid character value for cast specification: 0 [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification (SQLExecute[0] at /build/php7.0-lPMnpS/php7.0-7.0.8/ext/pdo_odbc/odbc_stmt.c:260)
這工作如果我刪除了T
所以'2011-03-15T10:23:01'
成爲'2011-03-15 10:23:01'
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15 10:23:01'];
$stmt->execute($params);
但我正在寫在夜間運行在約2萬條記錄的腳本,所以我倒是真的而不忍心運行數百萬的開銷str_replace('T', ' ', $param)
我也試過用bindParam
,但是它給出了同樣的錯誤:
$sql = "INSERT INTO dtest (stamp) VALUES (:tdate)";
$stmt = $pdoDB->prepare($sql);
$date = '2011-03-15T10:23:01';
$stmt->bindParam(':tdate',$date,PDO::PARAM_STR);
$stmt->execute();
是否有無論如何綁定和執行這個參數?我有點疑惑的錯誤信息,因爲它似乎來自SQL Server,就好像PDO做得很好,但這沒有意義,因爲它能夠處理不帶參數化的類型轉換。
我也試過SQL轉換:
作品:
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:02', 126))";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
不起作用:
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, ?, 126))";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:02'];
$stmt->execute($params);
嗨,這有什麼好運? – MonkeyZeus
@MonkeyZeus nope,但我整個週末都休息了,所以今天我會再試一次。 –
祝你好運!讓我知道它是怎麼回事 – MonkeyZeus