2014-03-07 34 views
-2

我試了幾個小時纔得到這個工作。PDO PHP MYSQL混合命名和位置參數

<?php 

require_once('inc.connect.php'); 

if($_SERVER['REQUEST_METHOD'] == 'GET') 
{ 
    if(isset($_REQUEST)) 
    { 
     $type = array_keys($_REQUEST)[0]; 
     $value = $_REQUEST[$type]; 
     if($value === null) 
     { 
      $where_like = null; 
     } 
     else 
     { 
      $where_like = ' WHERE ' . $type . '_name LIKE ?'; 
     } 

     $db = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DBNAME . ';charset=UTF8', MYSQL_USERNAME, MYSQL_PASSWORD); 
     $sql_statement = 'SELECT :' . $type . '_id, :' . $type . '_name FROM report_' . $type . $where_like; 

     $sql_prepare = $db->prepare($sql_statement); 

     if(!(is_null($where_like))) $sql_prepare->bindValue(1, '"%' . $value . '%"', PDO::PARAM_STR); 

     try{ 

      while($sql_result = $sql_prepare->execute()) 
      { 
       $return[$sql_result[$type . '_id']] = $sql_result[$type . '_name']; 
      } 

      $return_JSON = json_encode($return); 
     } 
     catch(PDOException $exception){ 

      return $exception->getMessage(); 
     } 
     echo "exception: ".$exception; 
    } 
} 

我不斷收到這...

警告:PDOStatement對象::執行():SQLSTATE [HY093]:無效的參數號:混合命名和位置參數

+2

預處理語句不習慣這樣。使用預定義的查詢,不要在運行時生成它。查找一個教程並重寫你的整個代碼。 –

+0

爲什麼不呢?我知道他們通常不是這樣使用的,但我沒有看到動態創建查詢的任何錯誤。 –

+2

如果沒有問題,爲什麼它不起作用?最好使用預定義的查詢。正如您現在所看到的那樣,調試清楚,可以理解並且不會帶來任何麻煩。 –

回答

1

有一件事我喜歡有一份穩定的工作是我不再擔心我的stackoverflow職位看起來像潛在的僱主。本着這種精神,你的常識juergen d可以「散步」,因爲這樣不合作的「so-and-sos」。

這是jQueryUI autocomplete({source})選項所請求的AJAX響應。

這裏是我完成的,工作代碼...

<?php 

require_once('inc.connect.php'); 

if($_SERVER['REQUEST_METHOD'] == 'GET') 
{ 
    if(isset($_REQUEST)) 
    { 
     $type = array_keys($_REQUEST)[0]; 

     if(in_array($type, ['category', 'sub_category', 'names', 'report_searches', 'report_favs'])) 
     { 
      $value = $_REQUEST[$type]; 
      $id  = $type . '_id'; 
      $name = $type . '_name'; 
      $table = 'research_' . $type; 
      $where = $name; 
      $like = '%' . $value . '%'; 

      $value === null ? $where_like = null : $where_like = ' WHERE ' . $where . ' LIKE ?'; 

      $sql_db = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DBNAME . ';charset=UTF8', MYSQL_USERNAME, MYSQL_PASSWORD); 
      $sql_statement = 'SELECT ' . $id . ', ' . $name . ' FROM ' . $table . $where_like; 
      $sql_prepare = $sql_db->prepare($sql_statement); 

      if(!($value === null)) $sql_prepare->bindParam(1, $like); 

      try{ 
       if($sql_prepare->execute()) 
       { 
        while($sql_result = $sql_prepare->fetch(PDO::FETCH_ASSOC)) 
        { 
         $return[$sql_result[$id]] = $sql_result[$name]; 
        } 

        echo json_encode($return); 
       } 
      } 
      catch(PDOException $e) 
      { 
       echo $e->getMessage(); 
      } 
     } 
    } 
}