2012-11-27 62 views
3

我一直在拉我的頭髮,試圖將我當前的腳本交換到PDO。我已經簡化了這個例子的MySQL查詢,但是這個版本仍然存在錯誤。42000執行預準備語句時查詢中的語法錯誤

$sql = 'SELECT * FROM :table WHERE lastUpdate > :appDate'; 

try{ 
    $db = connect(); 
    $stmt = $db->prepare($sql); 
    $stmt->bindParam(':table', $table); 
    $stmt->bindParam(':appDate', $appDate); 

    foreach($tablesToCheck as $table){ 
     $stmt->execute(); 
     $resultset[] = $stmt->fetchAll(); 
    } 
} catch(PDOException $e){ 
    print 'Error!: '.$e->getMessage().'<br/>'; 
}//End try catch 

$ stmt-> errorInfo中()返回:

([0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near ''GroupName' WHERE lastUpdate > NULL' at line 1) 
+4

的準備,你不能使用佔位符表或者列標識符聲明。 ':table'因此在那裏無效。 –

+1

相反,請檢查'$ table'的輸入值與列出的可接受值的列表,並將其連接到查詢中。 –

+0

我想我可以在foreach中使用try-catch,並在查詢中使用$ table。但是,謝謝,我不知道你不能使用桌子或柱子的佔位符 –

回答

1

下面是修改後的代碼與邁克爾的幫助:

foreach($tablesToCheck as $table){ 
    $sql = 'SELECT *, \''.$table.'\' AS tableName FROM '.$table.' WHERE lastUpdate > :appDate'; 

    try{ 
     $db = connect(); 
     $stmt = $db->prepare($sql); 
     $stmt->bindParam(':appDate', $appDate); 
     $stmt->execute(); 

     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
      $resultset[] = $row; 

    } catch(PDOException $e){ 
     print 'Error!: '.$e->getMessage().'<br/>'; 
    }//End try catch 
}//End foreach