2017-08-03 67 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

错误来自哪里? –

相关问题