2017-08-28 65 views
0

下面的PHP代碼,這是使用sqlite3的DataTables.net服務器端處理的一個子集總是產生錯誤Unable to execute statement: datatype mismatch無法執行的語句:數據類型不匹配

// Handle Server Side ajax request from DataTables in browser 

// init database 
$db = new SQLite3('appname.SQLite3.db'); 

// parse request parameters 
$start = (int) $_GET['start']; 
$length = (int) $_GET['length']; 

// Prepare statement 
$sql = " 
    SELECT 
     personId, personName 
    FROM person 
    LIMIT :start, :length 
"; 
$stmt = $db->prepare($sql); 
$stmt->bindParam(':start', $start); 
$stmt->bindParam(':length', $length); 

// execute statement 
$result = $stmt->execute(); 
$response['data'] = []; 
while ($row = $result->fetchArray(SQLITE3_NUM)) { 
    $response['data'][] = $row; 
} 

// use same prepared statement to count not paged number of records 
$start = 0; 
$length = PHP_INT_MAX; 
$result = $stmt->execute(); // <---- fails here with datatype mismatch error ------- 
$recordsTotal = 0; 
while ($result->fetchArray(SQLITE3_NUM)) { 
    $recordsTotal++; 
} 

$response['draw'] = (int) $_GET['draw']; // used by DataTables to synchronize request and reply 
$response['recordsTotal'] = $recordsTotal; 
header('Content-Type: application/json'); 
echo json_encode($rsp); 

exit; 

有關DataTables.net服務器端處理的更多信息,請參閱 https://datatables.net/manual/server-side

回答

0

SQLite3Stmt::reset在兩個execute()調用之間是必需的。

public bool SQLite3Stmt::reset (void)

復位準備語句到其狀態之前執行。所有綁定在重置後保持不變。

$stmt = $db->prepare($sql); 
$stmt->bindParam(':start', $start); 
$stmt->bindParam(':length', $length); 
$rslt = $stmt->execute(); 
// ... 

$recordsTotal = 0; 
$start = 1; 
$length = PHP_INT_MAX; 
$stmt->reset(); // was missing statement 
$rslt = $stmt->execute(); // no error any more