致命的PHP错误绑定参数函数


Fatal PHP error bind paramater function

我正在运行这个PHP脚本,但我得到以下错误:

PHP致命错误:在c:/test.php第16行非对象上调用成员函数bind_param()

第16行是:

$load_stmt->bind_param('ss', $filetobeloaded, $filetobeloaded);
谁能告诉我这句话有什么问题?

完整脚本:

<?php
$mysqli = new mysqli('localhost', 'root', 'password', 'orangevalleedb');
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s'n", mysqli_connect_error());
    exit();
}
$file_query = "select filename from cdr";
$load_query = "LOAD DATA INFILE ? INTO TABLE cdr FIELDS TERMINATED BY ',' ENCLOSED BY ''"' LINES TERMINATED BY '''n' ( @col_1, @col_2 )";
$file_stmt = $mysqli->prepare($file_query);
$file_stmt->execute();
$file_stmt->bind_result($filetobeloaded);
$load_stmt = $mysqli->prepare($load_query);
$load_stmt->bind_param('ss', $filetobeloaded, $filetobeloaded);
/* execute prepared statement */
while($file_stmt->fetch()) {
    $load_stmt->execute();
}
/* close statement and connection */
$load_stmt->close();
$file_stmt->close();
/* close connection */
$mysqli->close();
?>

我不认为您可以在mysqli_prepare官方文档中解释的那部分查询中有绑定标记:

标记仅在SQL语句中的某些地方是合法的。为例如,它们在INSERT语句的VALUES()列表中是允许的(为一行指定列值),或者与在WHERE子句中指定比较值。

这是有用的信息,而不是答案。

根据MySQL 5.0文档,这些是唯一可以"准备"的语句。

遗憾的是,直到版本6+才改变太多,而版本6+并不常见。

摘自手册

下列SQL语句可用于预处理语句:

ALTER TABLE
CALL
COMMIT
{CREATE | DROP} INDEX
{CREATE | DROP} TABLE
DELETE
DO
INSERT
RENAME TABLE
REPLACE
SELECT
SET
SHOW (most variants)
TRUNCATE TABLE
UPDATE

从MySQL 5.0.15开始,支持以下附加语句:

{CREATE | DROP} VIEW

从MySQL 5.0.23开始,支持以下附加语句:

ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

你不能在你的查询中这样做:

$load_query = "LOAD DATA INFILE ? INTO TABLE…"

LOAD DATA页的官方MySQL文档中解释;我特别强调:

文件名必须作为字面值字符串给出。在Windows上,指定路径名中的反斜杠作为正斜杠或双反斜杠。character_set_filesystem系统变量控制文件名的解释。

所以你应该把语句改成:

$load_query = "LOAD DATA INFILE $filetobeloaded INTO TABLE cdr FIELDS TERMINATED BY ',' ENCLOSED BY ''"' LINES TERMINATED BY '''n' ( @col_1, @col_2 )";

此外,第16行的bind语句有两个值:

$load_stmt->bind_param('ss', $filetobeloaded, $filetobeloaded);

但是被绑定的查询字符串只有一个?:

$load_query = "LOAD DATA INFILE ? INTO TABLE cdr FIELDS TERMINATED BY ',' ENCLOSED BY ''"' LINES TERMINATED BY '''n' ( @col_1, @col_2 )";

不清楚为什么在bind_param中有两个值,所以也许只是将其设置为一个参数就可以了:

$load_stmt->bind_param('s', $filetobeloaded);