2012-06-26 29 views
5

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 ...

+0

'Duedate' chứa gì? –

+0

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' –

+0

Vâng, bạn đã thử dạng dài: '$ smt-> bindValue (': duedate' , $ duedate, PDO :: PARAM_INT); '? Hoặc, đúc '$ duedate = intval ($ duedate);'? – Wrikken

Trả lời

3

Cuối cùng giải quyết điều này bằng cách tải về và cài đặt cả sqlsrv php drivers (tôi đã sử dụng phiên bản 2.0) và SQL Server 2008 Native Client.

Với một chút tinh chỉnh đối với thông số $ dsn, phần còn lại của mã hoạt động như ma thuật - không cần ràng buộc, chuyển đổi hoặc truyền yêu cầu.

Tôi đã kết thúc chỉ bằng cách sử dụng php_pdo_sqlsrv_53_ts_vc9.dll, nhưng đảm bảo bạn chọn đúng phiên bản an toàn chủ đề/không an toàn của trình điều khiển, vì dll sai trong php.ini sẽ làm hỏng máy chủ của bạn.

1

Bạn đã thử strtotime chưa?

$phpdate = strtotime($duedate); 

Bạn cũng có thể thử sử dụng SQL's CONVERT trong bản Tuyên Bố của bạn

convert(datetime, :duedate, 100) 

Các kiểu dữ liệu trong SQL là datetime, có đúng không?

HOẶC thử:

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate'=>strtotime($duedate), 

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate"=>$duedate),"0000-00-00 00:00:00" 
+0

Yup. Lỗi tương tự. –

+0

Cho chúng tôi thấy $ duedate = – user1166147

+0

Tại thời điểm này, tôi đang sử dụng một chuỗi ký tự trong mảng: '$ input = array (': id' => 486, ': người vay' => 'JOHNSMITH', ': người cho vay' => 'KOPERW', ': duedate' => 'ngày 27 tháng 6 năm 2012', ': loaneragain' => 'KOPERW'); ' –

0

"COUNT trường không chính xác hoặc lỗi cú pháp" có thể xảy ra nếu bạn thiết lập truy vấn được tham số hóa nhưng sau đó không chuyển số tham số được yêu cầu trong danh sách tham số.

Mã của bạn có vẻ ổn ở mặt trận đó, tuy nhiên.

Các vấn đề liên quan