致命的PHP错误绑定参数功能

时间:2014-06-12 15:39:59

标签: php sql

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

  

PHP致命错误:在第16行的c:/test.php中的非对象上调用成员函数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();
?>

3 个答案:

答案 0 :(得分:4)

我不认为您可以在查询的那一部分中使用绑定标记,如官方mysqli_prepare文档中所述:

  

标记仅在SQL语句的某些位置是合法的。对于   例如,它们被允许在INSERT语句的VALUES()列表中   (指定行的列值),或与a进行比较   WHERE子句中的列,用于指定比较值。

但我可能错了。

答案 1 :(得分:1)

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

根据MySQL 5.0 documentation,这些是可以“准备”的唯一陈述。

可悲的是,直到版本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

MySQL 5.0不支持其他语句。

答案 2 :(得分:0)

您无法在查询中执行此操作:

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

如官方MySQL documentation on LOAD DATA page中所述;强调我的:

  

文件名必须以文字字符串形式提供。在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行的绑定语句有两个值:

$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);