Tôi có kết nối pdo với ODBC (v2000.86.359.00) kết nối với cơ sở dữ liệu SQL Server (v8.00.2039 SP4 Standard Edition).Lỗi khi liên kết tham số ngày với câu lệnh đã chuẩn bị - Sử dụng PHP PDO/ODBC với SQL Server
này hoạt động:
$id = 486;
$duedate = 'June 27, 2012';
$query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);";
$noParams = $db->exec($query);
$db->query($query);
Nhưng nếu tôi cố gắng sử dụng một tuyên bố chuẩn bị như thế này:
$sql = 'INSERT into AssetHistory
(AssetID, DateDue)
Values(:id, :duedate);';
$input = array(':id'=>486, ':duedate'=>'June 27, 2012');
$smt = $db->prepare($sql);
$smt->execute($input);
tôi nhận được lỗi này (từ $ smt-> errorInfo()):
"[Microsoft][ODBC Driver Manager] Function sequence error (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)"
Tôi đã thử: 1) Kèm theo: duedate trong dấu nháy đơn 2) Ràng buộc ngày để unix timestamp nguyên 3) Binding: DUEDATE để đối tượng php DateTime 4) Chèn chỉ $ DUEDATE vào câu lệnh SQL trước khi chuẩn bị
Tại thời điểm này tôi có thể bị mắc kẹt bằng cách sử dụng $ db-> Phương pháp truy vấn và vệ sinh đầu vào tốt nhất có thể, nhưng tôi thực sự sẽ đánh giá cao bất kỳ đề xuất nào.
Sử dụng PHP 5.38 trên hộp Windows Server 2003.
Cập nhật: Tôi đã xóa một số biến từ phiên bản trước của câu hỏi này. Thông báo lỗi đã thay đổi, nhưng kết quả cuối cùng là như nhau.
Tôi cũng đã thử bằng tay gắn kết các thông số như sau:
$smt->bindValue(':id', 486, PDO::PARAM_INT);
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR);
Cùng với việc thêm chức năng chuyển đổi sang sql như vậy:
$sql = 'INSERT into AssetHistory
(AssetID, DateDue)
Values(:id, convert(datetime,:duedate, 100));';
nào trả về: "COUNT lĩnh vực không chính xác hoặc lỗi cú pháp "
Và tôi đã nhận thấy rằng SQL Server không thực sự là play nice với dấu thời gian unix ...
'Duedate' chứa gì? –
Chuỗi có ngày được định dạng - Tôi đã thử 'ngày 27 tháng 6 năm 2012' và '2012-06-27 00: 00.000' –
Vâng, bạn đã thử dạng dài: '$ smt-> bindValue (': duedate' , $ duedate, PDO :: PARAM_INT); '? Hoặc, đúc '$ duedate = intval ($ duedate);'? – Wrikken