绑定参数函数时出现致命PHP错误

绑定参数函数时出现致命PHP错误,php,sql,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'); /

我正在运行此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();
?>

您不能在查询中执行此操作:

$load_query = "LOAD DATA INFILE ? INTO TABLE…"
如官方声明所述;重点地雷:

文件名必须以文本字符串形式提供。在Windows上,指定 路径名称中的反斜杠为正斜杠或双反斜杠。
character\u set\u 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);

您不能在查询中执行此操作:

$load_query = "LOAD DATA INFILE ? INTO TABLE…"
如官方声明所述;重点地雷:

文件名必须以文本字符串形式提供。在Windows上,指定 路径名称中的反斜杠为正斜杠或双反斜杠。
character\u set\u 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);

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

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


但是我可能错了。

我认为您不能像官方文档中所解释的那样在查询的这一部分使用绑定标记:

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


但我可能错了。

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

根据调查,这些是唯一可以“准备”的陈述

遗憾的是,在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
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE
从MySQL 5.0.23开始,支持以下附加语句:

{CREATE | DROP} VIEW
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

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
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE
从MySQL 5.0.23开始,支持以下附加语句:

{CREATE | DROP} VIEW
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

MySQL 5.0不支持其他语句。

可能是复制粘贴错误。我已经解决了。您是否尝试过
var\u dump($load\u stmt)
查看您得到了什么?正如错误消息所说,
$load\u stmt
不是一个对象。SQL查询中可能有错误。可能是复制粘贴错误。我已经解决了。您是否尝试过
var\u dump($load\u stmt)
查看您得到了什么?正如错误消息所说,
$load\u stmt
不是一个对象。您的SQL查询中可能有错误。不可能,因为它说$load_stmt不是对象。。不管有多少个参数。抱歉,下面是完整的语句:$load\U query=“load DATA INFILE”?进入以“\”结尾的表cdr字段“,”由“\”括起“\”,以“\\n”结尾的行SET filename=?";@看看我的答案。问题是使用
加载数据时无法参数化文件的名称/路径。您需要将其设置为普通字符串。不,不会,因为它表明$load_stmt不是对象。。不管有多少个参数。抱歉,下面是完整的语句:$load\U query=“load DATA INFILE”?进入以“\”结尾的表cdr字段“,”由“\”括起“\”,以“\\n”结尾的行SET filename=?";@看看我的答案。问题是使用
加载数据时无法参数化文件的名称/路径。您需要将其设置为普通字符串。正确<代码>加载数据
需要将文件名设置为文字字符串。请查看我的答案,查看解释这一点的官方文档页。@JakeGould感谢您的确认,我不是100%确定。正确<代码>加载数据
需要将文件名设置为文字字符串。请查看我的答案,查看解释这一点的官方文档页。@JakeGould感谢您的确认,我不是100%确定。