2017-08-03 66 views
1

我對此感到困惑了一段時間。這令人費解,因爲上面幾行非常相似的查詢可以正常工作。我對mysqli很陌生,所以可能會有一些非常基本的東西我缺少。 的連接建立這樣的:「功能名稱必須是一個字符串」上INSERT - mysqli PHP

Class dbObj{ 
     /* Database connection start */ 
     var $servername = "myserver"; 
     var $username = "myusername"; 
     var $password = "mypassword"; 
     var $dbname = "mydb"; 
     var $conn; 

     function getConnstring() { 
      $con = mysqli_connect($this->servername, $this->username, $this->password, $this->dbname) or die("Connection failed: " . mysqli_connect_error()); 

      /* check connection */ 
      if (mysqli_connect_errno()) { 
       printf("Connect failed: %s\n", mysqli_connect_error()); 
       exit(); 
      } else { 
       $this->conn = $con; 
      } 
      return $this->conn; 
     } 
    } 

然後,在Ajax處理的文件:

include_once({the connection file above}); 
$db = new dbObj(); 
$connString = $db->getConnstring(); 
$params = $_REQUEST; 
$action = isset($params['action']) != '' ? $params['action'] : ''; 
$NeedsCls = new Needs($connString); 

然後,一個叫做類中 「需要」:

protected $conn; 
    protected $data = array(); 
    function __construct($connString) 
    { 
     $this->conn = $connString; 
    } 
    function insertNeeds($params) 
    { 
     $ExpDate = $params[Expire]; 
     $sql = "INSERT INTO `pNeeds` (PubCode, Title, Description, Keywords, Expire) VALUES('".$_SESSION["PubCode"]."','".$params["Title"]."','".$params["Description"]."','".$params[NeedsTags]."','".$ExpDate."'); "; 
     echo $result = mysqli_query($this->conn, $sql) or die("Error - Failed inserting Needs data"); 
    $Record = $db->insert_id; 
    $KW = explode(';',$params[NeedsTags]); 
    $KWCount = count($KW); 
    for($x=0;$x<$KWCount;$x++) 
    { 
     $Keyword = $KW[$x]; 
     $sql = "INSERT INTO `Keywords` (Keyword, PubCode, Table, Record, Expire) VALUES ('".$Keyword."','".$_SESSION["PubCode"]."','pNeeds','".$Record."','".$ExpDate."'); "; 
     echo $result = mysqli_query($this->conn,$sql) or die("Error - Keywords not saved<br />".$mysqli_error()); 
    } 
    } 

第一查詢工作正常。第二個失敗,錯誤「函數名稱必須是字符串」。我已經驗證了進入Ajax代碼的數據是正確的。它似乎並沒有失去一些愚蠢的東西。 (着名的遺言)錯誤信息對我毫無意義。在這裏StackOverflow和其他地方的類似帖子似乎不屬於這種情況。

+0

確保,讓這個一通檢查在某一時刻SQL注入攻擊它發佈之前。我確信這只是早期的代碼,但爲了以防萬一,將這些用戶控制的參數直接連接到您的SQL中,您可以開放。 (使用準備好的語句/綁定參數代替。) – struthersneil

回答

2

看起來我們就可以抓取$ PARAMS錯誤:

$ExpDate = $params[Expire]; 
$params[NeedsTags]; 

應該是:

$ExpDate = $params['Expire']; 
$params['NeedsTags']; 

編輯

你實際的錯誤是:

$mysqli_error() 

取出$

編輯 RationalRabbit:爲了避免混淆的人,我應該提到的是,整個語法是錯誤的。採用面向對象mysqli的,錯誤的語法應該已經

db->error 

OR

mysqli($this->conn) 
+0

這是一個疏忽,因爲我通常會嘗試引用它們,但是有沒有一些原因會影響mysqli?另外,請注意,正如我所說,第一個查詢工作正常,所以看起來不是這樣的問題。 – RationalRabbit

+0

根本不涉及到MySqli,如果你想訪問一個數組中的變量,你需要使用帶引號的方括號。 –

+0

錯誤來自哪裏? –

相關問題