我对此感到困惑了一段时间。这令人费解,因为上面几行非常相似的查询可以正常工作。我对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和其他地方的类似帖子似乎不属于这种情况。
确保,让这个一通检查在某一时刻SQL注入攻击它发布之前。我确信这只是早期的代码,但为了以防万一,将这些用户控制的参数直接连接到您的SQL中,您可以开放。 (使用准备好的语句/绑定参数代替。) – struthersneil