我對此感到困惑了一段時間。這令人費解,因爲上面幾行非常相似的查詢可以正常工作。我對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