2015-02-06 80 views
0

我試圖從我的數據庫執行SELECT,但出現錯誤,我不明白爲什麼。我只能說,這似乎是在prepare()聲明失敗。任何幫助,將不勝感激。錯誤「檢查與您的MySQL服務器版本對應的正確語法以使用附近的手冊」

$sQuery = "SELECT * FROM ? WHERE `email` = ? AND `password` = ?"; 
$sTypes = "sss"; 
$aParams = array("user", "[email protected]", "password"); 

以上是查詢和bind_param值。

function conn($sQuery, $sTypes=null, $aParams=null){ 
    $sMessage = ''; 
    $db = new mysqli('localhost','root','','myvyn') or die('unable to connect!'); 
    if($db->connect_errno){ 
     $message = $db->connect_error; 
    } else{ 
     $stmt = $db->stmt_init(); 
     if (!($stmt->prepare($sQuery))) { 
      var_dump("Prepare failed: (" . $stmt->errno . ") " . $stmt->error); 
     } 
     if($sTypes&&$aParams){ 
      $bindParams[] = $sTypes; 
      foreach($aParams as $param){ 
       $bindParams[] = $param; 
      } 
      call_user_func_array(array($stmt, 'bind_param'), $bindParams); 
     } 
     $stmt->execute(); 
     $oResult = $stmt->get_result(); 
     while($rows = $oResult->fetch_assoc()){ 
      $aRows[] = $rows; 
     } 
     $oResult->free(); 
     $db->close(); 
     return $aRows; 
    } 
} 

回答

1

不能使用參數表名,按here(我的粗體):

的標記只在SQL語句中某些地方是合法的。例如,它們可以在INSERT語句的VALUES()列表中(用於指定行的列值)或與WHERE子句中的列進行比較以指定比較值。

然而,他們不允許在由一個SELECT語句返回名稱的列,或如指定二元運算的兩個操作數的選擇列表標識符(如表或列名), =等號。後一種限制是必要的,因爲不可能確定參數類型。不允許通過比較標記與NULL嗎? IS NULL也是。通常,參數只在數據操縱語言(DML)語句中合法,而不在數據定義語言(DDL)語句中合法。

假設你控制表名(所以SQL注入是不可能的),你可以使用類似:

$sQuery = "SELECT * FROM $tblname WHERE `email` = ? AND `password` = ?"; 

,然後只綁定的電子郵件地址和密碼。

+0

如果它來自用戶輸入,應該在注入查詢之前檢查白名單中的$ tblName。 – halfer 2015-02-06 01:33:05

相關問題