首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >致命PHP错误绑定参数函数

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

Stack Overflow用户
提问于 2014-06-12 15:39:58
回答 3查看 65关注 0票数 0

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

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

第16行是:

代码语言:javascript
复制
$load_stmt->bind_param('ss', $filetobeloaded, $filetobeloaded);

有人能告诉我这句话有什么问题吗?

完整脚本:

代码语言:javascript
复制
<?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();
?>
EN

回答 3

Stack Overflow用户

发布于 2014-06-12 15:49:56

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

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

但我可能错了。

票数 4
EN

Stack Overflow用户

发布于 2014-06-12 16:09:38

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

根据MySQL 5.0文档的说法,这是唯一可以“准备”的语句。

遗憾的是,在6+版本不常见之前,它不会有太大的变化。

从手册上拿来的。

以下SQL语句可用于准备好的语句:

代码语言:javascript
复制
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开始,支持下列附加语句:

代码语言:javascript
复制
{CREATE | DROP} VIEW

在MySQL 5.0.23中,支持下列附加语句:

代码语言:javascript
复制
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

MySQL 5.0中不支持其他语句。

票数 1
EN

Stack Overflow用户

发布于 2014-06-12 15:42:44

您不能在查询中这样做:

代码语言:javascript
复制
$load_query = "LOAD DATA INFILE ? INTO TABLE…"

正如官方的MySQL 页面中所解释的;强调我的观点:

文件名必须指定为文字字符串。在中指定路径名称中的反斜杠为正斜杠或双反斜杠。character_set_filesystem系统变量控制文件名的解释。

因此,您应该将该声明更改为:

代码语言:javascript
复制
$load_query = "LOAD DATA INFILE $filetobeloaded INTO TABLE cdr FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\n' ( @col_1, @col_2 )";

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

代码语言:javascript
复制
$load_stmt->bind_param('ss', $filetobeloaded, $filetobeloaded);

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

代码语言:javascript
复制
$load_query = "LOAD DATA INFILE ? INTO TABLE cdr FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\n' ( @col_1, @col_2 )";

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

代码语言:javascript
复制
$load_stmt->bind_param('s', $filetobeloaded);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24188505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档