2016-04-03 66 views
-1

我有这样的错误:PHP bind_param不工作中的mysqli

Call to a member function bind_param() on a non-object in /home/ccraft50/public_html/C-Blog/InsertDataPosts.php on line 15


<?php 
$servername2 = "localhost"; 
$username2 = "My DB"; 
$password2 = "My Pass"; 
$dbname2 = "My DB"; 
// Create connection 
$dbconn2 = new mysqli($servername2, $username2, $password2, $dbname2); 
// Check connection 
if ($dbconn2->connect_error) { 
    die("Connection failed: " . $dbconn2->connect_error); 
} 
$insIndexData = $dbconn2->prepare("INSERT INTO " . str_replace(str_split('\\/:*?"<>|.$+-%#@!~&;\',=~` '), "_", $_POST['filename']) . "_Index (SubjectName, IndexData) VALUES (?, ?)"); 

$str_prot_index = array('<script>', '</script>', '<?php', '?>', '<html', '</html>', '<body', '</body>', '<head', '</head>', '<pre', '</pre>', '<div', '</div>'); 
$insIndexData->bind_param('ss', $_POST['filename'], str_replace($str_prot_index, '', $_POST['comment'])); 
$insIndexData->execute(); 
$insIndexData->close(); 

if($dbconn2->prepare($insIndexData)) { 
     echo "Successfuly Insert data for index!"; 
} else { 
    echo "Error: " . $dbconn2->error; 
} 

$dbconn2->close(); 
?> 
+0

我猜你的查询失败了;回声它看看它是什么样子 - 你正在做很多处理,以确保表名是正确的,我怀疑有什么问题。 – andrewsi

+0

$ insIndexData? – CharlesCraft50

+0

如果你真的必须这样(我怀疑它,请参阅下面的答案),你应该使用白名单,而不是黑名单字符为您的表名称;试图访问系统的黑客可能会想到比黑名单更多的字符。 – jeroen

回答

3

您正在使用数据库错误的方式。

一个数据库必须包含表格,每个表格包含多个行。虽然你显然想为每个文件创建一个不同的表格。相反,您必须将所有文件存储在一张表中,并将文件名作为字段添加,而不是表名。

$stmt = $dbconn2->prepare("INSERT INTO files (SubjectName, IndexData) VALUES (?, ?)"); 
$stmt->bind_param('ss', $_POST['filename'], $_POST['comment']); 
$stmt->execute(); 
echo "Successfuly Insert data for index!"; 

请注意,第二次准备相同查询的代码的第二部分是没有意义的。为了测试插件是否成功与否,你必须之前new mysqli(添加此行

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

如果插入失败会抛出一个错误。

+0

为什么有3个问号? – CharlesCraft50

+0

这只是一个错字 –

+0

非常感谢帮助我! :) – CharlesCraft50

-1

你准备失败。尝试添加一些测试以确保其准备正确。在您之后->prepare

if($insIndexData !== false) 
{ 
    etc... 
+0

这种代码没有意义。 **它不会**使此代码工作 –

+0

当准备失败时,它会返回一个“false”。所以是的,如果这是问题,它可以工作。在继续之前,我总是测试准备在我的代码中的返回。 – Torchify

+2

错误必须不被“解决”。他们必须被透露和**固定。** –